根据拖放位置在 firestore 中订购文档

IT技术 reactjs firebase google-cloud-firestore
2021-05-10 03:35:55

我的目标是渲染我的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

1个回答

根据您添加属性以将其用作索引的建议,我想分享以下意见:

例如,使用这种方法,您需要更新列表中的所有元素,以便在数据库上重新创建新订单,每次移动对象时都会执行此操作。

如果这是一个小集合,这会起作用,但是如果您的集合有很多对象,或者如果您经常移动对象,这将被转换为大量读写操作。

在最坏的情况下

(documents in collection) * (# of movements)

另一种选择是创建一个具有所需顺序的数组(数组在他的顺序上总是静态的),例如这是集合中对象的默认状态

["1a","1c","2b","3x"]

但是在前端的动作之后,这看起来像这样

["1a","2b","3x","1c"]

前端的状态可以存储在一个单独集合的文档内的数组中,以免修改原始对象,避免每次移动都重新更新所有元素,但这会继续影响数量用户在前端执行的动作,您还需要根据集合上文档的创建或删除来更新数组。

您必须按照数组顺序以所需的方式显示您的信息。

最后一种选择,也许效率较低,每次发生移动时都重写完整的集合(使用前端快照),重写集合算作一次写入操作,但这可能会在未来的并发操作中产生问题。