亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

來自自定義鉤子的狀態在父級而不是子級中使用減速器更新

來自自定義鉤子的狀態在父級而不是子級中使用減速器更新

慕哥6287543 2022-06-05 11:02:08
我有一個使用 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 處理大部分數據。
查看完整描述

1 回答

?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

您在子組件中調用的調度函數與父組件中的調度函數不同,它不會更新相同的狀態。鉤子的不同用法useDashboard返回不同的(狀態,調度)對,它們不會相互影響。


如果您希望父組件的狀態可以從子組件更改,但又不想使用上下文 API,則必須將父組件的調度函數(或使用它的回調)作為子組件傳遞給子組件支柱。


const Parent = () => {

  const [state, dispatch] = useDashboard();


  return (

    <Child

      updateFoodSearch={(listItems) =>

        dispatch({ component: "foodSearchBox", listItems })

      }

    />

  );

};


查看完整回答
反對 回復 2022-06-05
  • 1 回答
  • 0 關注
  • 69 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號