关于react.js:React的受控组件用法详解

31次阅读

共计 2904 个字符,预计需要花费 8 分钟才能阅读完成。

一、受控组件是什么?

用 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 的受控组件用法详解!

正文完
 0