Как изменить свойство в состоянии, имя которого является значением переменной?

У меня есть быстрый вопрос о reactjs, на который, надеюсь, кто-нибудь сможет ответить. Давайте будем краткими и милыми.

Имею недвижимость в состоянии:

    this.state = {
        property: []
    }

Это свойство представляет собой массив. Я хотел бы изменить одно из свойств внутри массива:

    this.setState({
        property:{
            index: value,
        }
    });

У меня есть 'index' переданный как переменная в мою функцию изменения состояния. Индекс - это число. Значение индекса будет чем-то вроде «0», «1», «2» ... и т. д. Выполнение того, что я сделал выше, установит значение свойства index, которое мне не нужно. Как мне вместо этого изменить значение свойства, имя которого хранится в переменной index?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
93
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Думаю, вы ищете что-то вроде этого:

const index = 'dummy'
const value = 69
this.setState({
    property:{
        [index]: value,
    }
});

// after the state updated 
console.info(this.state.property.dummy); // 66

Я не думаю, что это то, что он / она ищет. Это массив, а не объект.

Andrew 28.03.2018 19:33

Свойство в состоянии - это массив, но это массив объектов, так что это действительно работает.

FlamePrinz 28.03.2018 19:49

@FlamePrinz О, тогда моя ошибка

Andrew 28.03.2018 20:00

Не изменяйте напрямую ничего в this.state. Вы должны позволить React обрабатывать это, поэтому сделайте мелкую копию и манипулируйте этим.

const newProperty = [...this.state.property];
newProperty[index] = value;
this.setState({property: newProperty});

Если вы хотите использовать ES5 для создания копии, сделайте это:

const newProperty = this.state.property.slice();

Вы создаете копию, предполагая, что index - это позиция, в которой вы хотите, чтобы произошло изменение, а value - это новое значение, которое вы можете использовать

this.setState({
        property: this.state.property.map((anItem, i) => (i === index) ? value : anItem) 
    });

Если ваше реальное состояние имеет больше свойств, вам нужно использовать это

this.setState({
        ...this.state,
        property: this.state.property.map((anItem, i) => (i === index) ? value : anItem) 
    });

Другие вопросы по теме