在 React Native 视图上强制 onLayout

IT技术 javascript ios reactjs react-native react-native-ios
2021-05-16 13:09:14

我有一个View包含Text字段的 React Native ,我正在使用onLayoutprops进行一些位置计算,这些计算依赖于它提供的数据。

<View onLayout={this.calculateDimensions}>
  <Text>{this.props.content}</Text>
</View>

这很有效,但有一种场景,contentprops更新为具有相同字符大小的不同字符串。这导致布局不会改变并且onLayout不会触发。

每次contentprops更新时都必须进行这些位置计算

注意:我知道有很多方法可以更新组件。更新与布局不同,遗憾的是不会触发onLayout

2个回答

您可以根据内容拥有唯一的密钥。每当组件的关键属性发生变化时,它都会强制重新渲染。

方法this.calculateDimensions需要有某种指示,它应该被再次调用并重新渲染。我建议使用它的状态或备忘录。

让我给你展示一个 React Hooks 的例子。我正在设置 component onLayout,它使用回调 onComponentLayout 。onComponentLayout有 state componentHeight,它会在更改时重新渲染。因此,如果缺少 componentHeight,我可以动态更改它。

...
const onComponentLayout = useCallback(({nativeEvent: {layout}}) => {
   !componentHeight && setComponentHeight(layout.height);
}, [componentHeight, setComponentHeight]);
...

return (
...
    <Component
      onLayout={onComponentLayout}
    />
...
)