在列表元素上设置免打扰后,我在移动设备上滚动列表时遇到了问题.

我有一张卡片 list .我希望每一张牌都是可拖拽的.

我使用了TouchAction:‘None’,如果没有它,在不拖动的情况下滚动是有问题的:滚动时手指下的卡片也在拖动.现在,拖拽行得通,但滚动行不通.

这是我的代码:

export const CardComponent = forwardRef((props: CardComponentProps) => {
  const { style, attributes, listeners, setNodeRef } = props;

  const onCardClick = () => {};

  return (
    <div style={style} {...attributes} {...listeners} ref={setNodeRef as React.ForwardedRef<HTMLDivElement>}>
      <Card onClick={onCardClick}>{/* ...content */}</Card>
    </div>
  );
});
export const SortableItem = ({ id }: SortableItemProps) => {
  const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id });

  const style = {
    transform: CSS.Translate.toString(transform),
    transition,
    touchAction: 'none',
    zIndex: isDragging && 35,
  };

  return (
    <Wrapper className="mt-5">
      <CardComponent setNodeRef={setNodeRef} style={style} attributes={attributes} listeners={listeners} />
    </Wrapper>
  );
};
export const Dropable = ({ lists, handleDragEnd }: DropableProps) => {

  const sensors = useSensors(
    useSensor(PointerSensor, {
      activationConstraint: {
        distance: 8,
      },
    }),
    useSensor(KeyboardSensor, {
      coordinateGetter: sortableKeyboardCoordinates,
    }),
  );

  return (
    <Wrapper>
      {lists && (
        <DndContext
          sensors={sensors}
          collisionDetection={closestCenter}
          onDragEnd={handleDragEnd}
          modifiers={[restrictToVerticalAxis, restrictToFirstScrollableAncestor]}
        >
          <SortableContext items={lists?.map((item) => item.Id as string)} strategy={verticalListSortingStrategy}>
            {lists?.map(({ Id: id }) => {
              return <SortableItem key={id} id={id as string} />;
            })}
          </SortableContext>
        </DndContext>
      )}
    </Wrapper>
  );
};

我试着把拖拽按钮放在按钮上,只放了TouchAction:‘None’,但 comments 者不接受.这张卡必须没有按钮,因为它太小了,放不下按钮.

推荐答案

你需要修改你的传感器.卸下指针传感器,使用鼠标传感器和touch 传感器,并在touch 传感器中设置延迟. 同时删除TouchAction:‘None’.

就像这样:

  const sensors = useSensors(
    useSensor(MouseSensor, {
      activationConstraint: {
        distance: 8,
      },
    }),
    useSensor(TouchSensor, {
      activationConstraint: {
        delay: 300,
        tolerance: 8,
      },
    }),
    useSensor(KeyboardSensor, {
      coordinateGetter: sortableKeyboardCoordinates,
    }),
  );

阅读更多here

如果以上建议不适合您的使用 case ,我们建议您同时使用鼠标和touch 传感器,因为touch 事件不会受到与指针事件相同的限制,并且可以阻止页面在touch 移动事件中滚动.

here

Reactjs相关问答推荐

props 可以在Reaction中锻造吗?

Reaction路由的问题-在Effect使用API调用响应设置状态之前呈现页面

以下代码是否存在安全问题?

取消 Select 较高组件中的所有行

如何使用react-router-dom保护嵌套在受保护路由中的嵌套路由?

Material-UI 和 React Hook 表单不记录值

MERN,将动态列表中的元素插入数组

如何更新 FunctionComponentElement 的 props

画布:用鼠标绘制形状时重新绘制整个画布会导致卡顿

在React Router 6中,在路由渲染后更新路由数据

基于 React/NextJS Timer 的文本淡入/淡出不起作用

如何读取 null 的属性?

使用 nextjs App Router 在动态客户端进行服务器端渲染

React + Redux:数据未正确传递给具有动态路由的组件

在 React 中使用复选框管理状态

从其他组件切换 FieldSet

在 Spring Cloud Gateway 中运行的 React SPA 页面刷新出现白标错误

react-admin useGetIdentity 只返回全名,id 未定义 头像未定义

React LinkProps 的含义

仅react material 表前端分页