3个点实际上在这里做什么
What does 3 dots actually do here
我看到一个 React 组件 state
如下所示:
class MyComp extends BaseComponent {
constructor(props) {
super(props);
this.state = {
selectedColumns: [],
params: {
offset: 0,
sort_by: {}
}
}
...
}
}
那么这个react组件下面有一个方法getValue
。在这个方法中 allParams
对象是使用扩展语法创建的。 IE。它传播方法参数 params
,然后更新组件状态中的 params
对象。
getValue(params){
const allParams = {
...this.state.params,
...params
}
this.setState((prevState) => {
return {
...prevState,
params: allParams
}
})
...
}
然后在 MyComp
:
的子组件中调用如下
goNext() {
const offset = 15 // IT IS NOT JSON, it is a value 15.
this.props.getValue({
offset
})
}
我看到 setState
没问题,但是 allParams
创建正确吗? params
不能是要与 ...
一起使用的对象 (json) 吗?我错过了什么吗?
在其他情况下,传播语法是这样使用的:
const ob1 = {foo: 123};
const ob2 = {bar: 234};
const merged = {...ob1, ...ob2};
console.log(merged) //Output: { foo: 123, bar: 234 }
但在我的情况下是:
const ob1 = {foo: 123};
const ob2 = 15;
const merged = {...ob1, ...ob2};
console.log(merged) //Output: { foo: 123}, and ob2 is not assigned!
ES6 扩展运算符可用于对象 'spread' 它们的值到另一个对象中以创建该对象的克隆。它在概念上类似于使用 Object.assign
样本
const x = { a : 1 };
const y = {...x}; // y = {a:1} Equivalent to : const y = Object.assign({},x);
const z = {...x , b: 2} // z = {a:1,b:2} Equivalent to Object.assign({a:1},{b:2})
const w = {...x , a: 2} // w = {a:2} Equivalent to Object.assign({a:1},{a:2})
const p = {a:2, ...x} // p={a:1} Equivalent to using Object.assign({a:2},{a:1})
Handy link explaining this in the context of Redux
编辑:基于评论中的讨论:
在您的 goNext
方法中,当发生这种情况时:
this.props.getValue({
offset
})
您实际上正在创建这样一个对象 {offset:15}
。所以当它在 getValue
中使用时,例如:
const allParams = {
...this.state.params,
...params
}
您实质上是用 15 覆盖了旧的偏移值并创建了一个新对象。所以从本质上讲,我们 不是 分布在 15
上,而是分布在 {offset:15}
上
我看到一个 React 组件 state
如下所示:
class MyComp extends BaseComponent {
constructor(props) {
super(props);
this.state = {
selectedColumns: [],
params: {
offset: 0,
sort_by: {}
}
}
...
}
}
那么这个react组件下面有一个方法getValue
。在这个方法中 allParams
对象是使用扩展语法创建的。 IE。它传播方法参数 params
,然后更新组件状态中的 params
对象。
getValue(params){
const allParams = {
...this.state.params,
...params
}
this.setState((prevState) => {
return {
...prevState,
params: allParams
}
})
...
}
然后在 MyComp
:
goNext() {
const offset = 15 // IT IS NOT JSON, it is a value 15.
this.props.getValue({
offset
})
}
我看到 setState
没问题,但是 allParams
创建正确吗? params
不能是要与 ...
一起使用的对象 (json) 吗?我错过了什么吗?
在其他情况下,传播语法是这样使用的:
const ob1 = {foo: 123};
const ob2 = {bar: 234};
const merged = {...ob1, ...ob2};
console.log(merged) //Output: { foo: 123, bar: 234 }
但在我的情况下是:
const ob1 = {foo: 123};
const ob2 = 15;
const merged = {...ob1, ...ob2};
console.log(merged) //Output: { foo: 123}, and ob2 is not assigned!
ES6 扩展运算符可用于对象 'spread' 它们的值到另一个对象中以创建该对象的克隆。它在概念上类似于使用 Object.assign
样本
const x = { a : 1 };
const y = {...x}; // y = {a:1} Equivalent to : const y = Object.assign({},x);
const z = {...x , b: 2} // z = {a:1,b:2} Equivalent to Object.assign({a:1},{b:2})
const w = {...x , a: 2} // w = {a:2} Equivalent to Object.assign({a:1},{a:2})
const p = {a:2, ...x} // p={a:1} Equivalent to using Object.assign({a:2},{a:1})
Handy link explaining this in the context of Redux
编辑:基于评论中的讨论:
在您的 goNext
方法中,当发生这种情况时:
this.props.getValue({
offset
})
您实际上正在创建这样一个对象 {offset:15}
。所以当它在 getValue
中使用时,例如:
const allParams = {
...this.state.params,
...params
}
您实质上是用 15 覆盖了旧的偏移值并创建了一个新对象。所以从本质上讲,我们 不是 分布在 15
上,而是分布在 {offset:15}