【发布时间】:2020-08-03 19:21:31
【问题描述】:
我在尝试侦听此应用程序中的状态更改时遇到了一些问题。基本上我希望在某些状态更改后触发 useEffect 挂钩,但什么都没有发生。
这就是我得到的
index.jsx
// this is a simplification.
// I actually have a react-router-dom's Router wrapping everything
// and App is a Switch with multiple Route components
ReactDOM.render(
<Provider>
<App>
</Provider>
, document.getElementById('root'));
useSession.jsx
export const useSession = () => {
const [session, setSession] = useState(null)
const login = useCallback(() => {
// do something
setSession(newSession)
})
return {
session,
setSession,
login
}
}
Provider.jsx
const { session } = useSession();
useEffect(() => {
console.log('Print this')
}, [session])
// more code ...
App.jsx
export function Login() {
const { login } = useSession();
return <button type="button" onClick={() => { login() }}>Login</button>
}
好吧,我有这个父组件 Provider 监视会话状态,但是当它更新时,永远不会调用提供程序的 useEffect。
useEffect 仅在 setSession 在相同的钩子/方法中被调用时才会被触发。例如,如果我在Provider 中导入setSession 并在那里使用它,useEffect 将被触发;或者,如果我在useSession 方法中添加useEffect,它将在login 更新状态时被触发。
useEffect 的回调只被调用一次,当组件被挂载时,而不是在状态改变时。
我怎样才能实现这种行为?每当 session 更新时,Provider 的 useEffect 就会被触发?
提前致谢!
【问题讨论】:
-
试图弄清楚为什么登录函数用
useCallback钩子装饰......没有依赖数组。如果没有我确定它并没有真正记住登录回调。我不认为这是问题,但这很奇怪。您还期望在useSession中触发对session的更改除了setter之外还有什么? -
同意@DrewReese。它可能必须与 useCallback 一起使用。尝试使用常规功能。如果这没有帮助,代码框会很有帮助。
标签: javascript reactjs react-hooks react-context use-effect