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

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

反應掛鉤。將值作為參數傳遞給 useReducer()

反應掛鉤。將值作為參數傳遞給 useReducer()

千巷貓影 2023-06-29 15:54:32
這是我第一次使用 useReducer() 鉤子,我面臨一個問題,我需要向它傳遞一個值作為參數。這是我的減速器的樣子:  const memoizedReducer = useCallback((state, action) => {    switch (action.type) {      case "save":        const refreshedBookData = {          ...state.bookData,          ...(state.bookData.totalSaves >= 0 && {            totalSaves: state.bookData.totalSaves + 1,          }),          isSaved: true,        };               // Add the new book data to a Map which I have in a Context provider        currentUser.addBookToVisitedBooks(bookId, refreshedBookData);                // Update my context provider data        currentUser.setData((prevCurrentUserData) => {          eturn {            ...prevCurrentUserData,            ...(prevCurrentUserData.totalSaves >= 0 && {              totalSaves: prevCurrentUserData.totalSaves + 1,            }),          };        });                return refreshedBookData;    case "unsave":        const refreshedBookData = {          ...state.bookData,          ...(state.otheBookData.totalSaves >= 0 && {            totalSaves: state.bookData.totalSaves - 1,          }),          isSaved: false,        };        // Add the new book data to a Map which I have in a Context provider        currentUser.addBookToVisitedBooks(bookId, refreshedBookData);              // Update my context provider data        currentUser.setData((prevCurrentUserData) => {          return {            ...prevCurrentUserData,            ...(prevCurrentUserData.totalSaves > 0 && {              totalSaves: prevCurrentUserData.totalSaves - 1,            }),          };        });                return refreshedBookData;          default:        return state;});const [{ bookData }, dispatch] = useReducer(memoizedReducer, {   bookData: params?.bookData});正如你所看到的,我正在做的是:1-如果操作類型是“保存”,則增加書籍的總保存次數,將新書籍數據添加到我在上下文中擁有的“visitedBooks”地圖(忽略這部分),并更新我的當前用戶數據,增加他的總節省。2-如果操作類型是“未保存”,我會執行相反的操作。
查看完整描述

2 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

您已經將一個對象傳遞給dispatch()并且沒有什么可以阻止您添加 apayload和type:


dispatch({ 

  type: saved ? "save" : "unsave",

  payload: reviews,

});

這樣您就可以訪問您的減速器 ( ) 中的評論action.payload。


const reducer = (state, action) => {

  // action has `type` and `payload` properties

}


查看完整回答
反對 回復 2023-06-29
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

當您調用該dispatch方法時,您將傳遞一個具有該type字段的對象。這個對象的格式實際上是由你來定義的。如果您需要傳遞以外的參數也type可以隨意這樣做。


例如



const reviews = {....} ; /// reviews??

dispatch({ type: 'save', payload: reviews });


然后在你的減速器中你可以得到payload對象


// Reducer?


const reducer = (state, action) => {

? ? switch (action.type) {

? ? ? ? case 'save':

? ? ? ? ? ? const reviews = action.payload;

? ? ? ? ? ? //.....

? ? ? ? ? ? break;

? ? }

}

查看完整回答
反對 回復 2023-06-29
  • 2 回答
  • 0 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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