Reaccionar desarrollo de código bajo - React Dnd

Reaccionar Dnd

React DnD es un conjunto de utilidades de React que lo ayudan a crear interfaces complejas de arrastrar y soltar mientras mantiene los componentes desacoplados. Es perfecto para aplicaciones como Trello y Storify, donde arrastrar transfiere datos entre diferentes partes de la aplicación y los componentes cambian su apariencia y el estado de la aplicación en función de los eventos de arrastrar y soltar.

Arrastrar y soltar es inherentemente con estado. Hay una operación de arrastre en curso o no. O hay un tipo actual y un elemento actual, o no lo hay.

React DnD expone este estado a sus componentes a través de un par de pequeños envoltorios sobre un almacén de estado interno llamado monitores. Los monitores le permiten actualizar las propiedades de un componente en respuesta a los cambios de estado de arrastrar y soltar.
usar:

npm install react-dnd react-dnd-html5-backend

Dirección del sitio web oficial: https://react-dnd.github.io/react-dnd/about

Caso sencillo:

Este caso está escrito utilizando el entorno de tecnología React.
Arrastre y suelte los elementos que se pueden arrastrar del cuadro 1 al cuadro 2, y arrastre y suelte los elementos del cuadro 2 al cuadro 1.

inserte la descripción de la imagen aquí
En el desarrollo real, el componente Arrastrable y el componente Soltable están en archivos separados. Este es solo un caso simple, y todos están en un archivo para mayor comodidad.

import React from 'react'; 
import {
    
     DndProvider, useDrag, useDrop } from 'react-dnd';
import {
    
     HTML5Backend } from 'react-dnd-html5-backend';



const Code: React.FC = () => {
    
    
	
	// 设置动态拖拽数据
     const [box1, setBox1] = React.useState([
        {
    
     id: 1 }, {
    
     id: 2 }, {
    
     id: 3 },
    ])
    const [box2, setBox2] = React.useState([{
    
     id: 1 }]);
    
    // 可拖拽的元素
    function Draggable({
    
     id }) {
    
    
        const [{
    
     isDragging }, drag] = useDrag(() => ({
    
    
            type: "card",
            item: {
    
     id },
            collect: (monitor) => ({
    
    
                isDragging: monitor.isDragging(),
            }),

        }))
        if (isDragging) {
    
    
            return <div ref={
    
    drag}></div>
        }
        return <div id='drap' style={
    
    {
    
     "margin": "8px", "width": "50px", "background": "rgb(118 208 235)" ,"display":"inline-block"}} ref={
    
    drag}>{
    
    `Drag ${
      
      id}`}</div>
    }
	
	// 存放拖拽元素的容器
    function Droppable({
    
     handleDrop, state, text ,children}) {
    
    
        const [{
    
     isDver }, drop] = useDrop(() => ({
    
    
            accept: "card", // 接收的类型,和useDrag中type对应
            collect: (monitor) => ({
    
    
                isDver: monitor.isOver(),
            }),
            drop: (item: any) => {
    
    
                handleDrop(item)
                console.log(item)
            }
        }), [state])
        return <div id='drop' ref={
    
    drop} style={
    
    {
    
     "padding": "10px", "width": "320px", "background": "#fff" }}>
            {
    
    text} <br/>
            {
    
    children}
            </div>
    }

    const handleDrop1 = (item) =>{
    
    
        // 删除box2 
        const arrCopy= [...box2];
        const index = arrCopy.findIndex((each)=>each.id == item.id)
        const copyItem = arrCopy[index];
        arrCopy.splice(index,1);
        setBox2(arrCopy);
        // 在box1中添加
        setBox1((prev) => [...prev,copyItem]);
    }
    const handleDrop2 = (item) =>{
    
    
        // 删除box2 
        const arrCopy= [...box1];
        const index = arrCopy.findIndex((each)=>each.id == item.id)
        const copyItem = arrCopy[index];
        arrCopy.splice(index,1);
        setBox1(arrCopy);
        // 在box1中添加
        setBox2((prev) => [...prev,copyItem]);
    }
    return (
        <DndProvider backend={
    
    HTML5Backend}>
            {
    
    /* <Draggable id={1}></Draggable>
            <Draggable id={2}></Draggable> */}
            <Droppable text={
    
    "box1"} state={
    
    box1} handleDrop={
    
    handleDrop1}>
                {
    
    box1.map(drag => <Draggable key={
    
    drag.id} id={
    
    drag.id} />)}
            </Droppable>
            <Droppable text={
    
    "box2"} state={
    
    box2} handleDrop={
    
    handleDrop2}>
                {
    
    box2.map(drag => <Draggable key={
    
    drag.id} id={
    
    drag.id} />)}
            </Droppable>
        </DndProvider>

    )
};


export default Code;

Supongo que te gusta

Origin blog.csdn.net/weixin_43506403/article/details/130247104
Recomendado
Clasificación