React-redux 存储更新但 React 没有

React-redux store updates but React does not

请耐心等待,因为这个问题与我使用 React、Redux 或 react-redux 的第一个测试应用程序有关。文档使我走得更远,我有一个大部分可用的模拟银行应用程序。我的状态对象大致如下所示:

{
 activePageId: "checking",
 accounts: [
  checking: {
    balance: 123,
    transactions: [
      {date, amount, description, balance}
    ]
  }
 ]
}

我只有两个动作:

1. CHANGE_HASH(如 url 散列)。此操作始终按预期工作,reducer 所做的只是更新 state.activePageId(是的,我正在克隆状态对象而不是修改它)。操作完成后,我可以看到 Redux store 中的状态发生了变化,我可以看到 React 已经更新。

function changeHash(id) {
        return {
            type: "CHANGE_HASH",
            id: id
        }
}

2. ADD_TRANSACTION(表单提交)。这个动作从不更新 React,但它总是更新 Redux store。此操作的缩减器正在更新 state.accounts[0].balance 并将事务对象添加到数组 state.accounts[0].transactions。我没有收到任何错误,只是 React 没有更新。但是,如果我发送 CHANGE_HASH action React 将赶上并正确显示所有 ADD_TRANSACTION 状态更新。

function addTransaction(transaction, balance, account) {
    return {
        type: "ADD_TRANSACTION",
        payload: {
            transaction: transaction,
            balance: balance,
            account: account
        }
    }
}

我的减速器...

    function bankApp(state, action) {
        switch(action.type) {
            case "CHANGE_HASH":
                return Object.assign({}, state, {
                    activePageId: action.id
                });
            case "ADD_TRANSACTION":
            // get a ref to the account
                for (var i = 0; i < state.accounts.length; i++) {
                    if (state.accounts[i].name == action.payload.account) {
                        var accountIndex = i;
                        break;
                    }
                }

            // is something wrong?
                if (accountIndex == undefined)  {
                    console.error("could not determine account for transaction");
                    return state;
                }

            // clone the state
                var newState = Object.assign({}, state);

            // add the new transaction
                newState.accounts[accountIndex].transactions.unshift(action.payload.transaction);

            // update account balance
                newState.accounts[accountIndex].balance = action.payload.balance;

                return newState;
            default:
                return state;
        }

我的 mapStateToProps

    function select(state) {
        return state;
    }

我在这里错过了什么?我的印象是 React 应该随着 Redux store 的更新而更新。

Github repo:

Deployment bank demo

p.s。我谎称没有任何错误。我确实有很多警告

""Warning: Each child in an array or iterator should have a unique "key" prop..."

我已经给了他们一个键 prop 设置为它的索引。不过我怀疑这与我的问题有什么关系。

问题出在这段代码中:

// clone the state
var newState = Object.assign({}, state);         

// add the new transaction

newState.accounts[accountIndex].transactions.unshift(action.payload.transaction);

// update account balance
newState.accounts[accountIndex].balance = action.payload.balance;

克隆状态对象并不意味着您可以改变它所引用的对象。我建议您阅读有关不变性的更多信息,因为它不是这样工作的。

Redux“故障排除”文档中详细描述了此问题及其解决方案,因此我建议您阅读它们。

https://redux.js.org/troubleshooting

我还建议您查看 Flux Comparison for Redux 中的 Shopping Card 示例,因为它展示了如何更新嵌套对象而不用与您所要求的类似的方式改变它们。

https://github.com/voronianski/flux-comparison/tree/master/redux