[英]Getting infinite loop when using React Context Dispatch in useEffect
我正在處理一個項目並創建了一個應該存儲我的項目數據的上下文。 我將上下文調度包含在一個組件中的 useEffect 中,該組件應該將數據 object 傳遞給上下文,但我遇到了一個問題,我是一個無限循環。 我完全簡化了結構,但我仍然無法弄清楚我的問題是什么。 我粘貼了下面的代碼。 有誰知道我可能做錯了什么?
// DataContext.js
import React, { useReducer } from "react";
export const DataContext = React.createContext();
const dataContextInitialState = { test: 1 };
const dataContextReducer = (state, action) => {
switch (action.type) {
case "update":
console.log(state);
return {
...state,
action.value,
};
default:
return dataContextInitialState;
}
};
export const DataContextProvider = ({ children }) => {
const [state, dispatch] = useReducer(
dataContextReducer,
dataContextInitialState
);
return (
<DataContext.Provider
value={{
state,
dispatch,
}}
>
{children}
</DataContext.Provider>
);
};
// Component that is accessing context
.
.
.
useEffect(() => {
dataContext.dispatch({
type: "update",
});
}, [dataContext]);
.
.
.
我認為這是因為useEffect
在第一次渲染期間被調用,它執行調用你的減速器的dispatch
,它返回一個新的 object { dataContextInitialState }
。
新的對象被傳遞給你的組件, useEffect
檢查dataContext
object 是否與之前的渲染相同,但它不同,因為它是一個新的 object 所以它重新執行useEffect
並且你有循環。
根據我對這段代碼的理解
const dataContextInitialState = { test: 1 };
case "update":
return {
dataContextInitialState,
};
你的 state 變成這樣:
{
dataContextInitialState: {
test: 1
}
}
我猜你想要的是擁有一個 state ,它是一個帶有鍵名test
的 object ,你可以嘗試像這樣修改你的代碼:
case "update":
return dataContextInitialState;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.