Следующая конфигурация не выдает никаких ошибок, но новый порядок сортировки не поддерживается. Перетаскивание и связанные с ним анимации работают хорошо, но сам порядок сортировки никогда не меняется постоянно.
Я немного изменил свой код по сравнению с примером в 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} />;
}
}





Проблема заключается в обратном вызове 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;`