当前位置: 首页 > 知识库问答 >
问题:

在构造函数中动态创建Ref

濮阳景天
2023-03-14

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

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

我希望父组件能够访问子组件的状态。最简单的方法是为每个组件添加一个ref,但我希望这是在constructor()函数中完成的,以便从最终用户那里抽象出它,因为我希望这些组件被通用化。

有没有一种干净的方法可以让父组件访问子组件的状态,例如当创建子组件时,您有以下内容:

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

因此,在父类内部,我可以执行以下操作:

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

因此,我希望能够声明一组组件,如:

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

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

共有3个答案

方河
2023-03-14
  1. 我希望父组件能够访问子组件的状态。

State只能访问组件本身。组件只能访问它们自己的状态。您可以将值传递给子state作为props,但是父组件不能访问子组件状态本身。

将参照设置为子零部件。

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

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

不管怎样,组件可以有自己的ref,你可以设置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" />;
  }
});

我建议,你要么把电话回传给孩子们,作为完成工作的道具

杨宏儒
2023-03-14

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

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" />
  }
}
艾和通
2023-03-14

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

鉴于你有:

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

您可以在父组件渲染函数中使用它向每个子组件添加ref。

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>
  )
}

这将为每个子级添加一个ref,该子级由一个字符串加上当前贴图的索引组成,然后以相同的顺序渲染它们,这相当于执行以下操作:

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

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

ref: refName

致:

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

然后在父组件中使用它,例如this.child0。

希望有帮助。

 类似资料:
  • @adilooze解决方案

  • Javassist的API似乎允许我们创建类中声明的类初始值设定项(即静态构造函数)的精确副本: 但是,该副本还包括(公共/私有)静态最终字段。例如,以下类的静态构造函数: 事实上是: 因此,静态构造函数的精确副本也将包括对最终字段“名称”的调用。 有没有办法创建不包含对final字段的调用的静态构造函数的副本? --谢谢

  • 问题内容: 我最近发现了一种在Google Guava和Project Lombok中 创建对象的新实例的有趣方法:将构造函数隐藏在静态creator方法后面。这意味着您要做的不是执行操作。 我的问题是为什么?隐藏构造函数有什么好处?在我看来,这样做绝对没有优势,而且似乎违反了基本的对象创建原则。由于开始时您使用而不是某种方法创建对象。这似乎是为了创建方法而创建方法。 您从中得到什么? 问题答案:

  • 问题内容: 我有这样的按钮 还有这个 上面的代码工作正常,但我想使其动态化。 所以我像下面这样改变它。 这行不通,我不知道为什么,尽管如果我检查元素,上面的代码会生成如前所述的正确代码。 问题答案: 括号符号的使用: 指向当前作用域对象,因此您可以通过变量名称访问方法。

  • 问题内容: 我是AP Java学生,正在为考试做练习。我遇到了这个问题,但我不明白答案: 考虑以下类别: 执行以下代码后输出是什么: 正确答案是B *。有人可以向我解释方法调用的顺序吗? 问题答案: B构造函数被调用。B构造函数的第一条隐式指令是(调用超类的默认构造函数)。因此,调用了A的构造函数。A的构造函数调用,它调用java.lang.Object构造函数,该构造函数不输出任何内容。然后被称

  • 本文向大家介绍C#静态构造函数?相关面试题,主要包含被问及C#静态构造函数?时的应答技巧和注意事项,需要的朋友参考一下 最先被执行的构造函数,且在一个类里只允许有一个无参的静态构造函数 执行顺序:静态变量>静态构造函数>实例变量>实例构造函数