美文网首页
封装react完整的受控组件input

封装react完整的受控组件input

作者: A小样儿_ | 来源:发表于2018-10-11 22:58 被阅读0次

    最近react又有更新了,对于生命周期使用的更加严谨了 ,对于受控组件的好处  相比大家都知道  废话不多说,上代码~  

    import React, { Component } from 'react'

    class Input extends Component {

      constructor(props, context) {

        super(props, context)

        this.state = {

          value: this.props.defaultValue || ''

        }

        this.changeHandler = this.changeHandler.bind(this)

      }

      get displayValue() {

        const key = 'value'

        const internalKey = 'value'

        return this.props[key] !== undefined

          ? this.props[key]

          : this.state[internalKey]

      }

      handleChange(newVal) {

        if (newVal === this.state.value) {

          return

        }

        this.setState(

          {

            value: newVal

          },

          () => {

            this.props.onChange && this.props.onChange(this.props.name, newVal)

          }

        )

      }

      UNSAFE_componentWillReceiveProps(nextProps) {

        const controlledValue = nextProps.defaultValue

        if (controlledValue !== undefined && controlledValue !== this.state.value) {

          this.setState(

            {

              value: controlledValue

            },

            () => {

              this.props.onChange &&

                this.props.onChange(nextProps.name, controlledValue)

            }

          )

        }

      }

      shouldComponentUpdate(nextProps, nextState) {

        if (nextProps.value !== undefined) {

          return nextProps.value !== this.props.value

        }

        return nextState.value !== this.state.value

      }

      changeHandler(e) {

        const val = e.target.value

        this.handleChange(val)

      }

      render() {

        return (

          <input

            className="editor"

            placeholder={this.props.placeholder}

            type={this.props.type}

            name={this.props.name}

            value={this.displayValue}

            onChange={this.changeHandler}

          />

        )

      }

    }

    export default Input

    相关文章

      网友评论

          本文标题:封装react完整的受控组件input

          本文链接:https://www.haomeiwen.com/subject/cswiaftx.html