美文网首页
ReactDnD单一目标(例子)

ReactDnD单一目标(例子)

作者: ikonan | 来源:发表于2022-03-08 14:36 被阅读0次

这是最简单的拖放示例。

拖动下面的框并将它们放入垃圾箱。 请注意,它具有正常、活动和悬停状态。 拖动的项目本身会在拖动时更改不透明度。

image.png

ItemType.ts

export const ItemTypes = {
  BOX: 'box',
};

Box.tsx

import { FC, CSSProperties } from 'react';
import { useDrag } from 'react-dnd';

import { ItemTypes } from './ItemTypes';

const style: CSSProperties = {
  border: '1px dashed gray',
  backgroundColor: 'white',
  padding: '0.5rem 1rem',
  marginRight: '1.5rem',
  marginBottom: '1.5rem',
  cursor: 'move',
  float: 'left',
};

export interface BoxProps {
  name: string;
}

interface DropResult {
  name: string;
}

export const Box: FC<BoxProps> = ({ name }) => {
  const [{ isDragging }, drag] = useDrag(() => ({
    type: ItemTypes.BOX,
    item: { name },
    end: (item, monitor) => {
      const dropResult = monitor.getDropResult<DropResult>();
      if (item && dropResult) {
        alert(`You dropped ${item.name} into ${dropResult.name}!`);
      }
    },

    collect: (monitor) => ({
      isDragging: monitor.isDragging(),
      handlerId: monitor.getHandlerId(),
    }),
  }));

  const opacity = isDragging ? 0.4 : 1.0;

  return (
    <div ref={drag} role="Box" style={{ ...style, opacity }}>
      {name}
    </div>
  );
};

Dustbin.tsx

import { FC, CSSProperties } from 'react';
import { ItemTypes } from './ItemTypes';
import { useDrop } from 'react-dnd';

const style: CSSProperties = {
  height: '12rem',
  width: '12rem',
  marginRight: '1.5rem',
  marginBottom: '1.5rem',
  color: 'white',
  padding: '1rem',
  textAlign: 'center',
  fontSize: '1rem',
  lineHeight: 'normal',
};

export const Dustbin: FC = (props) => {
  const [{ canDrop, isOver }, drop] = useDrop(() => ({
    accept: ItemTypes.BOX,
    drop: () => ({ name: 'Dustbin' }),
    collect: (monitor) => ({
      canDrop: monitor.canDrop(),
      isOver: monitor.isOver(),
    }),
  }));

  const isActive = canDrop && isOver;
  let backgroundColor = '#222';
  if (isActive) {
    backgroundColor = 'darkgreen';
  } else if (canDrop) {
    backgroundColor = 'darkkhaki';
  }

  return (
    <div ref={drop} style={{ ...style, backgroundColor }}>
      {isActive ? 'Release to drop' : 'Drag a box here'}
    </div>
  );
};

index.tsx

import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';

import { Dustbin } from './Dustbin';
import { Box } from './Box';

const Page: React.FC<any> = (props) => {
  return (
    <DndProvider backend={HTML5Backend}>
      <div style={{ padding: '32px' }}>
        <div>
          <Dustbin />
        </div>
        <div>
          <Box name="Glass" />
          <Box name="Banana" />
          <Box name="Paper" />
        </div>
      </div>
    </DndProvider>
  );
};

export default Page;

相关文章

  • ReactDnD单一目标(例子)

    这是最简单的拖放示例。 拖动下面的框并将它们放入垃圾箱。 请注意,它具有正常、活动和悬停状态。 拖动的项目本身会在...

  • ReactDnD复制和移动(例子)

    这个例子演示了可以接受复制和移动的拖放效果的拖放目标,用户可以在拖放时按住alt键或释放alt键来进行切换。 例如...

  • ReactDnD(DndProvider)

    DndProvider 组件为您的应用程序提供 React-DnD 功能。 这必须通过 backend prop ...

  • ReactDnD(DragPreviewImage)

    将 HTML Image 元素呈现为断开连接的拖动预览的组件。 使用方法 Props connect: 必需的。拖...

  • 高级heatmap绘制ComplexHeatmap

    ComplexHeatmap handbook中文介绍实例我的简单一个例子 例子2

  • ReactDnd-概述

    React DnD不同于大多数拖放库,如果你以前从未使用过它,它可能会令人生畏。然而,一旦你对其设计的核心概念有所...

  • jdk动态代理的缺点

    1、在拦截器中除了能调用目标对象的目标方法之外,功能是比较单一的,在这个例子中只能处理事务2、在拦截器中的invo...

  • 第二讲《拼命,是最糟糕的努力姿势》

    一、本讲分享:目标单一过度聚焦,带来的危害。 二、例子 1、三国的司马懿,身体太好了。 (1)曹操死了,他没死。曹...

  • 刻意练习(三)

    五、刻意练习的数量与质量 刻意练习不是简单枯燥的内容单一、方法单一、形式单一的重复练习。 我们先来看一个例子,比如...

  • 单一销售目标SSO

    今天参加了《信任五环》销售课程的学习,有很多的概念颠覆了我以往的认知,我把学到的“单一销售目标”来复盘一下。 这次...

网友评论

      本文标题:ReactDnD单一目标(例子)

      本文链接:https://www.haomeiwen.com/subject/cpearrtx.html