假设我有以下代码:
tox.ini
-
<View>
<ComponentA>
<TouchableHighLight onPress={this.refs.componentB.foo.bind(this)}><Text>Hey</Text></TouchableHighLight>
</ComponentA>
<ComponentB ref='componentB'>
....
</ComponentB>
</View>
当我尝试在ComponentA中使用它时,componentB的ref将是未定义的。我猜它是因为我在分配引用之前尝试使用它。
解决这个问题的最佳方法是什么?
我可以拥有父组件中的所有函数,但是如果我不填充IMO应该包含在子组件中的函数,它将最终成为一个巨大的文件。
答案 0 :(得分:2)
您可以将onPress
- 处理程序包装在函数中:
<TouchableHighLight onPress={() => this.refs.componentB.foo()}>
答案 1 :(得分:1)
我没有看到在父组件中使用这些共享函数的问题,当其中一个子组件发生某些事情时,使用props调用它们。 这实际上是一种鼓励的React模式,因为您可以让您的孩子组件更容易测试。 如果你让ChildA知道ChildB,你就是在耦合它们,而不是让父母只是协调它们。
另见: https://facebook.github.io/react/docs/more-about-refs.html#cautions
如果您还没有使用React编写多个应用程序,那么您的第一个倾向通常是尝试使用refs来实现&#34;使事情发生。在你的应用程序中如果是这种情况,请花一点时间,更关键地考虑组件层次结构中应该拥有状态的位置。通常情况下,很明显,适当的地方是拥有&#34;该状态在层次结构中处于更高级别。将状态放置在那里通常会消除任何使用refs以使事情发生的愿望&#34; - 相反,数据流通常会实现您的目标。
答案 2 :(得分:1)
您无法从<Component B>
访问<Component A>
中的任何方法。 这是设计性的,是故意做的,也是为了你自己的利益:)
最好坚持反应设计原则,而不是试图做出捷径。你肯定会后悔任何捷径。
BTW:ref
是对DOM中已安装组件的引用,而不是对react组件的引用。所以我认为无论如何你都无法让它发挥作用。此外,我总是建议任何人不要使用refs(我从Netflix的谈话中了解到反应)。
一种解决方法:
doFooInB
组件<View>
布尔值
doFooInB
传递给<Component B>
作为道具。<Component B>
读取道具,并做出相应的响应(使用从B渲染中调用的内部函数)onPress
组件中定义<View>
事件,并将作为prop的函数传递给组件A. onPress
只需要setState({ doFooInB : true })
或其他东西来触发重新渲染,这将触发组件B中的方法。是的,这是更多的代码,但它确实比创建一些快捷方式更好。
答案 3 :(得分:1)
<ComponentA>
constructor(){
this.method = this.methodA().bind(this);
}
methodA(){
}
<ComponentA method=this.methodA/>
<ComponentB>
<TouchableHighlight onPress={()=>{this.props.method}}>
</ComponentB>