React -- 表单

来源:互联网 发布:形容女人的网络词汇 编辑:程序博客网 时间:2024/05/16 05:03

牢记:在React中,一切数据都是状态。

应用表单组件

1、文本框 input&textarea

mport React, { Component } from 'react';class App extends Component {    constructor(props) {        super(props);        this.handleInputChange = this.handleInputChange.bind(this);        this.handleTextareaChange = this.handleTextareaChange.bind(this);        this.state = {             inputValue: '',             textareaValue: '',        };     }    handleInputChange(e) {         this.setState({            inputValue: e.target.value,         });    }    handleTextareaChange(e) {         this.setState({            textareaValue: e.target.value,         });    }    render() {        const { inputValue, textareaValue } = this.state;         return (            <div>                <p>单行输入框:<input type="text" value={inputValue}                    onChange={this.handleInputChange} /></p>                 <p>多行输入框:<textarea value={textareaValue}                    onChange={this.handleTextareaChange} /></p>              </div>        );     }}

2、单选按钮和复选按钮

单选按钮核心代码:

class App extends Component {    constructor(props) {        super(props);        this.handeChange = this.handleChange.bind(this);        this.state = { radioValue: '',};     }    handleChange(e) {         this.setState({            radioValue: e.target.value,         });    }    render() {        const { radioValue } = this.state;        return (         <div>            <p>gender:</p>             <label>             male:             <input                type="radio"                value="male"                 checked={radioValue === 'male'}                  onChange={this.handleChange}            />             </label>              <label>                female:             <input                type="radio"                value="female"                 checked={radioValue === 'female'}                  onChange={this.handleChange}            />             </label>        </div>         );    } }

复选按钮很类似,这里不再给出代码。

3、select

可以通过设置select的multiple=true来实现多选下拉列表。

这里仅给出多选select的代码:

import React, { Component } from 'react';class App extends Component {     constructor(props) {        super(props);        this.handleChange = this.handleChange.bind(this);        this.state = {            area: ['beijing', 'shanghai'],        };     }    handleChange(e) {        const { options } = e.target;        const area = Object.keys(options)            .filter(i => options[i].selected === true)             .map(i => options[i].value);        this.setState({ area,});     }    render() {        const { area } = this.state;        return (            <select multiple={true} value={area} onChange={this.handleChange}>                <option value="beijing">北京</option>                 <option value="shanghai">上海</option>                 <option value="hangzhou">杭州</option>            </select>         );    } }

受控组件

上面的几个示例中,每当表单的值发生变化的时候,该值就会被写入到组件的state中。这样的组件在React中被称为受控组件。

在受控组件中,组件状态和它的value或者checked相对应。

React推荐使用受控的表单组件。下面总结下React受控组件更新state的流程:

1、可以通过在constructor中设置state作为表单的默认值
2、每当表单的值发生变化的时候,调用onChange事件处理器
3、事件处理器通过合成事件对象e拿到改变后的状态,并更新state
4、setState会触发视图的重新渲染,完成表单组件的更新

双向的数据绑定:表单的数据源于组件state,并通过props传入;之后,又通过onChange事件处理器将新的表单数据写回道组件的state,完成了数据的双向绑定。

非受控组件

如果一个表单组件没有value props(对于单选/复选按钮对应的是checked prop)时,就称为非受控组件。

开发者可以使用defaultValue和defaultChecked 来表示组件的默认值,但是它只会被渲染一次,在后续的渲染时并不起作用:

受控组件:<input value={this.state.value}     onChange={e => {        this.setState({ value: e.target.value.toUpperCase() })     }}/>
非受控组件<input defaultValue={this.state.value}     onChange={e => {        this.setState({ value: e.target.value.toUpperCase() })     }}/>

在上面两个示例中:受控组件可以将用户输入转化为大写后显示,非受控组件则不会起作用。需要注意:如果不对受控组件绑定change事件,那么在文本框内输入任何值都不会被显示在屏幕上。

非受控组件和受控组件最大的区别就是:非受控组件的状态并不会受应用状态的控制,而受控组件的值来自于组件的state。

表单组件的几个重要属性

状态属性

value, checked, selected(不推荐将select属性用语option上,而推荐在select上使用value的方式)

事件属性

例如 onChange 事件,实际上,React支持DOM Level3中定义的所有表单事件。

原创粉丝点击