zoukankan      html  css  js  c++  java
  • react-smooth-dnd 拖拽实例

    import React, { useState } from 'react'
    import { Container, Draggable } from 'react-smooth-dnd'
    import { v4 as uuidv4 } from 'uuid'
    
    export default function CardPlus() {
      const [toolList, setToolList] = useState([
        {
          id: 't0',
          name: '1',
        },
        {
          id: 't1',
          name: '2',
        },
        {
          id: 't2',
          name: '3',
        },
      ])
    
      const [contentList, setContentList] = useState([
        {
          id: 'c0',
          name: 'a',
        },
        {
          id: 'c1',
          name: 'b',
        },
        {
          id: 'c2',
          name: 'c',
        },
      ])
    
      const applyDrag = (arr, dragResult) => {
        const { removedIndex, addedIndex, payload } = dragResult
        if (removedIndex === null && addedIndex === null) return arr
    
        const result = [...arr]
        let itemToAdd = payload
    
        if (removedIndex !== null) {
          itemToAdd = result.splice(removedIndex, 1)[0]
        }
    
        if (addedIndex !== null) {
          result.splice(addedIndex, 0, itemToAdd)
        }
    
        return result
      }
    
      const handleGetChildPayload = ({type, index}) => {
        if (type === 'tool') {
          const id = uuidv4()
          return {...toolList[index], id}
        } else if (type === 'content') {
          return contentList[index]
        }
      }
    
      const handleCardDrop = ({ type, dragResult }) => {
        console.log(dragResult)
        if (type === 'tool') {
          const result = applyDrag(toolList, dragResult)
          setToolList(result)
        } else if (type === 'content') {
          const result = applyDrag(contentList, dragResult)
          setContentList(result)
        }
      }
    
      return (
        <div className="m-test-wrap">
          <div className="m-test-tool">
            <Container
              orientation="vertical"
              onDrop={(dragResult) => handleCardDrop({ type: 'tool', dragResult })}
              getChildPayload={(index) => handleGetChildPayload({type: 'tool', index})}
              behaviour="copy"
              groupName="col"
            >
              {toolList.map((item) => (
                <Draggable key={item.id} className="m-test-list-item">
                  <div>{item.name}</div>
                </Draggable>
              ))}
            </Container>
          </div>
          <div className="m-test-list">
            <Container
              orientation="vertical"
              onDrop={(dragResult) =>
                handleCardDrop({ type: 'content', dragResult })
              }
              getChildPayload={(index) => handleGetChildPayload({type: 'content', index})}
              groupName="col"
            >
              {contentList.map((item) => (
                <Draggable key={item.id} className="m-test-list-item">
                  <div>{item.name}</div>
                </Draggable>
              ))}
            </Container>
          </div>
        </div>
      )
    }
    

    参考链接:

    https://kutlugsahin.github.io/smooth-dnd-demo/

  • 相关阅读:
    CDH6.3.1安装详细步骤(感写B站若泽大数据)
    windows远程ubuntu UI教程
    CentOS7搭建Tensorflow计算环境(cuda+cudnn+jupyterlab(Anaconda3)+pytorch+Tensorflow)
    中国计算机学会推荐国际学术会议和期刊目录-2019
    基于BA网络模型的二部图数据集生成
    GitHub文件的克隆与上传
    博客园中随笔,文章的区别
    Pycharm新建文件时头部模板的配置方法
    asyncio 和aiohttp
    随机UA
  • 原文地址:https://www.cnblogs.com/xutongbao/p/15264312.html
Copyright © 2011-2022 走看看