将类组件转换为功能错误

问题描述 投票:0回答:1

我使用的是 反应式可排序 包,并想把它用在一个功能组件中。我试着转换它,但有一行给我一个错误。

列表显示出来了,我可以拖动任何元素,但只要我把它放下来,我就会得到错误的信息。

不能读取未定义的属性 "slice"。

好像是发到这一行。

items: arrayMove(items, oldIndex, newIndex),

这是基于类的版本:

import React, {Component} from 'react';
import {render} from 'react-dom';
import {sortableContainer, sortableElement} from 'react-sortable-hoc';
import arrayMove from 'array-move';

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

const SortableContainer = sortableContainer(({children}) => {
  return <ul>{children}</ul>;
});

class App extends Component {
  state = {
    items: ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', 'Item 6'],
  };

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

  render() {
    const {items} = this.state;

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

render(<App />, document.getElementById('root'));

而我正在尝试的版本是:

import React, { useState } from "react";
import { sortableContainer, sortableElement } from "react-sortable-hoc";
import arrayMove from "array-move";

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

const SortableContainer = sortableContainer(({ children }) => {
  return <ul>{children}</ul>;
});

const Dashboard = () => {
  const [items, setItems] = useState([
    "Item 1",
    "Item 2",
    "Item 3",
    "Item 4",
    "Item 5",
    "Item 6",
  ]);

  const onSortEnd = ({ oldIndex, newIndex }) => {
    setItems(({ items }) => ({
      items: arrayMove(items, oldIndex, newIndex),
    }));
  };

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

export default Dashboard;
reactjs drag-and-drop draggable
1个回答
1
投票

你不需要 destructure itemssetItems 回调,因为在你的例子中,状态并不存储对象,而是一个数组。另外,你不能把值设置成一个对象,而应该是一个数组。

setItems((items) => arrayMove(items, oldIndex, newIndex));
© www.soinside.com 2019 - 2024. All rights reserved.