我已经在一个 React 应用程序中成功实现了 Beautiful DnD,其中可拖动的项目是 Material UI 扩展面板。我有使用 onDragEnd 并将新排序列表保存在状态中的项目列表。
我正在使用 React 钩子、useState、Material-UI 扩展面板和 React-Beautiful-DnD。
当应用程序的这一部分加载时,第一个扩展面板被展开,所有其他面板被折叠。
我一直在尝试的是如何关闭扩展面板 [onDragStart | onBeforeDragStart | onDragUpdate] 然后打开扩展面板 onDragEnd。
我已将每个扩展面板的状态以及其他信息存储在一个数组中,该数组循环并呈现每个扩展面板:{ name: string, expand: string, ... }
我认为这是一个状态没有更新到扩展面板没有接受更改的问题。
我尝试在项目上使用 snapshot.isDragging 来更改扩展面板的展开状态,甚至尝试针对特定的扩展面板,在状态列表中找到相应的项目并更新扩展的道具 onDragStart、onBeforeDragStart 和 onDragUpdate。到目前为止,这些都没有奏效。
这是处理 DnD 的组件的一部分
const newArray = ReorderList(srcList, ixSelectedItem, 0);
const panelState: Array<ExpansionState> = [];
// eslint-disable-next-line array-callback-return
newArray.map(item => {
panelState.push({
name: item as string,
expanded: item === selectedItem,
isDragging: false
});
});
const [itemListWithState, setItemListWithState] = useState(panelState);
const handleOnDragEnd = (result: any): void => {
const { destination, draggableId, source } = result;
if (!destination) {
return;
}
if (destination.droppableId === source.droppableId && destination.index === source.index) {
return;
}
const newList = ReorderList(itemListWithState, source.index, destination.index) as Array<ExpansionState>;
const ix = newList.findIndex(item => item.name === draggableId);
newList[ix].isDragging = false;
newList[ix].expanded = !newList[ix].expanded;
setItemListWithState(newList);
};
const handleOnDragUpdate = (result: any): void => {
const { draggableId } = result;
const ix = itemListWithState.findIndex(item => item.name === draggableId);
if (!itemListWithState[ix].isDragging) {
itemListWithState[ix].expanded = !itemListWithState[ix].expanded;
itemListWithState[ix].isDragging = true;
}
};
...
...
return (
<DragDropContext onDragEnd={handleOnDragEnd} onDragUpdate={handleOnDragUpdate}>
<Droppable droppableId="list">
{(provided, snapshot) => {
return (
<div ref={provided.innerRef} {...provided.droppableProps}>
{itemListWithState.map((item: ExpansionState, index: number) => {
return (
<Draggable key={item.name} draggableId={item.name} index={index}>
{(provided, snapshot) => {
return (
<div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>
<GraphContainer id={item.name} isGraphExpanded={item.expanded} {...props}></GraphContainer>
</div>
);
}}
</Draggable>
);
})}
{provided.placeholder}
</div>
);
}}
</Droppable>
</DragDropContext>
);
这是容纳扩展面板的组件:
return (
<div style={{ margin: '20px 0' }}>
<Panel
expanded={props.isGraphExpanded}
summaryTitle={getResourceString(props.id, Resources.Performance)}
summaryDetail={props.graph}
isDraggable={true}
subPanel={
<Panel
expanded={false}
summaryTitle={getResourceString(props.id, Resources.DataTable)}
summaryDetail={props.table}
isDraggable={false}
></Panel>
}
></Panel>
</div>
);