首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React钩子/生命周期导航React本机

React钩子/生命周期导航React本机
EN

Stack Overflow用户
提问于 2021-05-09 13:06:45
回答 2查看 218关注 0票数 0

我试图使用react从还原器存储中加载我存储的数据。我注意到,每次屏幕第一次启动时,useEffect正常工作。但是,当它在运行navigation.goBack后获得焦点时,钩子就不会再次运行。我怀疑的是,应用程序的状态已经改变了,是否应该让react钩子不理解这一点呢?

代码语言:javascript
复制
const diaryData = useSelector(({diaryState}) => diaryState.data);
const diaryIndex = useSelector(({diaryState}) => diaryState.index);
const [diary, setDiary] = useState(diaryData[diaryIndex]);

 useEffect(() => {
// log is only displayed the first time, when you return with navigation.goBack, it does not work.
    console.log('im here');
    loadDiary();
  });

  const loadDiary = () => {
    setLoad(true);
    setDiary(diaryData[diaryIndex]);
    setLoad(false);
  };

我正在用以下内容更改redux商店state.data:

代码语言:javascript
复制
 diary.growDimens = growDimens;
 diary.lightingType = lightingType;
 diary.lumens = lumens;

 diaryData[diaryIndex] = diary;
 dispatch(diaryFetchSuccess(diaryData));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-09 14:00:29

当您使用useEffect时,React生命周期并不是这样工作的。这样做时,页面将替换stack中的顶层,即当您使用navigation.navigate()转到下一页时。一个页面被添加到堆栈中,它被替换为navigation.goBack()。就像闭上眼睛,睁开眼睛。

如果您真的希望loadDiary()在您通过navigation.goBack()返回页面时发挥作用,请使用以下两种方法之一:

  • useFocusEffect 最喜欢的:有时当屏幕聚焦时,我们想要运行副作用。副作用可能包括添加事件侦听器、获取数据、更新文档标题等。虽然这可以使用focusblur事件来实现,但这并不是非常符合人体工程学的。
  • 这是B穆罕默德的建议。您可以使用focus侦听器。只需使用道具中的navigationnavigation使用useNavigation钩子即可。代码是这样的:
代码语言:javascript
复制
const navigation = useNavigation();

const loadDiary = () => {
   setLoad(true);
   setDiary(diaryData[diaryIndex]);
   setLoad(false);
};

useEffect(() => {
   const unsubscribe = navigation.addListener('focus', event => {
      // This will be triggered, whenever your component is active
      console.log("I'm here");
      loadDiary();
   });

   return unsubscribe;
}, [navigation]);

请注意:除了一次以外,不再在任何情况下使用任何其他useEffect(),因为当第一次从navigation.goBack()到页面时,focus将负责调用loadDiary()

如果您想更深入地了解如何使用其他事件侦听器,请查看以下链接:导航事件

票数 1
EN

Stack Overflow用户

发布于 2021-05-09 13:31:51

尝试使用导航侦听器:

代码语言:javascript
复制
useEffect(() => {
    const unsubscribe = porps.navigation.addListener('focus', () => {
      loadDiary();
    });

    return unsubscribe;
  }, [props.navigation]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67458055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档