对解构变量进行赋值是否合适?
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++;
你认为 b
是 2
吗?不是,因为 ++
,像 +=
和 =
都是创建 new 赋值的运算符。
这也是为什么我们需要 let
来处理这些情况。 const
不允许我们进行更改。
然而,这确实改变了两者:
const a = { val: 1 };
const b = a;
a.val++;
b
指向同一个对象。我们从不重新分配 a
(这也是我们可以在这里使用 const
的原因),但我们确实重新分配 属性 of a
(和 b
)。所以仍然是同一个对象,但是我们在对象内部修改了一些东西。
在 React 中,当您想更新 state
时,您应该通过 this.setState
方法传递,而不是直接改变状态。
执行 this.state
的 destructuring
将根据从被解构的对象中获取的不同键的值创建新变量。这将失去任何类型的元素与引用的耦合,因为只有对象键可以在它们发生变化的地方引用它们的主要引用。
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 方法大部分时间将在状态更改时执行。
我已经这样声明了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++;
你认为 b
是 2
吗?不是,因为 ++
,像 +=
和 =
都是创建 new 赋值的运算符。
这也是为什么我们需要 let
来处理这些情况。 const
不允许我们进行更改。
然而,这确实改变了两者:
const a = { val: 1 };
const b = a;
a.val++;
b
指向同一个对象。我们从不重新分配 a
(这也是我们可以在这里使用 const
的原因),但我们确实重新分配 属性 of a
(和 b
)。所以仍然是同一个对象,但是我们在对象内部修改了一些东西。
在 React 中,当您想更新 state
时,您应该通过 this.setState
方法传递,而不是直接改变状态。
执行 this.state
的 destructuring
将根据从被解构的对象中获取的不同键的值创建新变量。这将失去任何类型的元素与引用的耦合,因为只有对象键可以在它们发生变化的地方引用它们的主要引用。
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 方法大部分时间将在状态更改时执行。