请大家多包涵新手,我的一个简单的React程序有一个迷惑我的问题。这个程序主要是2个components分别对应到2个url上面:
App.tsx
-- foo.tsx it's url is "/foo"
-- bar.tsx it's url is "/bar"
在App.tsx中, 我有一个导航条用 useHistory.push允许用户在"/foo"和 "/bar"之间切换.
在foo.tsx 和 bar.tsx里面,就是逻辑很相似的的2个功能,分别是拉取foo类和bar累的数据:
const user = useSelector((state: RootState) => state.user)
useEffect(() => {
const api = new Api();
async function getData() {
const foo: any = await api.getFoo(user.foo)
dispatch(setFooData(foo))
}
}, [user.name])
我发现的问题是:
当我先访问/foo的时候,foo的页面会先加载所有的components最后调用useEffect。这个是我从资料里面看到的。
然后我在这个页面继续点foo的按钮(相当于useHistory.push("/foo")),此时这个页面是不会更新,因为没有任何的state变化。如果我在redux的控制台dispatch一个user.name会触发useEffect。
同样的操作在我跳到/bar的时候也是同样的效果。
到此为止,所有东西都是和预想的一样。通过使用useHistory.push()来保持session,这样在2个不同页面获取的数据都会留存在Redux的store里面(希望这里我是理解正确的)。
但是 此后我从/bar再跳回到/foo,useEffect被调用了,相当于又重新从API拉了一次数据。此时我观察过user.name是没有变化的。从/foo跳到/bar也是一样的效果。
我不确定是不是useHistory.push让
const user = useSelector((state: RootState) => state.user)
又执行了一遍导致useEffect识别到user.name变成了空然后又重新获得了原来的值(虽然不合理)亦或者是useHistory.push就是这样运行的,只要有新的url被push到history里面就会触发 useEffect 。 我搜索了一下没找到直接的回答。
我隐约记得之前我在加载完2个页面后在这2个route之间跳转是没有重新请求的动作的,但是因为第一次写react弄了太多commit把记录都覆盖了。
所以我的目的就是,当foo和bar的页面数据都加载完之后,在他们之间跳转应该不会有额外的请求,除非useEffect的依赖列表里面有变化。
请问我需要往哪个方向改进或者有什么资料可以参考吗?谢谢!