如何使用usestate在特定索引中拼接或推送新元素?

how to splice or push new elements in a specific index with usestate?

我试图在数组中插入新元素并更新基于数组的状态,但是更新状态后的问题是它没有在组件中呈现。

import React, { useState } from "react";
import "./styles.css";

export default function App() {
  let elements = [
    { id: 0, text: "first", autoFocus: true },
    { id: 1, text: "second", autoFocus: true },
    { id: 2, text: "third", autoFocus: true }
  ];
  const [state, setstate] = useState(elements);

  function handChange(e) {
    if (e.keyCode == 13) {
      const x = state;
      const index = x.findIndex((item) => item.id == e.target.id);

      //i'm using autoFocus to move the focus  (I-beam pointer) to the nex field.
      //but i still get errors with it
      // e.map((item) => Object.assign(item, { autoFocus: false }));
      
      x.splice(index + 1, 0, { id: 3, text: "xxx", autoFocus: true });
      console.log(state); // you can see this update probarly
      setstate(x); // but when I update state sometimes it don't render othertimes it take a while before render.

    }
  }

  return (
    <div className="App">
      {state.map((e) => (
        // when I say it don't render I mean the e value don't get updated.
        <div
          focus={e.focus}
          contentEditable="true"
          id={e.id}
          onKeyUp={handChange}
        >
          {e.text}
        </div>
      ))}
    </div>
  );
}

codesandbox

您可以像这样使用 splice 来更新您的阵列。

const newArray = [...state];
newArray.splice(e.target.id, 0, newElement);
setstate(newArray);

因为 splice 改变了原始数组。您可以使用扩展运算符创建一个新数组,然后对其应用拼接。

这将创建一个包含状态的新数组。

[...state]

你可以查看 splice 的文档 here

而不是使用

x.splice(index + 1, 0, { id: 3, text: "xxx", autoFocus: true });
      setstate(x)

我用这个代码替换它

setstate((pre) => {
      
        return [
          ...pre.slice(0, index + 1),
          { id: 3, text: "xxx", autoFocus: true },
          ...pre.slice(index + 1, state.length)
        ];
      })

那个return索引上元素之前的元素index + 1+新元素+索引上元素之后的元素index + 1

  • 例如,如果您有 3 个元素并且您在 2d 元素上按下回车键,那么它的索引是 1 您将在索引 1+1 中创建一个新元素并且在它之后,您将 return 第三个元素,它位于 1+1, 3 之间的区域,其中 3 是数组的长度。

替代解释:

  • ...pre.slice(0, index + 1),这个return你输入的元素之前的所有元素+你输入的元素。
  • { id: 3, text: "xxx", autoFocus: true }, 这将在之前的元素之后创建新元素
  • ...pre.slice(index + 1, state.length) 这将 return 您点击的元素之后的元素进入(如果没有,它将 return 没有)