React-sortable-hoc - поддерживать новый порядок сортировки без свойств экспериментального класса

Следующая конфигурация не выдает никаких ошибок, но новый порядок сортировки не поддерживается. Перетаскивание и связанные с ним анимации работают хорошо, но сам порядок сортировки никогда не меняется постоянно.

Я немного изменил свой код по сравнению с примером в https://www.npmjs.com/package/react-sortable-hoc. (Я переместил некоторый код в функцию-конструктор, чтобы обойти ошибку, связанную со свойствами экспериментального класса.)

Есть идеи?

import {
    SortableContainer,
    SortableElement,
    arrayMove,
} from 'react-sortable-hoc';

const SortableItem = SortableElement(({value}) => <li>{value}</li>);

const SortableList = SortableContainer(({items}) => {
    return (
        <ul>
            {items.map((value, index) => (
                <SortableItem key = {`item-${index}`} index = {index} value = {value} />
            ))}
        </ul>
    );
});

class SortableComponent extends Component {

    constructor(props) {
        super(props);
        this.state = {};
        this.state.items = [
            "Gold",
            "Crimson",
            "Hotpink",
            "Blueviolet",
            "Cornflowerblue",
            "Skyblue",
            "Lightblue",
            "Aquamarine",
            "Burlywood"
        ];
        this.onSortEnd = this.onSortEnd.bind(this);
    }

    onSortEnd(oldIndex, newIndex) {
        this.setState(({items}) => ({
            items: arrayMove(items, oldIndex, newIndex),
        }));
    }

    render() {
      return <SortableList items = {this.state.items} onSortEnd = {this.onSortEnd} />;
    }
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
1 767
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема заключается в обратном вызове onSortEnd:

onSortEnd(oldIndex, newIndex) {
  this.setState(({items}) => ({
    items: arrayMove(items, oldIndex, newIndex),
  }));
}

вам нужно изменить аргументы функции (oldIndex, newIndex) на ({ oldIndex, newIndex })

из документов github (https://github.com/clauderic/react-sortable-hoc): onSortEnd — обратный вызов, который вызывается при завершении сортировки. function({oldIndex, newIndex, collection}, e)

Обратите внимание на разницу в сигнатуре функции и вашей реализации, oldIndex и newIndex присваиваются с помощью деструктуризации объекта в первом аргументе. Используя второй аргумент функции как oldIndex, она фактически будет иметь e в качестве значения, которое, очевидно, не может использоваться в качестве индекса при обновлении порядка массива!

Очень приятно -- я также обошел это, выполнив ` onSortEnd(args) { let oldIndex = args.oldIndex; пусть newIndex = args.newIndex;`

jhchnc 09.03.2019 21:47

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