Hacer React Component/Div Arrastrable

Oluwafisayo Oluwatayo 15 febrero 2024
  1. Hacer React Component/Div Arrastrable con onMouse
  2. Hacer que React Component/Div se pueda arrastrar usando la dependencia React-Draggable
  3. Hacer React Component/Div Arrastrable con Beautiful DnD
  4. Conclusión
Hacer React Component/Div Arrastrable

Ahora es divertido ser un creador de sitios web o tal vez elegir la creación de sitios web como un pasatiempo. Puede crear un sitio web simplemente usando su mouse para elegir los contenidos y organizarlos, como un rompecabezas.

Cuando creamos contenidos o aplicaciones que permiten a los usuarios arrastrar y soltar elementos fácilmente, hace que la aplicación sea fácil de usar, incluso para los novatos, lo que podría generar una amplia aceptación de la aplicación en el mercado.

Cuando creamos aplicaciones o juegos en React, la capacidad de arrastrar y soltar contenido hace que sea fácil y rápido completar estas tareas, incluso las más complejas.

Veamos ejemplos que nos ayudarán a aprender cómo hacer que un componente se pueda arrastrar.

Hacer React Component/Div Arrastrable con onMouse

La función arrastrable de React utiliza toneladas de detectores de eventos, pero este ejemplo utilizará tres: onMouseDown, onMouseMove y onMouseUp.

Comenzamos creando un nuevo proyecto React. Abrimos nuestra terminal en VS Code y escribimos npx create-react-app dragone.

Luego navegamos a la carpeta dragone y creamos dos carpetas. La primera carpeta se llamará Main, y dentro de ella crearemos los archivos MainApp.js y MainApp.css.

Estos archivos contendrán los códigos para la página de inicio.

La segunda carpeta se llamará Componentes, y en su interior habrá dos archivos, Dialog.js y Dialog.css. Estos serán los componentes que queremos arrastrar por la pantalla de nuestro navegador.

Dentro de MainApp.js, ingresaremos estos códigos:

Fragmento de código (MainApp.js):

import React, { Component } from 'react';
import './MainApp.css';
import Dialog from '../Components/Dialog';


export default class MainApp extends Component {
    constructor(props) {
        super(props);

        this.state = {
            showDialog: false
        }
    }

    _showDialog() {
        this.setState({showDialog: !this.state.showDialog});
    }

    render() {

        return (
            <div className='MainApp'>
                <div className='Title'>Example Dialog Popper</div>
                <div className='button' onClick={this._showDialog.bind(this)}> Show Dialog </div>
                <Dialog onClose={this._showDialog.bind(this)} show={this.state.showDialog}/>
            </div>
        );
    }
}

En esta página, una vez que se hace clic en el botón Mostrar diálogo, se activa el detector de eventos onClick, y aparece el componente que deseamos arrastrar.

El MainApp.css contiene los estilos que embellecen la página:

Fragmento de código (MainApp.css):

.Title {
    font-weight: bold;
    font-size: 16px;
    padding-top: 30px;
}

.button {
    font-size: 12px;
    width: 100px;
    color: black;
    border: 2px solid black;
    border-radius: 30px;
    padding: 10px;
    margin: 10px;
    margin-left: 650px;
}

.MainApp {
    background-color: lightsalmon;
    height: 1000px;
}

Pasamos a la mejor parte de este ejemplo, donde creamos el componente arrastrable. Nos dirigimos a Dialog.js, y hacemos un poco de codificación:

Fragmento de código (Dialog.js):

import React, { Component } from 'react';
import './Dialog.css';

export default class Dialog extends Component {
    constructor(props) {
        super(props);

        this.state = {
            diffX: 0,
            diffY: 0,
            dragging: false,
            styles: {}
        }

        this._dragStart = this._dragStart.bind(this);
        this._dragging = this._dragging.bind(this);
        this._dragEnd = this._dragEnd.bind(this);
    }

    _dragStart(e) {
        this.setState({
            diffX: e.screenX - e.currentTarget.getBoundingClientRect().left,
            diffY: e.screenY - e.currentTarget.getBoundingClientRect().top,
            dragging: true
        });
    }

    _dragging(e) {

        if(this.state.dragging) {
            var left = e.screenX - this.state.diffX;
            var top = e.screenY - this.state.diffY;

            this.setState({
                styles: {
                    left: left,
                    top: top
                }
            });
        }
    }

    _dragEnd() {
        this.setState({
            dragging: false
        });
    }

    render() {
        var classes = this.props.show ? 'Dialog' : 'Dialog hidden';
        return (
            <div className={classes} style={this.state.styles} onMouseDown={this._dragStart} onMouseMove={this._dragging} onMouseUp={this._dragEnd}>
                <div className='DialogTitle'>My Dialog</div>
                <div className='Contents'>
                    Contents of the Dialog:
                        - one
                        - two
                        - three
                </div>
                <div className='closeButton' onClick={this.props.onClose}>
                    Close
                </div>
            </div>
        );
    }
}

Definimos los estados que queremos que tenga el componente en cada situación. En el estado predeterminado, el componente no se mueve a ninguna parte y configuramos el arrastre en false.

Luego enlazamos los tres estados en los que estará el componente, es decir, dragStart, dragging, y dragEnd, y asignamos cada uno a los escuchadores de eventos onMouse que correspondan. El onMouseDown se activa una vez que el ratón se coloca en el componente, entonces la función asignada a _dragStart se pone a trabajar.

El onMouseMove indica que el componente está siendo arrastrado, lo que activa la función asignada a _dragging.

Por último, onMouseUp indica que el ratón ya no está colocado sobre el componente. Esto activa la función vinculada a _dragEnd.

El Dialog.css es donde se realiza el código para diseñar el componente arrastrable:

Fragmento de código (Dialog.css):

.Dialog {
    width: 400px;
    height: 400px;
    background-color: lightblue;
    border-radius: 10px;
    border: 3px solid grey;
    position: absolute;
    cursor: move;
    top: 150px;
    left: 520px;
}

.hidden {
    display: none;
}

.DialogTitle {
    font-weight: bold;
    padding-top: 10px;
    padding-bottom: 10px;
    border-bottom: 3px solid grey;
}

.Contents {
    padding-top: 50px;
    padding-bottom: 200px;
}

.closeButton {
    font-size: 12px;
    width: 100px;
    color: black;
    border: 2px solid black;
    border-radius: 25px;
    padding: 10px;
    margin: 10px;
    margin-left: 140px;
    cursor: pointer;
}

Luego importamos MainApp en App.js así:

Fragmento de código (App.js):

import React from 'react';
import './App.css';
import MainApp from './Main/MainApp.js';

function App() {
  return (
    <div className="App">
      <MainApp />
    </div>
  );
}

export default App;

Producción:

React componente div arrastrable con onMouse

Hacer que React Component/Div se pueda arrastrar usando la dependencia React-Draggable

También podemos hacer que un componente se pueda arrastrar utilizando la dependencia de react. Después de haber creado el nuevo proyecto con npx create-react-app dragtwo.

Navegamos hasta la carpeta dragtwo para instalar la dependencia. En nuestra terminal, escribimos npm install react-draggable.

Luego iremos a App.js para hacer un poco de codificación:

Fragmento de código (App.js):

import logo from './logo.svg';
import './App.css';
import Draggable from "react-draggable";

function App() {
  return (
    <Draggable>
      <img
      src="https://images.pexels.com/photos/20787/pexels-photo.jpg?auto=compress&cs=tinysrgb&h=350"
      alt="new"
      />
    </Draggable>
  );
}

export default App;

Producción:

React componente div arrastrable usando la dependencia React arrastrable

Primero, importamos Draggable desde react-draggable. Luego creamos el componente que será arrastrable.

Luego envolvemos este componente dentro de la etiqueta <Draggable></Draggable>.

Hacer React Component/Div Arrastrable con Beautiful DnD

La dependencia Beautiful DnD de React es otra biblioteca sencilla y fácil de usar que se puede utilizar para hacer que los componentes se puedan arrastrar.

Para arrancar, primero creamos nuestro componente de reacción, luego navegamos a la carpeta del proyecto para instalar la dependencia con: install react-beautiful-dnd --save.

A continuación, abrimos el archivo App.js y escribimos estos códigos:

Fragmento de código (App.js):

import React, { useState } from 'react';
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
import './App.css';

const finalSpaceCharacters = [
  {
    id: 'james',
    name: 'James',
  },
  {
    id: 'john',
    name: 'John',
  },
  {
    id: 'israel',
    name: 'Israel',
  },
  {
    id: 'joker',
    name: 'Joker',
  },
  {
    id: 'quinn',
    name: 'Quinn',
  }
]

function App() {
  const [characters, updateCharacters] = useState(finalSpaceCharacters);

  function handleOnDragEnd(result) {
    if (!result.destination) return;

    const items = Array.from(characters);
    const [reorderedItem] = items.splice(result.source.index, 1);
    items.splice(result.destination.index, 0, reorderedItem);

    updateCharacters(items);
  }

  return (
    <div className="App">
      <header className="App-header">
        <h1>Final Space Characters</h1>
        <DragDropContext onDragEnd={handleOnDragEnd}>
          <Droppable droppableId="characters">
            {(provided) => (
              <ul className="characters" {...provided.droppableProps} ref={provided.innerRef}>
                {characters.map(({ id, name }, index) => {
                  return (
                    <Draggable key={id} draggableId={id} index={index}>
                      {(provided) => (
                        <li ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>

                          <p>
                            {name}
                          </p>
                        </li>
                      )}
                    </Draggable>
                  );
                })}
                {provided.placeholder}
              </ul>
            )}
          </Droppable>
        </DragDropContext>
      </header>
    </div>
  );
}

export default App;

Producción:

React componente div arrastrable con hermosa dnd

Para arrancar, primero creamos una matriz de nombres que debemos arrastrar y reordenar. Luego utilizamos el método de empalme, de modo que una vez que sacamos un elemento de su posición, se reemplaza automáticamente por el siguiente elemento.

A continuación, creamos las funciones para manejar el arrastrar y soltar elementos. Después de crear las funciones para arrastrar los componentes, envolvemos todas estas funciones dentro de las etiquetas <Draggable></Draggable>.

Creamos la función para soltar elementos y la envolvemos, incluidas las funciones en la etiqueta draggable dentro de <Droppable></Droppable>, luego envolvemos todo esto dentro de la etiqueta <DragDropContext></DragDropContext>.

Conclusión

La flexibilidad de React hace que casi todos los proyectos sean posibles y sencillos de crear. La funcionalidad de arrastre de React es útil para crear juegos y aplicaciones fáciles de usar para los usuarios.

Oluwafisayo Oluwatayo avatar Oluwafisayo Oluwatayo avatar

Fisayo is a tech expert and enthusiast who loves to solve problems, seek new challenges and aim to spread the knowledge of what she has learned across the globe.

LinkedIn

Artículo relacionado - React Component