gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:56:08 24 4
gpt4 key购买 nike

我正在使用 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>)
})
)
}
};

提前致谢。

最佳答案

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

更新 SortableList 函数,如下所示。

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

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

关于javascript - react-sortablejs - 在具有嵌套数组的对象上设置 'onChange' 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57970186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com