使用 Object.asassigned 替换状态
Replace state using Object.assign
对于这个状态{ key: bool }
的 React 组件,为什么当单击不同的选项时,新状态中没有省略现有的状态键?
https://jsfiddle.net/69z2wepo/35003/
var Hello = React.createClass({
getInitialState: function() {
return {};
},
render: function() {
return (
<div>
<div onClick={this.handleClick.bind(this, 'foo')}>Foo</div>
<div onClick={this.handleClick.bind(this, 'bar')}>Bar</div>
<div onClick={this.handleClick.bind(this, 'baz')}>Baz</div>
<div>{ 'Foo State: ' + this.state.foo }</div>
<div>{ 'Bar State: ' + this.state.bar }</div>
<div>{ 'Baz State: ' + this.state.baz }</div>
</div>
);
},
handleClick: function(id) {
this.setState(Object.assign({}, { [id]: !this.state[id] } ));
}
});
以下是正在发生的事情:
- 单击
Foo
:状态变为{ foo: true }
(预期) - 单击
Foo
:状态变为{ foo: false }
(预期) - 单击
Foo
:状态变为{ foo: true }
(预期) - 单击
Bar
:状态变为{ foo: true, bar: true }
(非预期)
我使用 Object.assign
的目的是清除任何现有状态并将其替换为新的键/布尔对。
有人可以解释为什么在步骤 4 中,{ foo: true }
保持状态吗?
如何在不必知道哪个选项以前处于活动状态的情况下清除现有状态?
--
(注意:我在原始帖子之后添加了最后一行,因为知道为什么setState
的行为方式而不知道该怎么做并不是很有帮助。我会接受基于原始帖子的答案。请参阅我的答案,了解用未弃用的 API 替换状态的半干净方法)。
setState
本身旨在将新状态与现有状态合并(并根据需要更新键)。您永远不会用新对象替换整个状态。
还值得注意的是,在这种情况下无需调用Object.assign
。你对setState
的呼唤应该只是:
this.setState({ [id]: !this.state[id] });
如果您希望自己处理合并,则需要改用replaceState
(这会给您所需的行为):
this.replaceState(Object.assign({}, { [id]: !this.state[id] });
setState
合并到键中,而不是完全覆盖状态。
replaceState
已被弃用(如果您尝试使用它,请参阅此处,此处,此处,此处和控制台),正如Justin/Andy所解释的那样,setState
将始终合并,永远不会替换。
我能想到的清除现有状态的最干净的方法是将初始状态设置为 { active: {} }
,然后根据需要使用此单行代码切换或替换:
this.setState({ active: (this.state.active[id]) ? {} : { [id]: true } });
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 我如何找到一个句子中的所有空格并替换忽略它们
- 事件和状态
- 如何用更合适的内容替换document.write
- 获取选择框的状态
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 相位器状态未捕获参考错误
- 如何更改reactjs中外部/独立组件的状态或属性
- 在DOM中查找一个模式并替换它's的内容使用jquery
- 如何使用密码检测网络中的状态连接
- 用空格替换下划线PHP
- Ember.js-接口状态应该存储在哪里
- 使用 Object.asassigned 替换状态
- 如何将同步 ajax 调用替换为凭据以保持应用状态稳定
- 使用javascript将一个字符动态替换为另一个字符,而不将页面返回到初始状态
- 在反应状态下替换数组中的对象
- getInitialState()替换现有状态.如何在React中传递现有状态
- 如何替换图像上的点击和重置为原来的退出悬停状态后
- 我是否通过替换对象中的整个数组来改变我的reducer状态
- JQuery History.js插件在HTML4和HTML5浏览器中都不替换一个页面的状态