【问题标题】:react redux updating array based on index根据索引反应redux更新数组
【发布时间】:2019-03-10 02:07:14
【问题描述】:

我正在使用 react 学习 redux。我正在尝试根据单击按钮更新一组数字。我特别想根据导入的 json 文件更新特定索引处的计数器。

import React, { Component } from 'react'
import { connect } from 'react-redux'
import { upVote, downVote } from '../store/actions/voteAction';

class Voter extends Component {
    render() {
        const { count, upVote, downVote, id} = this.props
        return (
            <div>
                <button onClick={() => upVote(id)}>+</button>
                The count is {count[id]}
                <button onClick={() => downVote(id)}>-</button>
            </div>
        )
    }
}

const mapDispatchToProps = dispatch => ({
    upVote: (payload) => dispatch(upVote(payload)),
    downVote: (payload) => dispatch(downVote(payload))
  });

const mapStateToProps = (state) => ({
    count: state.vote.count

})
export default connect(mapStateToProps, mapDispatchToProps)(Voter);

我认为我的问题在于我如何在减速器中传递和更新有效负载。

import {UP_VOTE,DOWN_VOTE} from '../actions/actionTypes'
import Mice from './../../imports/mice'
const initialState = {
    count: new Array(Mice.length).fill(0)
}


const voteReducer = (state=initialState, action) => {
    const id = action.payload
    switch(action.type){
        case UP_VOTE:
            return{
            ...state, count: state.count[id] + 1
            }
        case DOWN_VOTE:
            return{
            ...state, count: state.count[id] - 1
            }
        default:
            return state
    }

}

export default voteReducer;

我更新了数组,但每个索引仍在变化,而且似乎我仍在变异 count 数组而不是其中的索引。

我已将所有代码上传到 CodeSandbox 以供查看和试验: CodeSandbox Link

感谢阅读

【问题讨论】:

  • 我正在运行您的代码,因为我可以看到您没有将正确的 id 传递给选民组件的 upvote 函数。每次它为 id 记录 0 或 1 时
  • 我在选民组件中的console.log(id) 低于const { count, upVote, downVote, id} = this.props 并且我在我的控制台中获得了所有100多个索引。你可以说得更详细点吗?你是如何得到 1 或 0 的?谢谢
  • 啊,你得到了答案:)

标签: javascript reactjs redux react-redux


【解决方案1】:

使用map 方法创建一个新数组,添加更改一个元素。 Redux 开关将是:

switch (action.type) {
  case UP_VOTE:
    return {
      ...state,
      count: state.count.map((vote, i) => (i === id ? vote + 1 : vote))
    };
  case DOWN_VOTE:
    return {
      ...state,
      count: state.count.map((vote, i) => (i === id ? vote - 1 : vote))
    };
  default:
    return state;
}

工作代码在这里https://codesandbox.io/s/74pmomo42j

【讨论】:

  • 谢谢你。我什至没有想到使用map 函数,即使我在另一个组件中使用了它。
  • 当您需要从旧状态创建新状态时,这是一种典型的方式。您可以使用它来映射对象。
猜你喜欢
  • 2020-08-19
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2020-01-24
相关资源
最近更新 更多