我使用Material UI
和react-beautiful-dnd
来创建一个非常简单的Grid
列布局,其中的元素可以重新排序。然而,我遇到了一个很难解释的元素之间的间距问题,所以我只给你看一个GIF:
我不知道这个问题是从哪里来的,甚至不知道该怎么称呼它。在内部,Grid
的spacing
属性是使用padding
实现的,我甚至找不到任何关于为什么它不能与拖放系统一起工作的信息。下面是代码的主要部分:
import { makeStyles } from "@material-ui/core";
import { Grid, Paper } from "@material-ui/core";
import { DragDropContext, Draggable, Droppable } from "react-beautiful-dnd";
import { produce } from "immer";
function ReorderQuestion(props) {
const [items, setItems] = useState(props.items);
const classes = useStyles();
function onDragEnd({ source, destination }) {
if (!destination) {
return;
}
if (
destination.droppableId === source.droppableId &&
destination.index === source.index
) {
return;
}
setItems(
produce(draft => {
draft.splice(destination.index, 0, draft.splice(source.index, 1)[0]);
})
);
}
return (
<DragDropContext onDragEnd={onDragEnd}>
<Droppable droppableId="reorderQuestion" direction="horizontal">
{provided => (
<div {...provided.droppableProps} ref={provided.innerRef}>
<Grid spacing={3} container direction="row">
{items.map((imageSrc, index) => (
<Grid item key={imageSrc}>
<Draggable draggableId={imageSrc} index={index}>
{(provided, snapshot) => (
<Paper
innerRef={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
elevation={
snapshot.isDragging && !snapshot.isDropAnimating
? 5
: 2
}
className={classes.option}
>
<img src={imageSrc} alt="Hiking" />
</Paper>
)}
</Draggable>
</Grid>
))}
{provided.placeholder}
</Grid>
</div>
)}
</Droppable>
</DragDropContext>
);
}
const useStyles = makeStyles(theme => ({
option: {
padding: theme.spacing(2)
}
}));
2条答案
按热度按时间km0tfn4u1#
找到了解决方案,感谢Reactiflux Discord上的@mal#8537。
问题是
innerRef
被提供给了Paper
组件,而Paper
组件实际上并不包含间距--也就是说,它没有使用边距。Grid item
,其父组件,使用填充来实现间距,因此,必须在Draggable
内移动,并提供innerRef
(和draggableProps
),以便正确拖动间距。我只是将
items.map
的内部替换为:8hhllhi22#
我尝试了@naiveal提出的解决方案,但不幸的是,它对我不起作用。为了解决这个问题,我添加了一个额外的div,其高度等于可拖动元素中的边距高度,这解决了这个问题。虽然它可能不是最优雅的解决方案,但它对我来说很好。我希望这个解决方案对遇到类似问题的任何人都有帮助。