gpt4 book ai didi

javascript - useEffect 不会在路由更改时更新状态

转载 作者:行者123 更新时间:2023-11-29 22:47:26 24 4
gpt4 key购买 nike

我正在寻找一种解决方案来注册路由更改并应用新的 state使用 setStateuseEffect .下面的当前代码不更新 setState 的函数当路线改变时。

例如,我注册了pathname/location.pathname === '/'createContext 内, 如果 pathname/ setStateisHome已注册true , 但是如果 pathname/page-1 setState已注册false .

在浏览器重新加载时,onMount state已正确设置,但是在使用 Link 更改路线时这没有。另外,请注意我正在使用 Gatsby 并在这样做时导入 { Link } from 'gatsby'

CreateContext.js

export const GlobalProvider = ({ children, location }) => {


const prevScrollY = useRef(0);
const [state, setState] = useState({
isHome: location.pathname === '/',
// other states
});

const detectHome = () => {
const homePath = location.pathname === '/';
if (!homePath) {
setState(prevState => ({
...prevState,
isHome: false
}));
}
if (homePath) {
setState(prevState => ({
...prevState,
isHome: true
}));
}
};

useEffect(() => {
detectHome();
return () => {
detectHome();
};
}, [state.isHome]);

return (
<GlobalConsumer.Provider
value={{
dataContext: state,
}}
>
{children}
</GlobalConsumer.Provider>
);
};

如果我console.log(state.isHome)pathname /我得到 true ,我得到的任何其他路径名 false , 但是,如果我改变路线,当前 isHome状态保持以前,直到我滚动和 useEffect适用。

注册点 isHome状态是改变每页的 CSS。

如何使用 useEffect 更新状态改变路线时。以前,我会使用 componentDidUpdate 来完成此操作并注册 prevProps.location.pathname反对props.location.pathname ,但是,我的理解是这不再需要 useEffect钩子(Hook)。

最佳答案

你想要的效果是“当位置改变时更新我的​​状态”,这在 useEffect 代码中翻译如下:

  useEffect(() => {
detectHome();
return () => {
detectHome();
};
}, [location]);

关于javascript - useEffect 不会在路由更改时更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58098651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com