react高阶组件小demo-受控组件转换成非受控组件

高阶组件的概念

高阶组件是啥呢?就是一个接收组件做为参数,并返回一个带有附加的属性、方法的包装后的组件。
它的做用就是让具备相同功能的组件,可以不写重复代码就复用这部分功能,同时这些组件又可以具备本身独特的属性和方法。这或许就是抽象的意思吧。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)
相关文章
相关标签/搜索