Я объявил state
вот так,
this.state = { filtersEnabled: false}
а позже я destructured
этот объект следующим образом,
let { filtersEnabled } = this.state;
Теперь я хочу изменить значение filtersEnabled
,
filtersEnabled = true
когда я делаю console.info(this.state.filtersEnabled)
, ответ => false
,
Но если я изменю значение следующим образом
this.state.filtersEnabled = true
Теперь, если я делаю, когда делаю console.info(this.state.filtersEnabled)
, ответ => true
,
В чем проблема,
1. Продолжаем ли мы присваивать destructured
переменным? или
2. Продолжаем ли мы присваивать destructured
переменным состояния?
Деструктуризация здесь совершенно неуместна, у вас будет тот же результат с let filtersEnabled = this.state.filtersEnabled;
JavaScript это язык передачи по значению, вы не получите ссылку на примитив, когда создаете для него переменную.
Нет. При уничтожении переменной она преобразуется в локальную переменную, а состояние становится глобальным, поэтому вам нужно this.state.filtersEnabled = true
переназначить ее глобально в состоянии для использования везде в классе.
Выполняя this.state.filtersEnabled = true
, он будет переоценивать значение, но если вам нужно повторно отобразить представление, вам нужно сделать так, как this.setState({ filtersEnabled: true});
1. состояние не является глобальной переменной. 2. Объем переменных не имеет значения.
Я отразил в своем ответе и обновил его
Когда вы меняете значение следующим образом:
this.state.filtersEnabled = true
Вы меняете значение свойства. Но когда вы меняете значение следующим образом:
filtersEnabled = true
По сути, вы присваиваете новое значение filterEnabled. Больше нет ссылки на исходное значение.
Рассмотрим этот пример:
let a = 1;
let b = a;
a++;
Вы ожидаете, что b
будет 2
? Нет, потому что ++
, как и +=
и =
, — это операторы, создающие новое присваивание.
Вот почему нам нужен let
для этих случаев. const
не позволит нам вносить изменения.
Это, однако, меняет оба:
const a = { val: 1 };
const b = a;
a.val++;
b
указывает на тот же объект. Мы никогда не переназначаем a
(именно поэтому мы можем использовать const
здесь), но мы переназначаем свойство a
(и b
). Итак, все тот же объект, но мы изменили что-то внутри объекта.
В React, когда вы хотите обновить state
, вы должны пройти через метод this.setState
вместо того, чтобы напрямую изменять состояние.
Не изменять состояние напрямую
Выполнение destructuring
из this.state
создаст новую переменную на основе значений различных ключей, полученных из деструктурированного объекта. Это приведет к потере любого вида связи элемента со ссылкой, поскольку только ключи объекта могут ссылаться на их основную ссылку, где бы они ни изменялись.
let person = {
"name": "John Doe",
"age": 40
};
person.name = "Jeanne Doe";
console.info(person);
let { name } = person;
name = "Scott Duck"
console.info(person);
Как вы можете видеть в примере выше, после того, как я деструктурировал объект person
, переменная name
больше не привязана к объекту person
, мы теряем ссылку на свойство person.name
.
Когда вы получаете доступ к filtersEnabled
, вы больше не получаете доступ к значению состояния компонента с тем же именем, но вы получаете доступ к значению, которое эта переменная хранит в определенное время.
Чтобы придерживаться значения в состоянии, используйте this.setState
для изменения состояния и доступа через this.state.filtersEnabled
или со структурированным значением. Если вы знаете, что значение, которое хранится в созданной переменной из деструктуризации, будет таким же, как значение в делается внутри state
, если мы знаем, что метод рендеринга в большинстве случаев будет выполняться при изменении состояния.
filtersEnabled
— это просто переменная с логическим значением. Любое переназначение на него не повлияет наstate
объект. И вы не должны обновлять состояние вот такthis.state.filtersEnabled = true
. Вам нужно использоватьsetState