设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

【React深入】从Mixin到HOC再到Hook(7)

发布时间:2019-04-11 17:31 所属栏目:21 来源:ConardLi
导读:首先我们自定义一个Form组件,该组件用于包裹所有需要包裹的表单组件,通过contex向子组件暴露两个属性: model:当前Form管控的所有数据,由表单name和value组成,如{name:'ConardLi',pwd:'123'}。model可由外部传

首先我们自定义一个Form组件,该组件用于包裹所有需要包裹的表单组件,通过contex向子组件暴露两个属性:

  •  model:当前Form管控的所有数据,由表单name和value组成,如{name:'ConardLi',pwd:'123'}。model可由外部传入,也可自行管控。
  •  changeModel:改变model中某个name的值。 
  1. class Form extends Component {  
  2.   static childContextTypes = {  
  3.     model: PropTypes.object,  
  4.     changeModel: PropTypes.func  
  5.   }  
  6.   constructor(props, context) {  
  7.     super(props, context);  
  8.     this.state = {  
  9.       model: props.model || {}  
  10.     };  
  11.   }  
  12.   componentWillReceiveProps(nextProps) {  
  13.     if (nextProps.model) {  
  14.       this.setState({  
  15.         model: nextProps.model  
  16.       })  
  17.     }  
  18.   }  
  19.   changeModel = (name, value) => {  
  20.     this.setState({  
  21.       model: { ...this.state.model, [name]: value }  
  22.     })  
  23.   }  
  24.   getChildContext() {  
  25.     return {  
  26.       changeModel: this.changeModel,  
  27.       model: this.props.model || this.state.model  
  28.     };  
  29.   }  
  30.   onSubmit = () => {  
  31.     console.log(this.state.model);  
  32.   }  
  33.   render() {  
  34.     return <div>  
  35.       {this.props.children}  
  36.       <button onClick={this.onSubmit}>提交</button>  
  37.     </div>  
  38.   }  

下面定义用于双向绑定的HOC,其代理了表单的onChange属性和value属性:

  •  发生onChange事件时调用上层Form的changeModel方法来改变context中的model。
  •  在渲染时将value改为从context中取出的值。 
  1. function proxyHoc(WrappedComponent) {  
  2.   return class extends Component {  
  3.     static contextTypes = {  
  4.       model: PropTypes.object,  
  5.       changeModel: PropTypes.func  
  6.     }  
  7.     onChange = (event) => {  
  8.       const { changeModel } = this.context;  
  9.       const { onChange } = this.props;  
  10.       const { v_model } = this.props;  
  11.       changeModel(v_model, event.target.value);  
  12.       if(typeof onChange === 'function'){onChange(event);}  
  13.     }  
  14.     render() {  
  15.       const { model } = this.context;  
  16.       const { v_model } = this.props;  
  17.       return <WrappedComponent  
  18.         {...this.props}  
  19.         value={model[v_model]}  
  20.         onChange={this.onChange}  
  21.       />;  
  22.     }  
  23.   }  
  24. }  
  25. @proxyHoc  
  26. class Input extends Component {  
  27.   render() {  
  28.     return <input {...this.props}></input>  
  29.   }  

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读