将 onLayout event.nativeEvent.layout.height 从父组件传递到子组件会导致高度值无限增长

IT技术 reactjs react-native
2021-05-21 02:06:59

在 rnplay.org 上查看正在运行的代码- 如果您对代码进行了更改,请重新加载浏览器窗口并再次点击“点击播放”。我在组件内部做了一些笔记来解释问题。

这是我的书面解释:

我的基本问题:我想让两个兄弟组件具有相同的高度同级(此处:SubComponent1)的内容是从数据库中动态获取的,因此定义了父级的高度。我希望它也定义子组件 2 的高度。见图:

之前_之后

我试图通过通过 props 将父级的高度发送到静态子级(子组件 2)来实现这一点。这是render父组件中的部分:

render: function() {
  return (
    <View style={styles.parentContainer} onLayout={this._onLayoutEvent}>
      <Text>Parent Component </Text>
      <SubComponent1 />
      <SubComponent2 parentHeight={this.state.parentHeight} />
    </View>
  );
},

_onLayoutEvent: function(event) {
  this.setState({parentHeight: event.nativeEvent.layout.height});
}

在这里我将它添加到孩子:

<View style={[styles.subComponent2View, {height: this.props.parentHeight}]}>

但是,这不起作用!子组件的高度无限循环地增加..见图片:无限增长

令人惊讶的是,除以1.01它起作用了!也就是说,将孩子中的上述行更改为

<View style={[styles.subComponent2View, {height: this.props.parentHeight / 1.01}]}>

不会导致身高增长,我得到以下信息,您几乎看不到0.01. 然而除以1.001再次导致无限循环......我真的无法解释为什么!这是潜水时的结果1.01父高度除以 1.01

有人可以解释这种奇怪的行为吗?

我的问题有其他解决方案吗?- alignSelf: 'stretch'SubComponent2 上的设置也不起作用。- 将一个兄弟姐妹的高度发送到另一个兄弟姐妹(即从子组件 1 到子组件 2)可能会有所帮助吗?如果是这样,我可能需要使用该Flux模式来实现一些东西,对吗?

2个回答

您根本不必首先明确定义高度。使用 flexbox,实现您正在寻找的东西应该是微不足道的。只需分配flex: 1给两个子组件容器以及父组件,而父组件将添加一个flex-direction: 'row'.

为了说明,这是我的意思的网络版本。而不是display: flex你使用,flex: 1但重点是一样的:https : //jsfiddle.net/2rc4b2qy/

onLayout - 你通过 setState 放置新数据,这会导致新的 render() 和这里的问题

新的渲染导致新的 onLayout!!!=(伤心,非常难过

它有一个大问题,所以可以只使用例如 this.dynamicSize = ...

而是 setState({dynamicSize: ...}) 但需要一些 forceUpdate() 例如重新渲染但再次 - 防止循环

https://facebook.github.io/react/docs/react-component.html - 在这里您尝试不同的方法来防止循环但立即更新