【问题标题】:remove last item from array and rerender in react failed从数组中删除最后一项并在反应中重新渲染失败
【发布时间】:2025-12-07 19:30:01
【问题描述】:

我想从数组中删除最后一项并重新渲染,但如果不使用过滤器,我似乎无法让它工作。但就我而言,我认为不需要过滤器,因为我总是会拿走最后一项,因此我使用 pop()

const CustomInput = (): JSX.Element => {
  const [inputValue, setInputValue] = useState<string>("");
  const [items, setitems] = useState<string[]>(['1', '2']);

  const handleKeyDown = (e: any) => {

    if (items.length && e.keyCode === 8 && inputValue === "") {
      const newitems = items;
      newitems.pop();

      /* what is wrong here */
      console.log('newitems', newitems)

      setitems(newitems);
    }
  };

  const handleChange = (e: React.SyntheticEvent<HTMLInputElement>) => {
    const target = e.target as HTMLInputElement;
    setInputValue(target.value);
  };


  return (
    <div>
      {items.map((oo, index) => (
        <div >
          <span>
            {oo}
          </span>
        </div>
      ))}
      <input
        autoFocus
        type="text"
        value={inputValue}
        onKeyDown={handleKeyDown}
        onChange={handleChange}
      />
    </div>
  );
};

https://stackblitz.com/edit/react-ts-hxzcpt

怎么了?

【问题讨论】:

  • 您是否尝试将 newItems 初始化为 const newitems = [...items]; 我认为您正在改变您的状态值导致反应不知道何时更新它的问题。

标签: javascript reactjs typescript ecmascript-6


【解决方案1】:

你正在直接改变状态。 这是一个解决方案。

const newitems = [...items];
newitems.pop();

【讨论】:

  • 如何删除最后一项?
  • 这不会删除最后一项。您仍然需要.pop 才能删除最后一项。
  • 你能发布完整的答案吗?我很困惑。
  • 已编辑。因此,您的原始代码直接更改状态值,这在 React.JS 中是不允许的。您可以使用扩展运算符创建一个新数组并使用它更新状态。
  • 我赋值给一个新变量,为什么我需要在这里传播?嗯
【解决方案2】:

array::slice

您正在变异并将相同的状态数组引用保存回状态,该状态被视为“非操作”,即数组引用是相同的,因此它可以重新渲染它。您可以使用 slice 将第 0 个到倒数第二个元素复制到一个新的数组引用中,基本上是在每次回调调用时“切掉”最后一个元素。

const handleKeyDown = (e: any) => {

  if (items.length && e.keyCode === 8 && inputValue === "") {
    setitems(items.slice(0, -1)); // index 0 to last - 1
  }
};

【讨论】:

  • 很干净,但是可以用es6代替吗?切片对我来说感觉“老”,嗯..
  • @AndreThonas 我不太确定我是否理解这个问题,因为 array::slice 仍然是标准的一部分,除了启用扩展语法之外,es6 中的数组并没有添加太多对于迭代。正如您所见,将当前状态散布到数组中然后弹出最后一个元素实际上更加冗长。仅仅因为 slice 可能与语言本身一样古老(而不是新的和闪亮的)并不意味着它没有用。
最近更新 更多