高阶组件是啥呢?就是一个接收组件做为参数,并返回一个带有附加的属性、方法的包装后的组件。
它的做用就是让具备相同功能的组件,可以不写重复代码就复用这部分功能,同时这些组件又可以具备本身独特的属性和方法。这或许就是抽象的意思吧。react
react是单向数据流的,当给表单元素绑定了一个value,那么就要给这个元素绑定一个onChange事件,在输入的数据发生变化的时候,去改变value的值。也就是咱们看到的输入框的值,实际上也是输入-state.value发生改变-输入框显示改变,妥妥的单向数据流。
非受控组件就是不要给元素绑定一个value,直接在onChange事件里面获取表单的值。app
class Input extends React.Component { constructor(props) { super(props); this.onInputEvent = this.onInputEvent.bind(this) } onInputEvent(event) { this.setState({ value: event.target.value }) } render() { return <input type="text" value={this.state.value} onChange={this.onInputEvent}/> } }
从受控组件的代码能够看出来,若是页面上有多个表单元素,那么绑定一个value和onChange是全部表单元素共用的功能。因此咱们能够把这部分抽出来做为高阶组件,返回一个高阶组件包裹后的表单元素。this
import React from "react" function widthInput(WrappedComponent) { return class extends React.Component { constructor(props) { super(props) this.state = { value: "" } this.onInputEvent = this.onInputEvent.bind(this) } onInputEvent(event) { this.setState({ value: event.target.value }) } render() { const newProps = { value: this.state.value, onChange: this.onInputEvent } return <WrappedComponent {...this.props} {...newProps}/> } } } class InputComponent extends React.Component { render() { return <input type="text" {...this.props} /> } } export default widthInput(InputComponent)