在状态中使用ES6的Map
非常容易。您需要使用ReactDOM
和ReactDOM.render(document.getElementById('someid'), map.get("123"));
。但是,为了在优化方面获得任何有利的好处,这需要更复杂一些。它可能只对某些应用程序有用。
为了避免严格地抽象讲话,让我们来看一个示例应用程序:DOM是HTML <table>
,而ReactJS状态是坐标和值的Map
。 <td>
元素将具有坐标ID,例如id="pos-1,2"
将是第一行第二列的位置。现在状态可能看起来像...
this.state = {
'coordinates': Map({'1,2':'my 1/2 text!', '4,5':'my 4/5 text!'}),
};
要更新状态,你可以使用 updateState()
...
updateState(newmap) {
const coordinates = this.state.coordinates;
newmap.keys().forEach((key) => {
const parent = document.getElementById('pos' + key);
const text = newmap.$key;
ReactDOM.unmountComponentAtNode(parent);
ReactDOM.render(parent, (<span>{text}</span>);
coordinates.set(key, text);
});
this.state.setState({'coordinates':coordinates});
}
那么,这里发生了什么?我们可以随时使用表格网格上的任何位置更新状态。例如,如果我们已经有500个带有文本的网格,我可以添加一个网格文本字段,并使用this.updateState(Map({'1000,500':'my text at position 1000x500!'}));
。通过这种方式,Map()
可以在状态中使用,并保留其单个更改的O(1)查找优势,因为我们的updateState()
处理它。
这也绕过了大部分render()
的使用,但这是一个设计决策。我以1,000x1,000表格网格为例,因为当使用render()
时,拥有1,000^2个唯一的、有状态的元素会产生巨大的负载/处理时间,在这种情况下,Map()
将工作得很好。