我有一個使用 useReducer 的自定義鉤子,它控制在儀表板上呈現哪些組件。它在父組件中按預期工作,但是當我在子組件中使用它時,useReducer 運行,狀態發生了變化,但它在父組件中沒有改變,所以它沒有通過適當的更改重新渲染。我在減速器中使用擴展運算符返回一個新對象。我已經在鉤子內嘗試了一些帶有額外 useStates 和 useEffects 的 hacky 東西,但它們都沒有產生影響。我嘗試了不同級別的解構,也沒有效果。我可以看到狀態正在更改,但在父對象中返回時似乎沒有被識別為新對象。自定義掛鉤import { useReducer } from "react"let dashboard = {}export const dashboardReducer = (state, action) => { console.log("dashboardReducer: state, action=", state, action) switch (action.component) { case 'lowerNav': switch (action.label) { case 'journal': return { ...state, lowerNav: 'journal'} case 'progress': return { ...state, lowerNav: 'progress'} case 'badges': return { ...state, lowerNav: 'badges'} case 'challenges': return { ...state, lowerNav: 'challenges'} case 'searchResults': return { ...state, lowerNav: 'searchResults'} } case 'foodSearchBox' : if (action.searchResults) { return { ...state, searchResults: action.searchResults, lowerNav: "searchResults"} } else { return { ...state, searchResults: "NO SEARCH RESULTS"} } default: throw new Error() }}export const useDashboard = () => { const [ state, dispatch ] = useReducer(dashboardReducer, dashboard) //fires on every dispatch no matter which component console.log("useDashboard: state=", state) return [ state, dispatch ]}export const initDashboard = initialState => { dashboard = initialState}我正在嘗試從最初使用 useState 鉤子在各處傳遞的大量凌亂的道具鉆孔中重構。我正在使用 Next.js,我試圖遠離使用 Context API 或引入 Redux。我真的只需要在單個頁面組件上保持狀態,它實際上只是本地 UI 狀態,因為我正在使用 apollo-hooks 處理大部分數據。
來自自定義鉤子的狀態在父級而不是子級中使用減速器更新
慕哥6287543
2022-06-05 11:02:08