Простой список в реакции красивый dnd не работает

Я следил за официальным курсом по яйцеголовому (https://egghead.io/lessons/react-reorder-a-list-with-react-beautiful-dnd и пример рабочего кода: https://codesandbox.io/s/52p60qqlpp) и написал это:

https://codesandbox.io/s/00k3rwq3qn

Однако на самом деле это не перетаскивание. Я просмотрел несколько примеров и не могу найти проблему в своем коде. Буду очень признателен, если кто-нибудь ответит на мою ошибку.

Спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
0
6 268
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Я не думаю, что использование встроенных стилей так хорошо работает с Draggable в react-beautiful-dnd. Если вы хотите применить стиль к компоненту Task, вы должны использовать styled-components, этот пример показывает, как он работает, если вы удалите конфигурацию встроенного стиля https://codesandbox.io/s/6lq0854m6r.

Скорее используйте стилизованные компоненты

import React from "react";
import styled from "styled-components";
import { Draggable } from "react-beautiful-dnd";

const Container = styled.div`
  margin: 10px;
  border: 1px solid black;
`;

export default class Task extends React.Component {
  render() {
    return (
      <Draggable draggableId = {this.props.task.id} index = {this.props.index}>
        {(provided, snapshot) => (
          <Container
            {...provided.draggableProps}
            {...provided.dragHandleProps}
            ref = {provided.innerRef}
          >
            {this.props.task.content}
          </Container>
        )}
      </Draggable>
    );
  }
}

Обновлено: Кажется, вы можете применить встроенные стили к перетаскиваемому, но тогда вам следует расширить DraggableProps.styles внутри дочерней функции компонента Draggable, см. здесь.

{(provided, snapshot) => (
    const style = {
        margin: "10px",
        border: "1px solid black",
        ...provided.draggableProps.style,
    };
    return <div
        {...provided.draggableProps}
        {...provided.dragHandleProps}
        ref = {provided.innerRef}
        style = {style}
        >
        {this.props.task.content}
    </div>
)}

Спасибо, Ян, я не знал, что встроенные стили вызывают конфликт с dnd. На будущее, файлы className/css работают нормально.

Saad 21.03.2019 22:23

Отлично, смотрите мое редактирование выше об использовании встроенных стилей, вам просто нужно расширить перетаскиваемые стили, если вы предпочитаете встроенные стили :).

Ian Loubser 21.03.2019 22:24

@IanLoubser прав. Вы можете использовать встроенные стили, вам просто нужно обязательно применить перетаскиваемые встроенные стили - автор react-beautiful-dnd

alexreardon 27.03.2019 00:07

Для тех, кто столкнулся с тем, что перетаскиваемые объекты не двигаются без каких-либо ошибок, это может быть решением. Спасибо, Ян.

Lala 22.09.2021 09:26

Ответ @Ian не сработал для меня. Поэтому я проверил react-beautiful-dnd документы и придумал другой обходной путь для решения проблемы:

const styles = {
  backgroundImage: `url(${background.MEDIUM})`,
  backgroundSize: 'cover',
};

...

  {(provided) => {
    const otherProps = {
      ...provided.draggableProps,
      style: {
        ...provided.draggableProps.style,
        ...styles,
      },
    };
    return (<div
        {...otherProps}
        {...provided.dragHandleProps}
        ref = {provided.innerRef}
        >
        {this.props.task.content}
    </div>)
  }}

Если вы пытаетесь создать перетаскиваемый список с функциональным компонентом React, используя официальный документ и не используя библиотеку стилизованных компонентов, тогда он хочет работать. Это даст вам некоторую ошибку. Поэтому примените стиль, используя атрибут className, и тогда ошибка исчезнет, ​​а также начнет работать код.

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