文档教程组合 CRDT

组合 CRDT

在 Loro 中,可以用 List、MovableList、Map、Tree 等基础 CRDT 搭建复杂数据结构。容器可以嵌套子容器,子容器又可继续嵌套,由此组合出多层结构。

需要注意:Loro 文档必须呈树形结构——父节点可以有多个子节点,但每个子节点只能有一个父节点,因此文档是树而不是图(例如 DAG)。

借助这些基础 CRDT,你可以有效建模符合 JSON schema 的文档状态与增量更新。

const  = new ();
const  = .("map");
let  = 0;
// 子容器产生的事件会沿着父链向上传播。
.(() => {
  .();
  ++;
});
 
// 为 map 创建子容器
// { map: { list: [] } }
const  = .("list", new ());
.(0);
.(1);
 
// 为 list 创建子容器
// { map: { list: [0, 1, LoroText] } }
const  = .(2, new ());
(.()).({ : { : [0, 1, ""] } });
{
  // 提交时会触发事件,因为 list 是 map 的子容器
  .();
  await new (() => (, 1));
  ().(1);
}
 
.(0, "Hello, ");
.(7, "World!");
(.()).({ : { : [0, 1, "Hello, World!"] } });
{
  // 提交时也会触发事件,因为 text 是 map 的后代容器
  .();
  await new (() => (, 1));
  ().(2);
}