大佬教程收集整理的这篇文章主要介绍了为什么所有东西都不能在 useEffect 中工作一次?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的 useSelector 钩子仅在 useEffect 内部在我运行它正在工作的其他地方时返回 null。例如:
// it's doesn't work.
const user = useSelector(selectUser);
useEffect(() => {
console.log(user)
},[]);
// it's work.
const user = useSelector(selectUser);
const exampleFunc = () => {
console.log(user);
}
exampleFunc()
我正在使用谷歌身份验证。第一次登录时它返回null,但是当我刷新页面时,它返回的用户信息不为null。为什么从第一项返回null,刷新页面时用户信息就进来了?如果我输入 Console.log("Hello world") 钩子仍然不起作用,但是当我刷新页面时它起作用了。
// Redux
import { createSlice } from "@reduxJs/toolkit";
const initialState = {
user: null,};
export const userSlice = createSlice({
name: "user",initialState,reducers: {
login: (state,action) => {
state.user = action.payload;
},logout: (state,action) => {
state.user = null;
},},});
export const { login,logout } = userSlice.actions;
export const selectUser = (state) => state.user.user;
export default userSlice.reducer;
// Original function
const user = useSelector(selectUser);
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged((userAuth) => {
if (userAuth) {
dispatch(
login({
email: userAuth.email,uID: userAuth.uID,displayname: userAuth.displayname,photoUrl: userAuth.photoURL,})
);
} else if (!userAuth) {
dispatch(logout());
}
});
return unsubscribe;
},[]);
更新:我解决了这个问题。我将 useEffect 函数更改为:
useEffect(() => {
const userInfo = firebase.auth().currentUser;
if (userInfo) {
dispatch(
login({
email: userInfo?.email,uID: userInfo?.uID,displayname: userInfo?.displayname,photoUrl: userInfo?.photoURL,})
);
} else if (!userInfo) {
dispatch(logout());
}
},[dispatch]);
当你使用 useEffect
时,你传递一个依赖数组作为第二个参数
useEffect(() => {},[])
当您没有像上面那样向该数组传递任何项目时,useEffect
语句只会在第一次渲染时运行,而不会在之后运行。它基本上告诉 react 只执行一次 - 这与 componentDidMount
useEffect(() => {},[dependency,secondDependency])
当您将依赖项传递给数组时,每次这些依赖项之一发生更改时都会运行 useEffect
语句。这就是您如何在状态更改上重建效果。
查看文档了解更多信息:https://reactjs.org/docs/hooks-effect.html
以上是大佬教程为你收集整理的为什么所有东西都不能在 useEffect 中工作一次?全部内容,希望文章能够帮你解决为什么所有东西都不能在 useEffect 中工作一次?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。