当前位置: 首页 > 面试题库 >

React-redux存储更新,但React不

苏鸿波
2023-03-14
问题内容

在此请忍受,因为这个问题与我使用React,Redux或react-
redux的第一个测试应用有关。Docs使我步入正轨,并且我有一个可以正常工作的模拟银行应用程序。我的状态对象大致如下所示:

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

我只有两个动作:

1.
CHANGE_HASH(如网址哈希中所示)。此操作始终按预期工作,而reducer所做的只是更新state.activePageId(是的,我正在克隆状态对象而不是对其进行修改)。完成该操作后,我可以看到Redux存储中的状态已更改,并且可以看到React已更新。

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

2.
ADD_TRANSACTION(表单提交)。该操作从不更新React,但始终更新Redux存储。该操作state.accounts[0].balancestate.accounts[0]简化程序正在更新,并将事务对象添加到数组.transactions中。我没有收到任何错误,React只是没有更新。但是,如果我派遣一个CHANGE_HASH actionReact,它将赶上并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仓库:

部署银行演示

ps我撒谎说没有任何错误。我确实有很多警告

“”警告:数组或迭代器中的每个子代都应具有唯一的“键”属性…“

我已经给他们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/问题排查

我还建议您看一下Redux的Flux比较中的Shopping Card示例,因为它显示了如何更新嵌套对象而不以与您要的类似的方式对嵌套对象进行变异。

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



 类似资料:
  • 我不明白为什么不更新我的对象。在另一个组件中,我通过调度更新状态。在此情况下(在下面的代码中),mapStateToProps类别中的代码正在更改(控制台日志显示另一个类别)。但组件并没有重播,虽然在组件中我使用了道具。类别。事件控制台。登录元素未运行 我认为,如果我更新状态,则根据该状态更新组件。它应该如何工作?它应该如何工作?它可能很有用,添加类别的项不是父项或子项,而是邻居 谢谢你解决问题。

  • 目录 为何组件没有被重新渲染、或者 mapStateToProps 没有运行? 为何组件频繁的重新渲染? 怎样使 mapStateToProps 执行更快? 为何不在被连接的组件中使用 this.props.dispatch ? 应该只连接到顶层组件吗,或者可以在组件树中连接到不同组件吗? React Redux 为何组件没有被重新渲染、或者 mapStateToProps 没有运行? 目前来看,

  • 我正在尝试学习React(使用redux),所以我正在制作一个应用程序,在其中我可以创建训练计划,将训练添加到计划中,然后将训练添加到训练中。 PlanListComponent 我的PlansList组件为每个计划呈现一张卡片。在这张卡片中,它为该计划中的每个训练呈现一个训练列表。将训练添加到计划后,“计划列表”组件不会重新渲染。添加的训练仅在我刷新页面后显示。我之所以选择这种情况,是因为我必须

  • 我没有太多的运气使用redux版本的React-Router。当我将产品添加到购物车中时,位置确实会改变,但页面不会更新。 ./减速器 ./行动

  • 问题内容: 我只是做一个简单的应用程序来学习与redux异步。我已经使所有工作正常进行,现在我只想在网页上显示实际状态。现在,我实际上如何在render方法中访问商店的状态? 这是我的代码(所有内容都在一页中,因为我只是在学习): 因此,在状态的render方法中,我想列出商店中的所有内容。 谢谢 问题答案: 您应该创建单独的组件,该组件将侦听状态更改并在每次状态更改时进行更新:

  • 我只是做了一个简单的应用程序学习异步与Redux。我已经使所有的工作,现在我只想显示的实际状态到网页上。现在,我如何在render方法中实际访问存储的状态? 这里是我的代码(所有内容都在一个页面中,因为我只是在学习): 谢谢