在React中的特定索引处将对象插入数组

Gue*_*dio 3 javascript reactjs

我正在尝试在我的'data'数组中的特定点添加一个对象,这是该组件状态.以下不起作用,数组只是被清空.

addNewBulletAfterActive = () => {
    const array = this.state.data;
    const newBulletPoint = {
        id: this.state.data.length += 1,
        title: 'Click to add'
    };
    const newData = array.splice(this.state.activeBulletPointId, 0, newBulletPoint);
    this.setState({
        data: newData
    });
}
Run Code Online (Sandbox Code Playgroud)

我的想法是,如果我有一个10个子弹点的列表,用户可以点击第4个子弹点并按Enter键直接添加新的子弹点.我没有任何问题在数组的末尾添加项目,但看起来像.splice导致问题.

Aro*_*ron 7

我相信这应该做你想要的.

function addAfter(array, index, newItem) {
    return [
        ...array.slice(0, index),
        newItem,
        ...array.slice(index)
    ];
}
Run Code Online (Sandbox Code Playgroud)

此函数返回一个新数组,其中插入了一个新项目.它不会改变原始数组,因此可以很好地处理组件的状态和Redux.

然后,您可以将此功能的输出分配给您的状态.

  • 我认为这个答案应该被接受 (2认同)

Yur*_*nko 5

splice 返回已拼接的项目(由于您拼接了0个项目,因此为空)并变异原始数组。

const newData = array.slice(0); // copy

newData.splice(this.state.activeBulletPointId, 0, newBulletPoint);

this.setState({
    data: newData
});
Run Code Online (Sandbox Code Playgroud)

  • `splice` 会改变状态,这通常是一种不好的做法 (3认同)
  • @Valentin 我在拼接之前添加了切片:) (2认同)
  • 到目前为止,这是唯一可以真正解释为什么OP的代码不起作用的答案。 (2认同)