【发布时间】:2020-09-07 15:26:24
【问题描述】:
在我的 react-native 项目中,我有三个复选框,我需要跟踪这些复选框的状态,因此我使用具有键值的对象(值是布尔值)来表示所有三个复选框的状态并使用 @987654322 @hook 来管理它们。这是我的代码:
import React, { useState, useEffect } from 'react';
...
const MyScreen = ({ navigation }) => {
// initially, all checkboxes are checked
const initialCheckBoxState = {
0: true,
1: true,
2: true,
};
const [checkBoxesState, setCheckBoxesState] = useState(initialCheckBoxState);
useEffect(() => {
return () => {
console.log('Screen did unmount');
};
}, [checkBoxesState]);
return (
<View>
...
<SectionList
sections={options}
renderItem={({ index, item }) => (
<CheckBox
onPress={() => {
const checkBoxesStateCopy = { ...checkBoxesState };
checkBoxesStateCopy[index] = !checkBoxesStateCopy[index];
setCheckBoxesState(checkBoxesStateCopy);
}}
/>
)}
/>
...
</View>
);
};
我省略了与我的问题无关的代码。如您所见,我为每个项目绘制了一个CheckBox 组件。
在实践中,总是有三个项目(即要显示三个复选框)。一开始我声明了initialCheckBoxState,每个key-pair代表了每个checkbox的状态。在Checkbox 的onPress 回调中,我切换每个复选框状态并通过钩子方法setCheckBoxesState 整体更新checkBoxesState。
在运行时一切正常,我的屏幕在切换复选框状态时重新渲染,UI 正确显示复选框的状态。但是当我导航回上一个屏幕并导航回此屏幕时,问题就出现了,所有复选框状态都恢复到初始状态。
那么,为什么不保留复选框状态?
P.S. 前一个屏幕和MyScreen 在同一个堆栈导航器下。用户按下前一屏的按钮导航到MyScreen。从MyScreen 用户可以通过按“headerLeft”按钮转到上一个屏幕
【问题讨论】:
-
因为这里没有提供我需要的代码部分,您可以在按下返回按钮时在您所在页面的
componentWillUnmount中添加一个console.log('unmounted')。只要告诉我您是否在控制台中看到此日志 -
您可以将
checkBoxesState和setCheckBoxesState作为道具传递给MyScreen,并且可以从MyScreen调用,对于持久状态,您可以使用github.com/leoafarias/use-state-persist 这个包 -
@Amas,我更新了我的代码 sn-p ,现在我有控制台日志来检查组件是否已卸载。我测试过,每次离开屏幕时都能看到控制台日志。但这是为什么呢?据我了解,屏幕会在内存堆栈中停留一段时间,但似乎屏幕会立即卸载。无论如何如何解决我的问题?
标签: react-native react-hooks react-native-navigation