React父子组件间的另类操作

作者: yoona幻尘 | 来源:发表于2019-05-14 14:24 被阅读239次

    React父子组件的数据流向通常是由父组件通过props传到子组件上,常规操作是父组件传入props给子组件调用,例如:

    function Child(props) {
      return <div onClick={()=>props.handelClick}></div>;
    }
    
    class Parent extends React.Component {
      constructor(props) {
        super(props);
      }
    
      handelClick(e) {
        alert(e);
      }
      render() {
         const childProps={
              handelClick= this.handelClick,
         };
        return (
          <div>
            <h1>Hello, world!</h1>
            <Child {...childProps} />
          </div>
        );
      }
    }
    
    ReactDOM.render(
      <Parent />,
      document.getElementById('root')
    );
    

    如上,父组件的handelClick在子组件的点击事件触发时就会生效,通常我们的组件都可以使用这种方法去完成,但也有特例。

    想象一个场景,子组件有一个查询输入框,回车会查询到一连串数据,点击这任一数据,会渲染父组件的页面,点击页面上的一个按钮,需要清空子组件的输入框查询数据。先想着数据从上而下来处理,那这个本该是子组件内部状态的输入数据,得是从props传入子组件的,这样才能调用父组件的方法去修改值。但是实际操作过程会发现,父组件传入的value值会使得我们无法再输入改变value值,因为父组件没有改变props的值,这样我们还得在输入框监听onChange事件,将修改的值实时回传(调用父组件修改value方法)到父组件,然后再传入子组件更新输入框的内容。

    有没有什么简单的方法呢,习惯vue的人首先肯定会想到ref操作,简单快捷。React里也有ref操作,我们看一下,该如何操作。

    class Child extends React.Component {
      constructor(props) {
        super(props);
        this.state={
            value:"",
         }
      }
    // 修改输入框的值
    changeValue(e){
       this.setState({
         value: e.target.value
       });
    }
      render(){
       const { value } = this.state;
       return (
        <input value={value} onChange={()=>this.changeValue} />
           )
        }
    }
    
    class Parent extends React.Component {
      constructor(props) {
        super(props);
      }
    // 调用子组件方法清空子组件input输入框
     clearInput(){
          if(this.refInput){
               const e  = {
                 target: {
                    value: ""
                 }
           };
         this.refInput.changeValue(e);
       }
    }
      render() {
        return (
          <div>
            <h1>Hello, world!</h1>
            <Child onRef={ref => {
                this.refInput = ref;
              }} />
            <button onClick={()=>this.clearInput}>清除input数据</button>
          </div>
        )
      }
    }
    
    ReactDOM.render(
      <Parent />,
      document.getElementById('root')
    );
    

    通过ref可以得到子组件的所有方法和内部状态,看着是不是要比父子之间双向绑定简单很多,双向的话就是逻辑很清晰,始终保持着单向数据流的理念,我们具体使用还是要看项目情景。

    相关文章

      网友评论

        本文标题:React父子组件间的另类操作

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