react-beautiful-dnd:防止其余可拖动项目重新排序/向上移动并替换正在拖动的项目

问题描述 投票:0回答:2

在单个 Droppable 中,我映射了一个项目数组,每个项目都有自己的 Draggable。我的代码工作正常,并且正在执行预期的操作(即,我可以单独移动每个 Draggable)。我只是想知道是否有办法阻止我的其余 Draggables“向上移动”或替换被拖动的项目留下的空白位置。

这是我的代码(DragDropContext 在另一个组件中,因此此处未显示):

<Droppable
    droppableId='itemDroppable'
    type='acceptsItems'
    isDropDisabled={true} >
    {(provided) =>
        <div ref={provided.innerRef}>

            {this.props.items.map((item, index) =>
                <Draggable
                    key={item.id}
                    draggableId={item.name}
                    index={index} >
                    {provided =>
                        <div
                            ref={provided.innerRef}
                            {...provided.draggableProps}
                            {...provided.dragHandleProps} >
                            {item.icon}
                        </div>
                    }
                </Draggable>
            )}
        
            {provided.placeholder}

        </div>
    }
</Droppable>

这是正在发生的事情的视频:

如您所见,以下其余图标会向上移动并替换从可放置对象中拖出的项目留下的空白位置。有办法阻止这种情况吗?理想情况下,我希望空白位置保持空白,而不是让其余的正在进行的图标向上移动并填满。

提前谢谢您!

javascript reactjs draggable droppable react-beautiful-dnd
2个回答
1
投票

我没有直接的解决方案,但我有一个可以解决这个问题的想法。
当您使用

Array.map()
功能

显示项目时
  • 首先:假设我们向对象添加一些附加信息来跟踪它是否被删除。 添加一个条件,以便在标志为 true 时呈现该元素。 否则,将显示隐藏元素。 注意:我不确定,但我认为你可以使用provide.placeholder
    例如:
{(provided) => (
        <div ref={provided.innerRef}>
            {this.props.items.map((item, index) => {
                if (item.id !== 0) {
                    return (
                        <Draggable
                            key={item.id}
                            draggableId={item.name}
                            index={index}
                        >
                            {(provided) => (
                                <div
                                    ref={provided.innerRef}
                                    {...provided.draggableProps}
                                    {...provided.dragHandleProps}
                                >
                                    {item.icon}
                                </div>
                            )}
                        </Draggable>
                    );
                } else
                    return (
                        <div style={{ width: '20px', height: '20px' }} /> //display hidden undraggable hidden element or try provided.placeholder
                    );
            })}

            {provided.placeholder}
        </div>
    )}
  • 第二:当你在
    onDragEnd()
    中实现删除功能时,我们可以更改该元素的标志。

0
投票

这可能不是正确的解决方案,而是一种解决方法。

<Draggable
    key={item.id}
    draggableId={item.name}
    index={index}
    >
    {(provided, snapshot) => (
        <>
            <div
                ref={provided.innerRef}
                {...provided.draggableProps}
                {...provided.dragHandleProps}
            >
                {item.icon}
            </div>
            {
                snapshot.isDragging && (
                <div style={{ width: '20px', height: '20px' }} />
                )
            }
        </>
        )}
</Draggable>;
© www.soinside.com 2019 - 2024. All rights reserved.