如何在 flux 中正确传递不可变 js 对象
How to properly pass immutablejs object in flux
我在应用程序中使用react+flux。我正在尝试使用不可变的 js 来加快渲染过程,因为每次我对状态进行任何小的更改时,react 都会尝试协调所有 DOM(这很慢)。
我遇到的问题是,在我的商店.js内,我可以将我的状态转换为不可变的 Map 对象。但是,一旦此对象传递到应用,它就不再被识别为 Map 对象,而只是一个普通对象。这意味着我无法使用 Map 对象附带的任何集合或获取函数
这是我到目前为止所拥有的:
商店.js
var Immutable = require("immutable");
var Store = function(){
var jsState = { object1 : "state of object 1",
object2 : "state of object 2"}
this.globalState = Immutable.fromJS(globalState);
this._getGlobalState = function(){
//console will log: Map { size=2, _root=ArrayMapNode, __altered=false, more...}
//this.globalState.get("object1"); will work
console.log(this.globalState);
return this.globalState;
}
}
应用.js
var Store = require("./Store.js");
var Map = require("immutable").Map
var App = React.createClass({
getInitialState: function(){
return ({});
},
componentWillMount: function()
this._getStateFromStore(); //will get the immutable state from the store
},
_getStateFromStore: function()
{
return this.setState(Store._getGlobalState());
},
render: function(){
//this will return Object { size=2, _root=ArrayMapNode, __altered=false, more...}
//this.state.get("object1") will NOT work
console.log(this.state);
return <div>This is in App</div>
}
});
我在这里做错了什么吗?我是否缺少任何文件中的任何模块?非常感谢!
因此
,您实际上不能强制State
对象是不可变的对象。相反,您必须将不可变对象存储在您的状态中。
因此,您需要执行以下操作:
getInitialState: function(){
return ({
data: Immutable.Map({})
});
},
...
_getStateFromStore: function()
{
return this.setState({
data: Store._getGlobalState()
});
},
Facebook在这个问题上有一个很好的例子。
相关文章:
- 在不可变JS中更新列表中的对象
- 什么是不可变.js中的“所有者ID”
- 如何使用不可变JS对列表中的项目进行计数
- 如何将新项推送到不可变JS中的深度嵌套记录中
- reux-form和不可变.js
- 如何检查两个不可变JS映射是否具有相同的键
- 如何在不可变JS中存储和更新深度嵌套的结构
- 不可变.js:删除集中的项目
- 使用不可变 JS 更新映射列表中的一个键
- 不可变JS.Set - 根据布尔值添加或删除
- 覆盖不可变.js实例的 getter 逻辑
- 将不可变.js地图列表转换为列表列表,然后将其用作Google图表的数据
- 如何在 flux 中正确传递不可变 js 对象
- 不可变.js映射集与更新
- 不可变js地图填充
- 不可变JS延迟Seq链式方法
- 不可变JS比较嵌套结构
- ShallowCompare不能用于不可变js
- 如何为不可变js类型写一个流类型定义
- 不可变js-创建或更新嵌套在映射中的列表