reactjs - 根据拖放位置在 Firestore 中对文档进行排序
问题描述
我的目标是渲染我的LinkContainer
组件,以便它们在我的拖放上下文中:
<DragDropContext onDragEnd={handleOnDragEnd}>
<Droppable droppableId="characters">
{(provided) => (
<ul
className="characters"
{...provided.droppableProps}
ref={provided.innerRef}
>
{links.map((l, index) => {
return (
<Draggable key={l.id} draggableId={l.id} index={index}>
{(provided) => (
<li
className="draggable"
{...provided.draggableProps}
{...provided.dragHandleProps}
ref={provided.innerRef}
>
<LinkContainer
linkTitle={l.linkTitle}
/>
</li>
)}
</Draggable>
);
})}
</ul>
)}
</Droppable>
</DragDropContext>
links
这是允许我在设置新顺序的同时拖放的功能:
const reorder = (links, startIndex, endIndex) => {
const result = Array.from(links);
const [removed] = result.splice(startIndex, 1);
result.splice(endIndex, 0, removed);
return result;
};
// handle drag end
const handleOnDragEnd = (result) => {
console.log(result);
setLinks(reorder(links, result.source.index, result.destination.index));
};
如何更新我的 firebase 记录,以便在重新加载页面LinkContainer
时映射到最后的顺序?links
我是否必须在文档本身上创建一个索引并使用LinkContainer
解决方案
根据您添加属性以将其用作索引的建议,我想分享以下意见:
例如,使用这种方法,您需要更新列表中的所有元素,以便在数据库中重新创建新订单,每次移动对象时都会执行此操作。
如果这是一个小集合,这会起作用,但是如果您的集合有很多对象,或者如果您移动对象很多,这将转化为大量的读写操作。
在最坏的情况下
(documents in collection) * (# of movements)
另一种选择是创建一个具有所需顺序的数组(数组在他的顺序上总是静态的),例如这是集合中对象的默认状态
["1a","1c","2b","3x"]
但是在前端的动作之后,这看起来像这样
["1a","2b","3x","1c"]
前端的状态可以存储在一个单独的集合中的一个文档内的一个数组中,为了不修改原始对象,避免在每次移动中重新更新所有元素,但这将继续受到数量的影响用户在前端执行的动作,并且您需要根据集合上文档的创建或删除来更新数组。
您必须按照数组顺序以所需的方式显示您的信息。
最后一种选择,也许效率较低,每次移动发生时都重写完整的集合(使用前端快照),重写集合算作一次写入操作,但这可能会在未来产生并发操作的问题。
推荐阅读
- c++ - 使用 iptables 共享来自两个不同连接的 Internet 连接
- java - 在Spring配置中模拟命名bean而不使用allow-bean-definition-overriding?
- jquery - 如何避免在悬停时重新缩放?
- android - Dagger Hilt - 如何将 ViewModel 注入适配器?
- apache-kafka - 暂停和恢复 KafkaConsumer
- javascript - 在 DataTable 中未按 id 找到元素
- flutter - 我们可以在没有 Slivers 的情况下滚动时缩小小部件吗?
- typescript - 通过 ES6 导入导入 commonJS 模块,类型'typeof import 上不存在属性
- swift - 在 swiftui 中学习父视图和子视图之间的数据
- node.js - 使用请求的nodeJS POST方法