对解构变量进行赋值是否合适?

Is it appropriate to do assignment to destructured variables?

我已经这样声明了state

 this.state = { filtersEnabled: false}

后来我destructured这个对象如下,

let { filtersEnabled } = this.state;

现在,我想更改 filtersEnabled

的值
filtersEnabled = true

当我做 console.log(this.state.filtersEnabled) 时,答案是 => false,

但是如果我按如下方式更改值

 this.state.filtersEnabled = true

现在如果我在做 console.log(this.state.filtersEnabled) 时做,答案是 => true,

这里有什么问题,

1.con我们没有对 destructured 变量进行任何赋值吗?或者

2.con我们没有对 destructured 状态变量进行任何赋值吗?

没有。通过销毁变量,它被转换为局部变量并且状态是全局的,所以你需要做的是 this.state.filtersEnabled = true 在状态中全局重新分配它以在 class.

中的任何地方使用

通过 this.state.filtersEnabled = true 它会重新评估值,但是如果您需要重新渲染视图,那么您必须像 this.setState({ filtersEnabled: true});

当您像这样更改值时:

 this.state.filtersEnabled = true

您正在更改 属性 的值。但是当您像这样更改值时:

 filtersEnabled = true

您基本上为 filtersEnabled 分配了一个新值。不再有对原始值的引用。

考虑这个例子:

let a = 1;
let b = a;
a++;

你认为 b2 吗?不是,因为 ++,像 +== 都是创建 new 赋值的运算符。

这也是为什么我们需要 let 来处理这些情况。 const 不允许我们进行更改。

然而,这确实改变了两者:

const a = { val: 1 };
const b = a;
a.val++;

b指向同一个对象。我们从不重新分配 a(这也是我们可以在这里使用 const 的原因),但我们确实重新分配 属性 of a(和 b)。所以仍然是同一个对象,但是我们在对象内部修改了一些东西。

在 React 中,当您想更新 state 时,您应该通过 this.setState 方法传递,而不是直接改变状态。

Do Not Modify State Directly

执行 this.statedestructuring 将根据从被解构的对象中获取的不同键的值创建新变量。这将失去任何类型的元素与引用的耦合,因为只有对象键可以在它们发生变化的地方引用它们的主要引用。

let person = {
  "name": "John Doe",
  "age": 40
};

person.name = "Jeanne Doe";

console.log(person);

let { name } = person;
name = "Scott Duck"
console.log(person);

正如你在上面的例子中看到的那样,在我解构 person 对象后,name 变量不再与 person 对象紧密相关,我们失去了引用到 person.name 属性.

当您访问 filtersEnabled 时,您不再访问具有相同名称的组件状态的值,而是访问该变量在特定时间保存的值。

为了严格控制状态中的值,请使用 this.setState 改变状态并通过 this.state.filtersEnabled 或使用结构化值进行访问 如果您知道创建的变量所持有的值来自解构将与 state 中的值相同,可以在 render 内部完成,只要我们知道 render 方法大部分时间将在状态更改时执行。