在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ redux中state更新了 頁(yè)面沒(méi)改變

redux中state更新了 頁(yè)面沒(méi)改變

使用了redux和react-redux

reducer的部分代碼如下

//給初始狀態(tài)一個(gè)默認(rèn)值:{money: 0}
export function reducer(state = {money: 0}, action) {
    switch (action.type) {
        case ADD:
        //使用Object.assign,在調(diào)試的過(guò)程發(fā)現(xiàn)state確實(shí)改變了,但是頁(yè)面沒(méi)有變化,而使用擴(kuò)展運(yùn)算符則可以。
            // return Object.assign(state, {money: (state.money + 1)});
            return {...state, ...{money: state.money + 1}};

        case SUBTRACTION:
            return {...state, ...{money: state.money - 1}};
        default:
            return state;
    }
}

請(qǐng)問(wèn)有大牛知道原因嗎

回答
編輯回答
愛(ài)礙唉

文檔

文檔上有這么一句話 :
不能這樣使用 Object.assign(state, { visibilityFilter: action.filter }),因?yàn)樗鼤?huì)改變第一個(gè)參數(shù)的值。你必須把第一個(gè)參數(shù)設(shè)置為空對(duì)象。
應(yīng)該把我的代碼改成這樣
Object.assign({},state, {money: (state.money + 1)})

2017年10月23日 00:37
編輯回答
互擼娃

樓上正解。
react比較propsstate的引用,你只是修改對(duì)象屬性值,引用沒(méi)有變。

2017年10月28日 14:55
編輯回答
伐木累

樓上說(shuō)的對(duì)。
你用 Object.assign(state, ...) 是直接修改了 state 對(duì)象,然后返回的還是原來(lái)的 state 對(duì)象(被修改過(guò)的),而 redux 會(huì)通過(guò)引用來(lái)判斷前后兩次 state 有沒(méi)有變化。return 原來(lái)的 state 的話 redux 會(huì)認(rèn)為你的 state 沒(méi)有變化。
而擴(kuò)展符則是創(chuàng)建了一個(gè)新的對(duì)象,相當(dāng)于

Object.assign({}, state, ...)

希望對(duì)你有幫助

2017年8月29日 03:50