React-dnd js库学习

安装React-dnd库

$ yarn add react-dnd 
$ yarn react-dnd-html5-backend

在需要拖动的组件中引入这两个库( 这里以main.js,需要拖拽那个组件就使用DndProvider包裹即可  )

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

<DndProvider backend={HTML5Backend}>
<App/>
</DndProvider>

App.js代码

import React, { useState } from 'react'
import Cart from './components/cart'

export default function App () {
  const [carts, setCarts] = useState([
    { id: 1, text: '卡片1' },
    { id: 2, text: '卡片2' },
    { id: 3, text: '卡片3' },
  ])
  const moveCart = (dragIndex, hoverIndex) => {
    // 获取被移动的元素
    const dragEle = carts[dragIndex]
    const newCarts = [...carts]
    newCarts.splice(dragIndex, 1)
    newCarts.splice(hoverIndex, 0, dragEle)
    setCarts(newCarts)
  }
  return (
    <div>
      {carts.map((item, index) => {
        return <Cart key={item.id} text={item.text} index={index} moveCart={moveCart} />
      })}
    </div>
  )
}

  src/components/cart.js

import React, { useRef } from 'react'
import { useDrag, useDrop } from 'react-dnd'
const style = {
  width: '300px',
  backgroundColor: 'red',
  padding: '10px',
  margin: '5px',
}
export default function Cart ({ text, index, moveCart }) {
  const [, drop] = useDrop({
    // 一个字符串,放置目标,只会对指定类型的拖动源发生反应
    accept: 'cart',
    collect: () => ({}),
    hover (item, monitor) {
      // 获取当前拖动元素的索引
      const dropIndex = item.index
      // 当前正在hover的index
      const hoverIndex = index
      // 表示拖动元素和放置的元素的位置一样
      if (dropIndex === hoverIndex) return
      // 获取元素的高度
      const { bottom, top } = ref.current.getBoundingClientRect()
      // 获取拖动元素高度的一半
      const halfOfHoverHeight = (bottom - top) / 2
      // 获取鼠标的位置
      const { y } = monitor.getClientOffset()
      // 鼠标移动的高度
      const hoverClientY = y - top
      // 判断移动的高度
      if ((dropIndex < hoverIndex && hoverClientY > halfOfHoverHeight) || (dropIndex > hoverIndex && hoverClientY < halfOfHoverHeight)) {
        // 调用方法 让组件重新渲染
        moveCart(dropIndex, hoverIndex)
        // 移动后位置的索引  = 当前鼠标hover元素的索引
        item.index = hoverIndex
      }
    }
  })
  let ref = useRef() // { current:null }
  // 结构出的 isDragging 是hooks提供的一种方法 将拖动源链接到react-dnd系统中
  // drag 是DragSource 是拖动源的连接器 链接真是DOM
  let [{ isDragging }, drag] = useDrag({
    // type 表示属性 表示拖拽的类型
    type: 'cart',
    // item 用来描述拖动源的一个普通js对象
    item: () => { return { text, index } },
    // collect 收集 是用来收集属性的 返回一个js对象,并且将返回值合并到组件的属性中
    // monitor 监视器 里面存放的是拖动的状态,当状态发生改变时会通知组件,重新获取属性并且组件进行刷新
    collect: (monitor) => {
      return {
        isDragging: monitor.isDragging(),
      }
    }
  })
  // 当开始拖动时 isDragging 为true 设置其透明度
  let opacity = isDragging ? .1 : 1
  // 使用drag方法 将拖动源链接到react-dnd系统中
  drag(ref)
  drop(ref)
  return (
    <div ref={ref} style={{ ...style, opacity }}>{text}</div>
  )
}

    最后看下效果(有点模糊将就看)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
react-dnd 是一个用于拖放操作的 React 。它提供了一些组件和工具,使我们能够轻松地将拖动操作集成到我们的 React 应用中。 要使用 react-dnd,我们需要先安装它。可以使用 npm 命令行工具完成安装: ``` npm install --save react-dnd react-dnd-html5-backend ``` 我们需要安装 react-dndreact-dnd-html5-backend。后者是一个 HTML5 后端,它提供了一些基本的本地浏览器支持。 然后,我们需要在我们的应用程序中导入 react-dnd 的相关组件和工具。通常,我们需要导入 DragSource、DropTarget、DragDropContext 和 HTML5Backend: ``` import { DragSource, DropTarget } from 'react-dnd'; import HTML5Backend from 'react-dnd-html5-backend'; import { DragDropContext } from 'react-dnd'; ``` 接下来,我们需要创建一个 DragSource 和一个 DropTarget 组件。这些组件是我们用来定义拖放操作的核心。 DragSource 定义一个组件可以被拖动的方式,DropTarget 定义一个组件可以接收拖放的元素。 例如,创建一个简单的 DragSource 组件会像这样: ``` import { DragSource } from 'react-dnd'; const ItemTypes = { CARD: 'card' }; const cardSource = { beginDrag(props) { return { id: props.id }; } }; function collect(connect, monitor) { return { connectDragSource: connect.dragSource(), isDragging: monitor.isDragging() }; } const Card = ( <div> Drag Me! </div> ); export default DragSource(ItemTypes.CARD, cardSource, collect)(Card); ``` 这个简单的例子定义了一个拖动的卡片元素,其中 cardSource 是定义拖动行为的 Javascript 对象,beginDrag 方法返回了一个包含 id 属性的拖动项,用于标识当前拖动的卡片。 接下来,我们需要使用 DragDropContext 组件来包裹整个应用程序,并使用 HTML5Backend 作为拖放后端: ``` import { DragDropContext } from 'react-dnd'; import HTML5Backend from 'react-dnd-html5-backend'; ... export default DragDropContext(HTML5Backend)(App); ``` 这样我们就可以在应用程序中使用 DragSource 和 DropTarget 组件了。 当我们成功地拖动一个拖动源到它的目标时,它会触发 DropTarget 上的 drop 方法,我们可以在这个方法中定义我们想要发生的操作,例如重新排列、合并或删除元素。 以上就是 react-dnd 的简单使用方法。具体的实现还需要根据实际需求进行详细的设计和开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值