反应。如何在setState中使用数组索引的键?

时间:2018-04-26 22:54:12

标签: javascript reactjs

所以,这是我的代码。关于如何将state元素与indexin key一起使用,我有一个简单的问题?在这种情况下,我需要为不同的data索引元素设置不同的值。

import React, { Component } from 'react';
import {Doughnut} from 'react-chartjs-2';

class Chart extends Component {
    constructor(props) {
        super(props);

        this.state = {
            labels: ["All", "Done", "Active"],
            datasets: [{
                label: "Todos",
                backgroundColor: 'grey',
                borderColor: 'green',
                data: [0, 0, 0]
            }]
        };
    }

    getTodosList = (todos) => {
        const all = [];
        const active = [];
        const done = [];

        todos.filter(todo => {
            if (todo.status === 'active') {
                active.push(todo);
            } else if (todo.status === 'all') {
                all.push(todo);
            } else if (todo.status === 'done') {
                done.push(todo);
            }
        });

        this.setState({
            datasets[0].data[0]: all, // error
            datasets[0].data[1]: active, // error
            datasets[0].data[2]: done // error
        });
    }

2 个答案:

答案 0 :(得分:1)

很简单:

this.setState({
    datasets: [...this.state.datasets,
        {
            data: [all.length, active.length, done.length]
        }
    ]
});

开始像Redux一样思考。使用纯函数。它会帮助你。我也根据你的开始data了解 - 您可能需要使用length的{​​{1}} ...

答案 1 :(得分:0)

setState函数不知道它必须用您的代码替换哪个对象。您还没有正确访问数据集变量,它应该是this.state.datasets。你可以这样做:

let datasets = this.state.datasets.slice();
datasets[0].data[0] = all;
datasets[0].data[1] = active;
datasets[0].data[2] = done;
this.setState({datasets});