Автор оригинала: temitope emmanuel.
Так что недавно я узнал, что работал над проектом, который требовал мне реализовать функцию перетаскивания. Без предварительного знания о том, как это работает, во-первых, я делал Google There Out, постарайтесь получить контекст на том, как Drag и Drop даже работает.
Я обнаружил, что HTML5 уже имеет это свойство, которое сделало жизнь проще, но только если бы я просто строил веб-страницу без рамки, как реагировать. Я смог пройти свой путь через реализацию его.
Движение вперед, HTML5 имеет четыре свойства, чтобы сделать перетаскивание работы; Перетащить, Ondragstart, OnDragover и OnDrop.
Перетащить , когда добавляется в качестве атрибута к элементу HTML, делает целевой элемент для перезарядки.
ondragstart , называется немедленно, элемент перетащил. Обычно содержание, которое необходимо перетащить, установлено на данный момент.
Ondragover , добавляется в качестве слушателя события к элементу, где будет отброшенный контент. Другими словами, он используется для уточнения того, где содержимое должно быть отброшено.
OnDrop , называется немедленно, притащенное содержание выпускается на элементе, который содержит слушатель события OnDragover.
Больше подробной информации и объяснения их можно найти здесь.
Со всеми этими известными, реализующиеся в реакции не сложно, как это могло бы звучать в начале справа? 😉. Поэтому для реализации этой функции в реакции мы будем создавать простой диспетчер задач, как Trello 😎.
Итак, для начала, у нас есть наш код в файле App.css и app.jsx ниже
.App { display: flex; flex-direction: row; } .todos { background: grey; height: 100px; width: 100px; margin: 10px; } .done { background: grey; height: 100px; width: 100px; margin: 10px; }
import React, { Component } from 'react'; import './App.css'; class App extends Component { constructor(props) { super(props); this.state = { todos: [ { taskID: 1, task: 'Walk the walk' }, { taskID: 2, task: 'Talk the talk' }, { taskID: 3, task: 'Jump the jump' } ], completedTasks: [], draggedTask: {} } } render() { const { todos, completedTasks} = this.state; return (); } } export default App;{ todos.map(todo =>{todo.task}) }{completedTasks.map((task, index) =>{task.task})}
Таким образом, в вышеуказанных кодовых фрагментах у нас есть массив TODOS, пустой массив завершенных катаков в нашем состоянии, а также пустой объект, инициализированный в нашем состоянии. Кроме того, у нас есть два главных детяных девса (TODOS и сделано), содержащиеся в родительском Div с приложением ClassName. Хотя верхний фрагмент содержит CSS.
Идея этого простого приложения состоит в том, чтобы переместить элементы из массива Todos в выполненные задачи массива и отображать изменения (что является то, что реагирует в любом случае 🤓).
Первый шаг состоит в том, чтобы сделать каждый дочерний элемент DIV DIV, добавив атрибут Draggable Ondrag события слушателя события на элемент, как в примере ниже;
{ todos.map(todo =>this.onDrag(event, todo)} > {todo.task}) }
Draggable, как сказал ранее, включает в себя элемент, который добавляется, чтобы перетаскиваться по мере необходимости, когда ondrag в качестве слушателя событий вызывает метод ondrag при запуске.
onDrag = (event, todo) => { event.preventDefault(); this.setState({ draggedTask: todo }); }
Выше метод Ondrag принимает объект события и перетаскивающую Todo в качестве параметров всякий раз, когда он называется, и хранит TODO в состоянии компонента в качестве перетаскивания.
Далее мы заставляем dead div выглядеть так;
this.onDrop(event)} onDragOver={(event => this.onDragOver(event))} className="done" > ...
После этого в нашем компоненте будут добавлены следующие методы
onDragOver = (event) => { event.preventDefault(); } onDrop = (event ) => { const { completedTasks, draggedTask, todos } = this.state; this.setState({ completedTasks: [...completedTasks, draggedTask], todos: todos.filter(task => task.taskID !== draggedTask.taskID), draggedTask: {}, }); }
С этим, когда элемент выпускается или упал на целевой режим div, метод OnDrop уволен вежливостью прослушивателя события, добавленного ранее.
Какой этот метод просто делает ранее сохраненную задачу в состоянии, добавьте его в список завершенных нажатий, фильтрует список TODOS, чтобы удалить этот элемент, поскольку он был перемещен, а затем назначает первоначально установить драгущету на пустой объект.
NB: Все это сделано в под названном методе setState.
Спасибо за чтение. Ссылка на полный код можно найти https://github.com/torkpe/dragndrop/blob/master/src/app.js.