【问题标题】:On drag, react-beautiful-dnd doesn't show draggable item in material-ui-next.com persistent drawer在拖动时,react-beautiful-dnd 不会在 material-ui-next.com 持久抽屉中显示可拖动项目
【发布时间】:2018-04-10 09:55:38
【问题描述】:

我有一个persistent drawer,它包含一个带有可拖动项目的可放置列表。该功能在那里,但是在拖动项目时,不会显示正在拖动的项目。我可以完美地拖动项目并且正在分配空间,包括 dnd 框架预期的动画,我只是看不到我在拖动什么。如果我将抽屉更改为永久抽屉,一切都会按预期工作。有什么建议吗?

我的组件(在原型代码中): (DragDropContext 在父组件中声明)

import React from 'react';
import { Divider, Drawer, IconButton, List, ListItem, Paper, 
withStyles } from 'material-ui';
import { Draggable, Droppable } from 'react-beautiful-dnd';

const styles = {
  list: {
    width: 250,
    marginTop: 70
  },
};

const getItemStyle = (isDragging, draggableStyle) => ({
  // some basic styles to make the items look a bit nicer
  userSelect: 'none',
  padding: 8 * 2,
  margin: `0 0 8px 0`,

  // change background colour if dragging
  background: isDragging ? 'lightgreen' : 'red',

  // styles we need to apply on draggables
      ...draggableStyle,

});

const getListStyle = isDraggingOver => ({
  background: isDraggingOver ? 'lightblue' : 'none',
  padding: 8,
  width: 250,
});

class WidgetDrawer extends React.Component {

  state = { items: [{ id: 1, content: 'Widget A'}, { id: 2, content: 'Widget B'}]};

  renderWidgets() {
    const widgets = [{
      name: 'Widget A'
    }, {
      name: 'Widget B'
    }];

    return widgets.map((widget, index) => {
      return <Draggable key={widget.name} draggableId={widget.name} index={index}>
                  {(provided, snapshot) => (
                    <div>
                      <div
                        ref={provided.innerRef}
                        {...provided.draggableProps}
                        {...provided.dragHandleProps}
                        style={getItemStyle(
                          snapshot.isDragging,
                          provided.draggableProps.style
                        )}
                      >
                        <ListItem>
                          <Paper>
                            {widget.name}
                          </Paper>
                        </ListItem>
                      </div>
                      {provided.placeholder}
                    </div>
                  )}
                </Draggable>
    })
  }

  render() {

    const { classes } = this.props;

    const fullList = (
      <div className={classes.list}>
          <Droppable droppableId="droppable">
          {(provided, snapshot) => (
            <div
              ref={provided.innerRef}
              style={getListStyle(snapshot.isDraggingOver)}
            >
              {this.state.items.map((item, index) => (
                <Draggable key={item.id} draggableId={item.id} index {index}>
                  {(provided, snapshot) => (
                    <div>
                      <div
                        ref={provided.innerRef}
                        {...provided.draggableProps}
                        {...provided.dragHandleProps}
                        style={getItemStyle(
                          snapshot.isDragging,
                          provided.draggableProps.style
                        )}
                      >
                        {item.content}
                      </div>
                      {provided.placeholder}
                    </div>
                  )}
                </Draggable>
              ))}
              {provided.placeholder}
            </div>
          )}
        </Droppable>
      </div>
    );

    return (
     <Drawer
       variant='permanent'
       anchor="right"
       open={this.props.open}
       onClose={this.props.toggleDrawer}>
      <div
        tabIndex={0}
        role="button"
        onClick={this.props.toggleDrawer}
        onKeyDown={this.props.toggleDrawer}
      >
        {fullList}
      </div>
    </Drawer>
    )
  }
}

export default withStyles(styles)(WidgetDrawer);

【问题讨论】:

  • 我实际上注意到被拖动的组件向右移动了大约像素的窗口宽度。如果我开始拖动并将光标一直移动到屏幕的左侧,则会显示拖动的组件。这可能与抽屉固定在右侧的事实有关..
  • 未来:github.com/mui-org/material-ui/pull/16281我的公关刚刚合并,所以这已成为过去:)

标签: material-ui drawer


【解决方案1】:

这可以通过覆盖

中提供的道具来解决
const getItemStyle = (isDragging, draggableStyle) => ({
  ...draggableStyle,
  userSelect: 'none',
  position:static,
  padding: 8 * 2,
  margin: `0 0 8px 0`,
  background: isDragging ? 'lightgreen' : 'red',    
});

【讨论】:

  • Tnx 用于回答。然而,这是一个非常古老的问题。我不再处理这个问题了。
【解决方案2】:

对于其他为此苦苦挣扎的人。这很可能是因为您的父元素上有一个转换集。即使它是零变换,它也会弄乱固定子节点的变换。因此,唯一已知的解决方案是删除父级上的转换(或将其设置为“无”)。

或者您可以尝试使用 React Portal 来寻找替代解决方案。

https://github.com/atlassian/react-beautiful-dnd/issues/128

【讨论】:

  • 该死的,浪费了几个小时。谢谢老兄。
【解决方案3】:

在“转换”后在 Material-UI 抽屉中使用 react-beautiful-dnd 时,我遇到了同样的问题,可拖动项目会消失。

但是,您可以通过将可放置列表的 transform 属性设置为 none 并阻止从 Drawer 或任何其他转换后的元素继承转换来防止这种行为。

<Droppable style={{ transform: "none" }} droppableId="droppable">

【讨论】:

    【解决方案4】:

    如果这里的任何答案都不起作用,我建议使用他们的reparenting guide。 基本上他们已经实现了一个克隆 api,它将被拖动的元素克隆到 dom 的根目录。据说它比使用门户网站更高效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-29
      • 2019-08-25
      • 2022-08-24
      • 1970-01-01
      • 2020-05-05
      • 2022-10-13
      • 2020-09-27
      • 2021-04-15
      相关资源
      最近更新 更多