【问题标题】:Dynamically Create Ref in Constructor在构造函数中动态创建 Ref
【发布时间】:2017-07-24 20:48:44
【问题描述】:

我想让我的子组件有一个引用,但我不希望用户在创建组件时必须指定引用。所以说我有这样的事情:

<Parent>
    <Child />
    <Child />
</Parent>

我希望父组件能够访问子组件的状态。简单的方法是为每个组件添加一个 ref,但我希望这是在 constructor() 函数期间完成的事情,以便将其从最终用户中抽象出来,因为我希望这些组件被概括。

有没有一种干净的方法可以让父组件可以访问子组件的状态,例如在创建子组件时,您有类似的东西:

class Child extends Component {
    constructor(){
        super();
        this.state = {'abc': 123}
        this.ref=Math.random();
    }
}

这样我就可以在 Parent 类中执行以下操作:

 class Parent extends Component {
     componentWillMount(){
         console.log(this.refs);
     }
 }

所以我希望能够声明一组组件,例如:

class App extends Component {
    render(){
       <Parent> <Child /> <Child /> </Parent>
    }
}

这样我就可以访问每个子组件及其在父组件遍历子组件时的状态。

【问题讨论】:

  • 您不能从父组件访问子组件状态。可以从它自己的类访问、修改状态。
  • 你实际上可以使用 ref
  • 我的意思是从父组件状态设置子组件状态。你不能这样做

标签: reactjs


【解决方案1】:

我正在制作的表单需要完全相同的东西,这就是我想出的自动将引用添加到子组件的方法

鉴于你有:

<Parent>
    <Child />
    <Child />
</Parent>

您可以在父组件渲染函数中使用它来为每个子组件添加一个引用。

render () {
  let wrappedChildren = [];

  React.Children.map(this.props.children, (child, i)=> {
    if (!child) {
      return;
    }
      let refName = 'child' + i
      wrappedChildren.push(React.cloneElement(child, {
        key: refName,
        ref: refName,
      }
    ));
  }, this);
  return (
    <View>
        {wrappedChildren}
    </View>
  )
}

这将为每个 Child 添加一个 ref,该引用由一个字符串加上当前地图的索引组成,然后以相同的顺序呈现它们,相当于这样做:

<Parent>
    <Child ref="child0" />
    <Child ref="child1" />
</Parent>

我知道字符串引用已被弃用,但我试图保持简单,您也可以通过更改将引用用作回调:

ref: refName

到:

ref: (c) => { this[refName] = c }

然后在父组件中以this.child0为例。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    在这种方法中,父组件是子组件在渲染中使用的组件。您可以通过调用他们的方法来操纵孩子的“状态”。

    Parent.js

    class Parent extends Component {
      refs = [];
    
      componentDidMount() {
        this.refs[0].doSelect();
      }
    
      setRef = ref => {
        this.refs.push(ref);
      }
    
      render() {
        return (
          <div>
            <Child ref={this.setRef} />
            <Child ref={this.setRef} />
          </div>
         )
       }
    }
    

    Child.js

    class Child extends Component {
      state = { isSelected: false }
    
      doSelect = () => {
        this.setState({ isSelected: true })
      }
    
      render() {
        return <div className="child" />
      }
    }
    

    【讨论】:

      【解决方案3】:
      1. 我希望父组件能够访问子组件的状态。

      State 只能由组件本身访问。 Parentchild 组件只能访问它们自己的状态。您可以将值传递给子 stateprops,但父组件本身无法访问子组件状态。

      1. 将 Refs 设置为子组件。

        你为什么要这个? Ref 用于
        管理焦点、文本选择或媒体播放。
        触发命令式动画。
        与第三方 DOM 库集成。

        请访问此链接了解 Ref.
        https://facebook.github.io/react/docs/refs-and-the-dom.html

        的用途

      无论如何,组件可以有自己的refs,你可以将ref设置为子组件,

      render: function() {
          return (
            <div>
              <Child ref="child" />
              <div><button onClick={this.handleClick}>ACCESS REF</button></div>
            </div>
          );
        },
      
      handleClick: function() {
          alert(this.refs.child.refs.input.getDOMNode().value);
        }
      });
      
      let Child = React.createClass({
        render: function() {
          return <input ref="input" />;
        }
      });
      

      我会建议,你应该将回调作为道具传递给孩子来做你的事情。:

      【讨论】:

      • 所以你不能在构造函数期间添加一个引用?
      • 你完全走错路了。首先浏览答案和发布的链接。
      • 嗯,这是一个奇怪的用例,我将 React 组件重新用于 Web 开发之外的东西,所以它可能不会很糟糕
      • 如何在创建时设置 ref?
      猜你喜欢
      • 2020-07-05
      • 2023-03-17
      • 2014-01-10
      • 2019-06-12
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多