Как динамически получить имя массива состояний React

Как я могу динамически установить имя массива в состоянии, чтобы получить его из состояния.

onCheckBoxItemClickList(e, value, path) {
    console.log(e.target.checked)
    if (e.target.checked) {
        //append to array
        this.setState({
            [path]: this.state.[path].concat([value])
        })
    } else {
        //remove from array
        this.setState({
            [path]: this.state.[path].filter(function (val) {
                return val !== value
            })
        })
    }
}

Я знаю, как динамически устанавливать и получать состояние ключа, но когда я пытаюсь сделать

[path]: this.state.[path].concat([value])

Я получаю следующую ошибку:

Изображение ошибки

Любая помощь будет принята с благодарностью, спасибо


person Andrew Irwin    schedule 10.01.2019    source источник


Ответы (1)


У вас есть лишняя точка в коде (после состояния):

[path]: this.state.[path].concat([value])

Должно быть:

[path]: this.state[path].concat([value])

Затем всякий раз, когда вы хотите установить состояние на основе предыдущего состояния, вы должны использовать setState, который принимает обратный вызов, с prevState в качестве аргумента.

Итак, ваш код должен выглядеть примерно так:

onCheckBoxItemClickList(e, value, path) {
    console.log(e.target.checked)
    if (e.target.checked) {
        //append to array
        this.setState(prevState => ({
            [path]: prevState[path].concat([value])
        }))
    } else {
        //remove from array
        this.setState(prevState => ({
            [path]: prevState[path].filter(function (val) {
                return val !== value
            })
        }))
    }
}
person quirimmo    schedule 10.01.2019
comment
Спасибо большое. Немного сбивает с толку то, что если вы хотите указать имя массива/ключ состояния (не динамически), для этого требуется точка заранее, но для динамического выполнения точка не требуется. Этот ответ stackoverflow.com/a/43985409/2208342 о переполнении стека сделал состояние намного более понятным для меня и показал мне это состояние является объектом. - person Andrew Irwin; 10.01.2019