将列表渲染到DOM并管理其状态与管理简单变量的状态大相径庭。
一些库使用特殊的标识符,称为“键”,来启用其增量渲染引擎,从而确定发生了哪些更改以及需要移动哪些内容:```javascript {friends.map(friend =>
<code>
另一种无需任何猜测的方法是使用可观察集合:一种在更改时发出事件的数组,其中包含有关已更改元素的详细信息,以便渲染引擎可以捕获这些信息并确定渲染页面上更改的最佳方法。在与Rimmel.js一起使用时,这就是可观察集合的用途:
```javascript
class Item {
// 定义项目结构
}
const initial = [ /* 初始数据 */ ];
const data = new ObservableCollection(initial, Item);
const addNew = async () => {
const newItem = await newItemForm.show();
data.push(newItem);
};
document.body.innerHTML = rml`
<ul>
${data}
</ul>
<button onclick=${addNew}>添加新项目</button>
`;</code>
可观察集合巧妙地代理了所有数组方法,rimmel中的collectionsink知道,一个新项目需要附加到列表的末尾。如果调用.unshift(),它知道需要在开头插入一个新项目,以此类推。
想要替换集合的全部内容?.assign()方法只做这件事,并导致渲染引擎简单地替换DOM中的整个列表。同样,对集合的所有其他变异操作都会将信息传递给Sink,以便它准确地知道要执行哪种DOM变异来反映更改。没有猜测,没有过度设计的DOM差异,总体上非常轻量级、快速。
如果您想亲身体验使用ObservableTypes的便捷性,请尝试一下:











