库从不替你决定撤销能保留多久。你要求留住某个节点,也由你决定何时放手。
保留已删除节点
const operation = effects.remove(element, {
retain: true,
});
await operation.finished;
const id = operation.removalId;
retain: true 会把分离的原节点存入内部 Map,键为不透明的 RemovalId。节点不会被移动到隐藏容器或 DocumentFragment。
取出并恢复
take(id) 返回节点,同时从存储中删除强引用。
if (id) {
const retained = effects.take(id);
if (retained) {
destination.append(retained);
effects.restore(retained);
}
}
应用可选择 append、prepend、before 或框架自己的插入方法;库只读取插入后的最终几何位置。
不恢复并释放引用
effects.discard(removalId); // boolean
effects.discardAll(); // 释放的条目数
destroy() 也会清空所有保留节点。
控制内存
这里没有 TTL,也没有条目数量上限。库不会在背后删除内容,也不会替你自动清理。每个未使用的 RemovalId 最终都必须由 take() 消费、通过 discard() 释放,或由 discardAll() 批量清理。
撤销何时失效由应用决定,例如提示关闭、路由切换或历史记录提交时。
永久删除
不传 retain 时,对库而言这次删除已经是永久的:
effects.remove(element); // retain: false
操作完成后,操作对象与库的存储都不会继续保留该元素。