一、受控组件是什么?

用state来获取和设置输出元素值的组件,称之为受控组件<input type="text">, <textarea><select> 等标签都可用 value 属性,来实现受控组件。


二、有哪些受控组件?

1、input
- 阻止表单提交
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>        );    }}
- file类型input
// file类型的input,属性value是只读的,所以是非受控组件<input type="file" />
- 多个input
// 多个input时,设置下name属性,即可动静操作,无需硬编码class Reservation extends React.Component {    constructor(props) {        super(props);        this.state = {            isGoing: true,            numberOfGuests: 2        };        this.handleInputChange = this.handleInputChange.bind(this);    }    handleInputChange(event) {        const target = event.target;        const value = target.type === 'checkbox' ? target.checked : target.value;        const name = target.name;        this.setState({            [name]: value        });    }    render() {        return (            <form>                <label>                    参加:                    <input                        name="isGoing"                        type="checkbox"                        checked={this.state.isGoing}                        onChange={this.handleInputChange} />                </label>                <br />                <label>                    来宾人数:                    <input                        name="numberOfGuests"                        type="number"                        value={this.state.numberOfGuests}                        onChange={this.handleInputChange} />                </label>            </form>        );    }}

2、textarea

用value属性来设置textarea的文本内容:

class EssayForm extends React.Component {    constructor(props) {        super(props);        this.state = {            value: '请撰写一篇对于你喜爱的 DOM 元素的文章.'        };        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>        );    }}

3、select

传统HTML中,用 selected 来设置选中项,而在React中应用 value 属性:

// HTML中应用selected属性< select >  <option value="grapefruit">葡萄柚</option>  <option value="lime">酸橙</option>  <option selected value="coconut">椰子</option>  <option value="mango">芒果</option></select >
// React中应用value属性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>        );    }}
// 传递数组给value属性,示意select标签,选中多个选项<select multiple={true} value={['B', 'C']}>

参考文档
  • React的受控组件用法详解!