我想让我的子组件有一个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>
}
}
这样我就可以访问每个子组件,以及父组件遍历子组件时的状态。
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" />;
}
});
我建议,你要么把电话回传给孩子们,作为完成工作的道具
在这种方法中,父组件是在渲染中使用子组件的组件。您可以通过调用子对象的方法来操纵子对象的“状态”。
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" />
}
}
对于我正在制作的表单,我需要完全相同的东西,这就是我自动将引用添加到子组件的方法
鉴于你有:
<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#静态构造函数?时的应答技巧和注意事项,需要的朋友参考一下 最先被执行的构造函数,且在一个类里只允许有一个无参的静态构造函数 执行顺序:静态变量>静态构造函数>实例变量>实例构造函数