Уместно ли делать присвоение деструктурированным переменным?

Я объявил 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 переменным состояния?

filtersEnabled — это просто переменная с логическим значением. Любое переназначение на него не повлияет на state объект. И вы не должны обновлять состояние вот так this.state.filtersEnabled = true. Вам нужно использовать setState
adiga 10.12.2020 07:29

Деструктуризация здесь совершенно неуместна, у вас будет тот же результат с let filtersEnabled = this.state.filtersEnabled; JavaScript это язык передачи по значению, вы не получите ссылку на примитив, когда создаете для него переменную.

VLAZ 10.12.2020 07:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
155
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Выполняя this.state.filtersEnabled = true, он будет переоценивать значение, но если вам нужно повторно отобразить представление, вам нужно сделать так, как this.setState({ filtersEnabled: true});

1. состояние не является глобальной переменной. 2. Объем переменных не имеет значения.

VLAZ 10.12.2020 07:41

Я отразил в своем ответе и обновил его

Nooruddin Lakhani 10.12.2020 07:46
Ответ принят как подходящий

Когда вы меняете значение следующим образом:

 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 здесь), но мы переназначаем свойство ab). Итак, все тот же объект, но мы изменили что-то внутри объекта.

В 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, если мы знаем, что метод рендеринга в большинстве случаев будет выполняться при изменении состояния.

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