React Native navigation.navigate 参数未更新

ima*_*ian 8 javascript react-native

我尝试使用 navigation.navigate() 从主屏幕导航到详细信息屏幕。当我第一次单击按钮进行导航时,它工作正常,但之后当我从详细信息返回主页并单击另一个项目以查看详细信息时,详细信息屏幕上的参数不会更改(它仍然是第一次单击的参数) )。这是我的代码:

<TouchableNativeFeedback
  key={index}
  onPress={() => {
    navigation.navigate('PenghuniScreen', {
      screen: 'DetailPenghuni',
      params: {
        penghuni: item,
      },
    });
  }}></TouchableNativeFeedback>;

Run Code Online (Sandbox Code Playgroud)

item 是来自 Map Loop 的对象。我尝试使用 React navigation usefocuseffect 来控制台日志,并且参数在第一次单击后不会更改。

useFocusEffect(
    React.useCallback(() => {
      console.log('My params:', route.params.penghuni);
      setPenghuni(route.params.penghuni);
      return () => {
        // source.cancel('Api Canceled');
        console.log('tutup detail penghuni');
      };
    }, []),
  );

Run Code Online (Sandbox Code Playgroud)

有人有解决方案吗?

Ron*_*tro 6

您忘记将依赖项添加route到您的useCallback,因此它正在获取旧值。

尝试添加[route]

React.useCallback(() => {
      console.log('My params:', route.params.penghuni);
      setPenghuni(route.params.penghuni);
      return () => {
        // source.cancel('Api Canceled');
        console.log('tutup detail penghuni');
      };
}, [route]), 
Run Code Online (Sandbox Code Playgroud)

我建议您将eslint for hooks 添加到您的项目中,以检测丢失的依赖项。 详尽的部门警告

观察:为什么不通过导航参数传递这些值而不是使用useFocusEffect

navigation.navigate('DetailPenghuni', { penghuni: item1 }) // item1 press 
navigation.navigate('DetailPenghuni', { penghuni: item2 }) // item2 press
Run Code Online (Sandbox Code Playgroud)

如果您需要取消某些操作,您可以随时使用关闭屏幕时自动调用的useEffect clean 回调。