如何在浏览器返回后保持数据在react中



我有一个React应用程序(Gatsby)和使用@reach/router。有多个页面,如用户页面,关注者页面等。在useEffect钩子中获取数据,这就是问题所在。

当我从当前页面导航到另一个页面时,我传递了一个参数,将其发送到下一个组件,例如用户页面,然后使用该参数调用组件中的useEffect钩子中的API。然后,您可以使用参数转到另一个组件,如追随者页面,再次调用useEffect中的api。当我尝试用浏览器返回时,以前的数据再次更新。理想情况下,我不希望每次回到上一页时它都得到更新。

我理解这是因为我在useEffect钩子中调用它。考虑将数据作为道具传递给navigate(例如navigate("/follower", state: { data })),但我认为首先导航到页面并获取数据是用户的最佳解决方案,因为当获取数据需要一些时间时,我想在下一页显示骨架或加载指示器。理想的体验是twitter之类的东西。不确定这是不是工作,因为我使用@reach/router而不是react-router-dom

请多多指教。

编辑:

为我的拙劣解释道歉。我这里的问题是,当我不断回到以前的页面,像这样的user pagefollower(another)userfollower ...,浏览器不记得有什么和useEffect每次火灾。以前react-router没有发生过吗?

我的猜测是,因为我使用的是GatsbyJS(SSR)和客户端路由,不知何故,它产生的页面,每次甚至浏览器回触发,而不是画它了吗?我不熟悉SSR/客户端路由,希望在某处得到一些信息…

我想到的唯一方法是使用本地存储或cookie,在useEffectdeps([])中,否则,页面的每次呈现(例如向后和向前移动)将再次触发所有可用的副作用。

或者,您可以使用useEffectdeps,仅在所需的依赖项发生变化时触发useEffect

const SomePage=(props)=>{
const isLoggedIn=props.isLoggedIn || localStorage.getItem('logIn')
useEffect(()=>{
// this will only be fired when yourDeps changes
}, [yourDeps])
return {isLoggedIn ? <div>Hello ${user}</div> : <Link to="/log-in">Log in</Link>
}

您的deps(yourDeps)还可以检查您通过位置状态或从本地存储/cookie发送的值。

你也可以使用useRef钩子来存储"old"值,但鉴于你的一般解释,我不确定哪种情况更适合你。

最新更新