react-sortablejs - 在具有嵌套数组的对象上设置 'onChange' 方法

react-sortablejs - Setting the 'onChange' method on an object with nested arrays

我正在使用 react-sortablejs 库。 尝试在列表中移动卡片时。我收到错误:

Cannot read property 'map' of undefined

我有一个密集的结构,它在这里迷路了。如何处理 onChange 以便我可以在控制台中看到列表中注释的顺序已更改。

演示 here

import Sortable from 'react-sortablejs';

// Functional Component
const SortableList = ({ items, onChange }) => {  
    return (
        <div>
          <Sortable
            tag="ul"
            onChange={(order, sortable, evt) => {
              console.log(order)
              onChange(order);
            }}

          >
            {items.listItems.map(val => {
             return <li key={uniqueId()} data-id={val}>List Item:  {val.title}</li>})
            }
          </Sortable>
        </div>
    );
};

class App extends React.Component {
    state = {
       item: {
        id: "abc123",
        name: "AAA",
        lists: [
          {
            id: "def456", 
            list_id: "654wer",
            title: 'List1',
            desc: "description",
            listItems: [
              {
                id: "ghj678", 
                title: "ListItems1",
                listItemsId: "88abf1"
              },
              {
                id: "poi098", 
                title: "ListItems2",
                listItemsId: "2a49f25"
              },
              {
                id: "1oiwewedf098", 
                title: "ListItems3",
                listItemsId: "1a49f25dsd8"
              }
            ]   
          },
          {
            id: "1ef456", 
            list_id: "654wer",
            title: 'List 2',
            desc: "description",
            listItems: [
              {
                id: "1hj678", 
                title: "ListItems4",
                listItemsId: "18abf1"
              },
              {
                id: "1oi098", 
                title: "ListItems5",
                listItemsId: "1a49f25"
              },
              {
                id: "1oiwewe098", 
                title: "ListItems6",
                listItemsId: "1a49f25dsd"
              }
            ]   
          },
          {
            id: "2ef456", 
            title: 'List 3',
            list_id: "254wer",
            desc: "description",
            listItems: [
              {
                id: "2hj678", 
                title: "ListItems7",
                listItemsId: "28abf1"
              },
              {
                id: "2oi098", 
                title: "ListItems8",
                listItemsId: "234a49f25"
              },
              {
                id: "df098", 
                title: "ListItems9",
                listItemsId: "1asd8"
              }
            ]   
          }
        ]
      }
    };

    render() {
      const c = this.state.item['lists'].map(item => { return item.listItems});

        return (
          this.state.item['lists'].map(item => {       
            return  (<div>
                      {item.title}
                      <SortableList
                        key={uniqueId()}
                        items={item}
                        onChange={(item) => {
                          console.log(item)
                          this.setState({item});
                        }}
                      >
                      </SortableList>
                    </div>)
          })
        )
    }
};

提前致谢。

当删除 Sortable 列表中的 onChange 事件时,它起作用了。

const SortableList = ({ items, onChange }) => {  
    return (
        <div>
          <Sortable
            tag="ul"
          >
            {items.listItems.map(val => {
             return <li key={uniqueId()} data-id={val}>List Item:  {val.title}</li>})
            }
          </Sortable>
        </div>
    );
};

您必须更新代码中的一些更改。

更新 SortableList 函数如下。

首先在 li 中传递 data-id={val.id},然后在 onChange 方法中,您将收到带有 idorder。因此,我们正在对记录进行排序。

const SortableList = ({ items, onChange }) => {  
    return (
        <div>
          <Sortable
            tag="ul"
            onChange={(order, sortable, evt) => {
              items.listItems.sort(function(a, b){
                  return order.indexOf(a.id) - order.indexOf(b.id);
              });
              onChange(items);
            }}
          >
            {items.listItems.map(val => {
             return <li key={uniqueId()} data-id={val.id}>List Item:  {val.title}</li>})
            }
          </Sortable>
        </div>
    );
};

更新 App 组件的 onChange 事件。

onChange={(item) => {
  let itemObj = {...this.state.item};
  itemObj.lists.map(x=>{
    if(x.id === item.id) x = item;
  });
  this.setState({itemObj});
}}

就是这样!

这是为您准备的工作演示
https://stackblitz.com/edit/react-sortablejs-blzxwd