React的本质是将JavaScript的数据层与HTML的视图层进行高度绑定,当视图层的数据更新,与其绑定的JavaScript数据层即会立刻收到反馈。因此,对于React来说,不是通过JavaScript去获取指定表单元素的值,而是直接从指定React表单元素的state属性中获取即可。同样,想要对视图层去更新,不是通过JavaScript去直接选择元素来更新,而是通过在数据层,对相关state属性进行更新,从而视图层自动实现相应渲染;不过要注意,别直接修改state属性,而是要用setState()方法去更新数据层。
如上所述,在React中获取表单数据,不是用JavaScript直接去拿,而是从React表单元素的state状态属性中去获取。具体代码如下所示:
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('提交的名字: ' + this.state.value); event.preventDefault(); } render() { return ( <form onSubmit={this.handleSubmit}> <label> 名字: <input type="text" value={this.state.value} onChange={this.handleChange} /> </label> <input type="submit" value="提交" /> </form> ); } } ReactDOM.render( <NameForm />, document.getElementById('root') );
在上述示例中,每次表单数据变化都会有一个相应的事件回调函数,在这个函数中,若想对视图层进行更新,则需要使用setState()
方法,而不是直接修改state状态;如下所示,通过内置的toUpperCase()
方法将用户的每次输入都自动转换为大写:
handleChange(event) { this.setState({value: event.target.value.toUpperCase()}); }
React中,textarea文本框元素的内容,由value属性决定;下例中,在初始化构造器中,对value进行了默认值设置,因此文本框会存在默认初值。
class EssayForm 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('提交的文章: ' + this.state.value); event.preventDefault(); } render() { return ( <form onSubmit={this.handleSubmit}> <label> 文章: <textarea value={this.state.value} onChange={this.handleChange} /> </label> <input type="submit" value="提交" /> </form> ); } } ReactDOM.render( <EssayForm />, document.getElementById('root') );
在传统HTML中实现下拉列表select元素,如下所示:
<select> <option value="grapefruit">葡萄柚</option> <option value="lime">柠檬</option> <option selected value="coconut">椰子</option> <option value="mango">芒果</option> </select>
而React中的select元素若想设置选中了某个选项,则是基于select元素的value属性,而不需要在option元素上设置selected属性。
class FlavorForm extends React.Component { constructor(props) { super(props); this.state = {value: 'coconut'}; this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } handleChange(event) { this.setState({value: event.target.value}); } handleSubmit(event) { alert('你喜欢的风味是: ' + this.state.value); event.preventDefault(); } render() { return ( <form onSubmit={this.handleSubmit}> <label> 选择你喜欢的风味: <select value={this.state.value} onChange={this.handleChange}> <option value="grapefruit">葡萄柚</option> <option value="lime">柠檬</option> <option value="coconut">椰子</option> <option value="mango">芒果</option> </select> </label> <input type="submit" value="提交" /> </form> ); } } ReactDOM.render( <FlavorForm />, document.getElementById('root') );