14 ответов:
использовать
changeсобытия на входах для обновления состояния компонента и доступа к нему вhandleLogin:handleEmailChange: function(e) { this.setState({email: e.target.value}); }, handlePasswordChange: function(e) { this.setState({password: e.target.value}); }, render : function() { return ( <form> <input type="text" name="email" placeholder="Email" value={this.state.email} onChange={this.handleEmailChange} /> <input type="password" name="password" placeholder="Password" value={this.state.password} onChange={this.handlePasswordChange}/> <button type="button" onClick={this.handleLogin}>Login</button> </form>); }, handleLogin: function() { console.log("EMail: " + this.state.email); console.log("Password: " + this.state.password); }рабочая скрипка:http://jsfiddle.net/kTu3a/
кроме того, прочитайте документы, есть целый раздел, посвященный обработке форм:http://facebook.github.io/react/docs/forms.html
ранее вы также могли использовать двусторонний помощник по привязке данных React для достижения того же самого, но теперь он устарел в пользу установки значения и обработчика изменений (как указано выше):
var ExampleForm = React.createClass({ mixins: [React.addons.LinkedStateMixin], getInitialState: function() { return {email: '', password: ''}; }, handleLogin: function() { console.log("EMail: " + this.state.email); console.log("Password: " + this.state.password); }, render: function() { return ( <form> <input type="text" valueLink={this.linkState('email')} /> <input type="password" valueLink={this.linkState('password')} /> <button type="button" onClick={this.handleLogin}>Login</button> </form> ); } });документация здесь:http://facebook.github.io/react/docs/two-way-binding-helpers.html
альтернативный подход заключается в использовании
refатрибут и ссылки на значения сthis.refs. Вот простой пример:render: function() { return (<form onSubmit={this.submitForm}> <input ref="theInput" /> </form>); }, submitForm: function(e) { e.preventDefault(); alert(React.findDOMNode(this.refs.theInput).value); }дополнительную информацию можно найти в документах React: https://facebook.github.io/react/docs/more-about-refs.html#the-ref-string-attribute
по многим причинам, описанным в как использовать переключатели в React? этот подход не всегда является лучшим, но он представляет собой полезную альтернативу в некоторых простой случай.
есть несколько способов сделать это:
1) получить значения из массива элементов формы по индексу
handleSubmit = (event) => { event.preventDefault(); console.log(event.target[0].value) }2) с помощью имя атрибут в html
handleSubmit = (event) => { event.preventDefault(); console.log(event.target.elements.username.value) // from elements property console.log(event.target.username.value) // or directly } <input type="text" name="username"/>3) используя ссылки
handleSubmit = (event) => { console.log(this.inputNode.value) } <input type="text" name="username" ref={node => (this.inputNode = node)}/>полный пример
class NameForm extends React.Component { handleSubmit = (event) => { event.preventDefault() console.log(event.target[0].value) console.log(event.target.elements.username.value) console.log(event.target.username.value) console.log(this.inputNode.value) } render() { return ( <form onSubmit={this.handleSubmit}> <label> Name: <input type="text" name="username" ref={node => (this.inputNode = node)} /> </label> <button type="submit">Submit</button> </form> ) } }
простой способ справиться с refs:
class UserInfo extends React.Component { constructor(props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); } handleSubmit(e) { e.preventDefault(); const formData = {}; for (const field in this.refs) { formData[field] = this.refs[field].value; } console.log('-->', formData); } render() { return ( <div> <form onSubmit={this.handleSubmit}> <input ref="phone" className="phone" type='tel' name="phone"/> <input ref="email" className="email" type='tel' name="email"/> <input type="submit" value="Submit"/> </form> </div> ); } } export default UserInfo;
Я бы предложил следующий подход:
import {Autobind} from 'es-decorators'; export class Form extends Component { @Autobind handleChange(e) { this.setState({[e.target.name]: e.target.value}); } @Autobind add(e) { e.preventDefault(); this.collection.add(this.state); this.refs.form.reset(); } shouldComponentUpdate() { return false; } render() { return ( <form onSubmit={this.add} ref="form"> <input type="text" name="desination" onChange={this.handleChange}/> <input type="date" name="startDate" onChange={this.handleChange}/> <input type="date" name="endDate" onChange={this.handleChange}/> <textarea name="description" onChange={this.handleChange}/> <button type="submit">Add</button> </form> ) } }
вы можете включить
onClickобработчик событий на кнопке кonSubmitпроводник в форме:render : function() { return ( <form onSubmit={this.handleLogin}> <input type="text" name="email" placeholder="Email" /> <input type="password" name="password" placeholder="Password" /> <button type="submit">Login</button> </form> ); },тогда вы можете использовать
FormDataчтобы проанализировать форму (и построить объект JSON из его записей, Если вы хотите).handleLogin: function(e) { const formData = new FormData(e.target) const user = {} e.preventDefault() for (let entry of formData.entries()) { user[entry[0]] = entry[1] } // Do what you will with the user object here }
Если вы используете Redux в своем проекте, вы можете рассмотреть возможность использования этого компонента более высокого порядкаhttps://github.com/erikras/redux-form.
дайте ваши входы ref, как это
<input type="text" name="email" placeholder="Email" ref="email" /> <input type="password" name="password" placeholder="Password" ref="password" />тогда вы можете получить доступ к нему в вашем handleLogin, как Су
handleLogin: function(e) { e.preventDefault(); console.log(this.refs.email.value) console.log(this.refs.password.value) }
Если все ваши входы / textarea имеют имя, то вы можете отфильтровать все из события.цель:
onSubmit(event){ const fields = Array.prototype.slice.call(event.target) .filter(el => el.name) .reduce((form, el) => ({ ...form, [el.name]: el.value, }), {}) }совершенно неконтролируемой форме, без метода onChange, после чего, значение, свойство DefaultValue...
во многих событиях в javascript, у нас есть
eventкоторые дают объект, включая то, что произошло событие и каковы значения и т. д...Это то, что мы используем с формами в ReactJs, а также...
таким образом, в вашем коде вы устанавливаете состояние на новое значение... что-то вроде этого:
class UserInfo extends React.Component { constructor(props) { super(props); this.handleLogin = this.handleLogin.bind(this); } handleLogin(e) { e.preventDefault(); for (const field in this.refs) { this.setState({this.refs[field]: this.refs[field].value}); } } render() { return ( <div> <form onSubmit={this.handleLogin}> <input ref="email" type="text" name="email" placeholder="Email" /> <input ref="password" type="password" name="password" placeholder="Password" /> <button type="button">Login</button> </form> </div> ); } } export default UserInfo;также это пример формы в React V. 16, так же как ссылка на форму, которую вы создаете в будущем:
class NameForm extends React.Component { constructor(props) { super(props); this.state = {value: ''}; this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } handleChange(event) { this.setState({value: event.target.value}); } handleSubmit(event) { alert('A name was submitted: ' + this.state.value); event.preventDefault(); } render() { return ( <form onSubmit={this.handleSubmit}> <label> Name: <input type="text" value={this.state.value} onChange={this.handleChange} /> </label> <input type="submit" value="Submit" /> </form> ); } }
кроме того, это тоже можно использовать.
handleChange: function(state,e) { this.setState({[state]: e.target.value}); }, render : function() { return ( <form> <input type="text" name="email" placeholder="Email" value={this.state.email} onChange={this.handleChange.bind(this, 'email')} /> <input type="password" name="password" placeholder="Password" value={this.state.password} onChange={this.handleChange.bind(this, 'password')}/> <button type="button" onClick={this.handleLogin}>Login</button> </form> ); }, handleLogin: function() { console.log("EMail: ", this.state.email); console.log("Password: ", this.state.password); }
onChange(event){ console.log(event.target.value); } handleSubmit(event){ event.preventDefault(); const formData = {}; for (const data in this.refs) { formData[data] = this.refs[data].value; } console.log(formData); } <form onSubmit={this.handleSubmit.bind(this)}> <input type="text" ref="username" onChange={this.onChange} className="form-control"/> <input type="text" ref="password" onChange={this.onChange} className="form-control"/> <button type="submit" className="btn-danger btn-sm">Search</button> </form>
Это может помочь пользователям Meteor (v1.3):
render: function() { return ( <form onSubmit={this.submitForm.bind(this)}> <input type="text" ref="email" placeholder="Email" /> <input type="password" ref="password" placeholder="Password" /> <button type="submit">Login</button> </form> ); }, submitForm: function(e) { e.preventDefault(); console.log( this.refs.email.value ); console.log( this.refs.password.value ); }
чтобы улучшить пользовательский интерфейс; когда пользователь нажимает на кнопку Отправить, вы можете попытаться получить форму, чтобы сначала показать сообщение отправки. Как только мы получим ответ от сервера, он может соответствующим образом обновить сообщение. Мы достигаем этого в React, цепляя статусы. Смотрите codepen или фрагментов ниже:
следующий метод делает первое изменение состояния:
handleSubmit(e) { e.preventDefault(); this.setState({ message: 'Sending...' }, this.sendFormData); }как только реакция показывает вышеуказанное отправляя сообщение на экране, она вызовет метод, который будет отправлять данные формы на сервер: это.sendFormData (). Для простоты я добавил setTimeout, чтобы имитировать это.
sendFormData() { var formData = { Title: this.refs.Title.value, Author: this.refs.Author.value, Genre: this.refs.Genre.value, YearReleased: this.refs.YearReleased.value}; setTimeout(() => { console.log(formData); this.setState({ message: 'data sent!' }); }, 3000); }в React, метод этот.setState () отображает компонент с новыми свойствами. Таким образом, вы также можете добавить некоторую логику в метод render() компонента формы, который будет вести себя по-разному в зависимости от типа ответа, который мы получаем от сервера. Например:
render() { if (this.state.responseType) { var classString = 'alert alert-' + this.state.type; var status = <div id="status" className={classString} ref="status"> {this.state.message} </div>; } return ( ...
Comments