我正在使用React Sortable HOC来移动项目。我的初始状态是一个空数组,我需要使用React Sortable中的函数更新状态。
这是React Sortable HOC的原始代码段
onSortEnd = ({oldIndex, newIndex}) => {
this.setState(({items}) => ({
items: arrayMove(items, oldIndex, newIndex),
}));
};
我的状态和功能看起来像这样
const [colors, setColors] = useState([])
function onSortEnd({ oldIndex, newIndex }) {
setColors([...colors, ({ colors }) => ({
colors: arrayMove(colors, oldIndex, newIndex)
})]);
};
最终发生的是没有错误,但是当我尝试排列任何现有颜色时,会添加更多颜色。
答案 0 :(得分:2)
根据上述要求,我认为您不需要setState
的回调格式,您只需执行
const [colors, setColors] = useState([])
function onSortEnd({ oldIndex, newIndex }) {
const newColors = arrayMove(colors, oldIndex, newIndex);
setColors(newColors);
};
答案 1 :(得分:1)
需要返回列表,而不是setColors()
中的对象。
这应该有效:
const [colors, setColors] = useState([]) // a list not an object
function onSortEnd({ oldIndex, newIndex }) {
setColors(( colors ) => (
arrayMove(colors, oldIndex, newIndex) // return list
));
};
答案 2 :(得分:1)
您似乎正在使用新的数组对象更新colors
状态,该对象包含散布到该数组中的现有颜色(即[...colors,
)以及从{{1 }}:
arrayMove()
我的理解是,要复制“非挂钩”组件的行为,您需要将状态的形状更新为const [colors, setColors] = useState([])
function onSortEnd({ oldIndex, newIndex }) {
/*
Look like a problem:
Colors state updated to include existing ...colors, and result of function
*/
setColors([...colors, ({ colors }) => ({
colors: arrayMove(colors, oldIndex, newIndex)
})]);
};
,删除散布运算符,然后返回{ colors : [] }
对象直接保持一致的状态形状:
{ colors : [..] }
答案 3 :(得分:1)
最终发生的事情是没有错误,但是当我添加更多颜色时 尝试排列任何现有的颜色。
setColors([...colors, ({ colors })
|______________________ spreading previous values to new array
因为要散布先前的颜色,然后添加从arrayMove
返回的值(如果只想移动颜色),则可以这样做
const [colors, setColors] = useState([])
function onSortEnd({ oldIndex, newIndex }) {
setColors(() => arrayMove(colors, oldIndex, newIndex));
};