gpt4 book ai didi

reactjs - useReducer + Context api + useEffect = 无限循环

转载 作者:行者123 更新时间:2023-12-03 19:00:04 24 4
gpt4 key购买 nike

我正在尝试使用 useReducer 和 context api 进行练习,但是当尝试执行返回数据的函数时,我得到了一个无限循环
reducer .js

const initialStore = {
disabledAddButton: false,
disabledDelButton: false,
user: null,
total_purchase: 0,
cart: [],
tasks: [],
}

const reducer = (state, action) => {
switch (action.type) {
case TYPES.USER_GET_TASKS: {
return {
...state,
tasks: action.payload,
}
}
default:
return state
}
}
用户提供者.js
const UserContext = createContext()

const UserProvider = ({ children }) => {

const [store, dispatch] = useReducer(reducer, initialStore)

const getTasks = async () => {
try {
const response = await db.collection('tasks').get()
const arrayData = response.docs.map(doc => ({
id: doc.id,
...doc.data(),
}))

dispatch({
type: TYPES.USER_GET_TASKS,
payload: arrayData,
})
} catch (error) {
console.log(error)
}
}
const value = {
store,
getTasks,
dispatch,
}
return <UserContext.Provider value={value}>{children}</UserContext.Provider>
}

export { UserContext }
export default UserProvider
任务.js
const Tasks = () => {
const { store, getTasks } = useContext(UserContext)
const { tasks } = store

useEffect(() => {
getTasks()
}, [])

return (
<div>
{tasks.map(task => (
<h2 key={task.id}>{task.name}</h2>
))}
</div>
)
}

export default Tasks
基本上问题是当我在任务组件上运行 getTasks() 时(在 useEffect 内部)我得到无限循环,我不知道为什么

最佳答案

这肯定与火力有关 db因为我无法通过 API 获取来复制该问题。
您可以从 UserProvider 最小化重新渲染通过使用 useMemo useCallback .现在getTasks函数只会创建一次,而不是在每次渲染时重新创建。

const UserProvider = ({ children }) => {
const [store, dispatch] = useReducer(reducer, initialStore);

const getTasks = useCallback(async () => {
try {
const response = await db.collection("tasks").get();
const arrayData = response.docs.map((doc) => ({
id: doc.id,
...doc.data()
}));
dispatch({
type: TYPES.USER_GET_TASKS,
payload: arrayData
});
} catch (error) {
console.log(error);
}
}, [dispatch]);

const value = useMemo(
() => ({
store,
getTasks,
dispatch
}),
[store, getTasks, dispatch]
);

return <UserContext.Provider value={value}>{children}</UserContext.Provider>;
};
希望这有帮助!

关于reactjs - useReducer + Context api + useEffect = 无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65094933/

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