Вложенное перетаскивание с помощью react-beautiful-dnd

Я создаю вертикальное вложенное перетаскивание с помощью реагировать красиво-dnd. Я сослался на ответы в гитхабе

Я разветвился из песочницы и создал новую для вертикального вложенного перетаскивания. Когда я меняю внутреннее значение "Не беспокоить", внешнее значение "Не беспокоить" меняет значения, не входящие в "Не беспокоить".

Вложенное перетаскивание с помощью react-beautiful-dnd

КОД

 onDragEnd(result) {
    // dropped outside the list
    console.info("innner drag");
    if (!result.destination) {
      return;
    }

    const items = reorder(
      this.state.items,
      result.source.index,
      result.destination.index
    );

    this.setState({
      items
    });
  }

ДЕМО Код: https://codesandbox.io/s/ozq53zmj6

В react-beautiful-dnd все события onDragEnd обрабатываются корневым DragDropContext. В настоящее время вложенный DragDropContexts не поддерживаются. В вашем файле ServiceCommandUnit.js вы фактически нигде не используете функцию onDragEnd. Я бы порекомендовал поднять состояние ServiceCommandUnit.js до index.js и проверить droppableId в результате, чтобы проверить, какой «список» следует обрабатывать каждый раз при вызове onDragEnd.

Kevin Lee 14.11.2018 20:10

Также совет: «draggableID» может быть любой строкой, какой захотите. Итак, если вы хотите, вы можете встроить всю информацию, чтобы идентифицировать перетаскиваемый контент как объект, затем JSON.stringify его и используйте как «draggableID». Это то, чем я сейчас занимаюсь, несмотря на то, что это вроде как не задумывалось. ^ _ ^

Venryx 12.03.2019 23:50

Тем, кто, как я, пришел из Google, обратите внимание, что полностью не связанные друг с другом DragDropContext вполне подойдут. Таким образом, у вас может быть DragDropContext внутри DragDropContext, и если вы не перетаскиваете между ними, это совершенно нормально.

sean 29.12.2020 08:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
3
13 693
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

react-beautiful-dnd на данный момент не поддерживает вложенное перетаскивание и это элемент с низким приоритетом в соответствии с их дорожной картой. Вам нужно обрабатывать все на внешнем <DragDropContext onDragEnd = {this.handleDragEnd}>. По умолчанию он не предоставляет родительскую информацию в объекте result, поэтому я сохранил эту информацию в дочернем компоненте Droppable. См. Демонстрацию ниже, если это сработает для вас.

Код: https://codesandbox.io/s/jp4ow4r45v

Редактировать: Обратитесь к песочнице ниже для более общего фрагмента кода, где вы сможете применить вложенное перетаскивание через родительский контейнер.

Код: https://codesandbox.io/s/5v2yvpjn7n.

Во втором примере есть способ сделать элементы перетаскиваемыми между уровнями? Я хотел бы переместить subitem1 под root или items2 под подпункты items1. Или есть какая-нибудь другая библиотека, которая может добиться такого поведения DaD?

Maroš Beťko 03.04.2019 15:41

Во втором примере вы можете переупорядочить отдельные items, вы можете переупорядочить subItems внутри item, вы можете перетащить subItems с одного item на другой item. Если я правильно понял ваш вопрос, вы хотите переместить subItem из контейнера item2 в контейнер item1, и это возможно. Вы можете попробовать это в codesandbox

Debajit Majumder 04.04.2019 11:49

Я искал эта функциональность. Хотя этот пакет не идеален, потому что мне придется преобразовать мои данные в требуемый формат с помощью пакета, он делает то, что мне нужно.

Maroš Beťko 04.04.2019 15:58

Да, react-beautiful-dnd на данный момент не поддерживает вложенное перетаскивание, поэтому перенос всей логики в родительский - единственный вариант, оставшийся в этой библиотеке. Можете попробовать реагировать

Debajit Majumder 04.04.2019 18:50

Основываясь на этом втором примере, можно ли разрешить отбрасывание item между subitems и отбрасывание subitem между items?

s.meijer 21.08.2020 16:38

просто укажите тип вашего внешнего и внутреннего сбрасываемого объекта, на конце перетаскивания вы должны проверить тип вашего сбрасываемого объекта и соответствующим образом изменить порядок.

onDragEnd = ({ type, destination, source }) => {

    if (source && destination && type) {
        let parentId = source.droppableId;
        let srcIndex = source.index;
        let destIndex = destination.index;

        if (type == "Inner") {
            //method for reordering the order of the inner items
            reorderInner(parentId, srcIndex, destIndex)
        }
        else if (type == "Outer") {
            //method for reordering the order of parent items
            reorderOuter(srcIndex,destIndex)
        }
    }

};

У меня тоже была та же проблема, и я также использовал response-beautiful-dnd, но со многими пользовательскими изменениями он работает, но не плавно, а затем я пришел, чтобы увидеть другой пакет с именем react-nestable, и он работает так, как мне нужно. Я помещаю ссылку на этот пакет ниже - реагирующий вложенный npm

Другие вопросы по теме