Redux派送-从阵列中删除项目/错误的阵列长度输出

时间:2018-10-15 12:23:06

标签: arrays reactjs redux

我在Redux中有一个动作,它的全部作用是删除3项硬编码数组中的最后一项。

它工作正常,但是我还有第二个属性(dataLength),用于计算数组的长度。当我分派动作时,我想从数组中删除最后一项,并同时更新数组长度。

发生的事情是将项目从数组中删除,但是长度(dataLength)直到我再次分派动作后才更新。

所以我有两个问题:

  1. 我的dataLength属性设置为null,是否可以在初始状态下获取数组的长度?

  2. 如何在第一次发送后立即正确更新dataLength?

谢谢

减速机

const initialState = {
    data: [
        {
            id: 0,
            title: 'title 1'
        },
        {
            id: 1,
            title: 'title 2'
        },
        {
            id: 2,
            title: 'title 3'
        }
    ],
    dataLength: null
}

const data = (state = initialState, action) => {
    switch(action.type) {
        case 'DECREMENT_DATA':
            return { ...state, data: state.data.filter((item) => item.id !== action.id), dataLength: state.data.length }
        default:
            return state;
    }
}

export default data;

动作

export function decrement() {
    return {
        type: 'DECREMENT_DATA',
        id: 2
    }
}

组件

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { decrement } from '../actions/decrement';

class Decrement extends Component {
    render() {
        return (
            <button onClick={this.props.decrement}>Decrement -</button>
        );
    }
}

const mapStateToProps = ((state) => {
    return {
        data: state.data
    }
});

const mapDispatchToProps = ((dispatch) => {
    return bindActionCreators({
        decrement
    }, dispatch)
});

export default connect(mapStateToProps, mapDispatchToProps)(Decrement);

2 个答案:

答案 0 :(得分:1)

在减速器中,由于当前长度是从当前状态列表而不是过滤列表中确定的,因此您没有正确更新长度

const data = (state = initialState, action) => {
    switch(action.type) {
        case 'DECREMENT_DATA':
            const newList = state.data.filter((item) => item.id !== action.id)
            return { ...state, data: newList, dataLength: newList.length }
        default:
            return state;
    }
}

答案 1 :(得分:0)

您应该返回此:

case 'DECREMENT_DATA':   
    const updatedArray= state.data.filter((item) => item.id !== action.id)   
    return { ...state, data:updatedArray , dataLength: updatedArray.length }

原因是当您使用state.data.length时,您仍在访问旧状态值