export default function App() {
 const [list, setList] = useState([
 {
  id: uuid(),
  name: "",
  isRemovable: true,
},
 ]);
const [newRowValue, setNewRowValue] = React.useState("");
 const [newRowIsRemovable, setNewRowRemovable] = React.useState(true);

 const removeItem = (removeId) => {
   setList((prevState) => prevState.filter(({ id }) => id !== removeId));
 };

const addNewRowItem = (e) => {
e.preventDefault();

setList((prevState) => [
  ...prevState,
  {
    id: uuid(),
    name: newRowValue,
    isRemovable: newRowIsRemovable,
  },
]);
setNewRowValue("");
setNewRowRemovable(true);
 };
 return (
  <div className="app">
  
  {list.length > 0 ? (
    list.map(({ id, name, isRemovable }) => (
      <div className="uk-card uk-card-default uk-card-body" key={id}>
        <>
          <form
            className="uk-card uk-card-default uk-card-body"
            onSubmit={addNewRowItem}
          >
            <Input
              placeholder="Add a new row..."
              value={newRowValue}
              handleChange={(e) => setNewRowValue(e.target.value)}
            />
          </form>

          {isRemovable && (
            <Button
              color="danger"
              type="button"
              handleClick={() => removeItem(id)}
            >
              Remove
            </Button>
          )}
        </>
      </div>
    ))
  ) : (
    <div>(Empty List)</div>
  )}
  <form
    className="uk-card uk-card-default uk-card-body"
    onSubmit={addNewRowItem}
  >
    <Button
      className="uk-margin-small-bottom"
      color="secondary"
      type="submit"
    >
      Add Row
    </Button>
  </form>
</div>
);
}

我正试图通过单击添加行来添加新行,但当用户在输入中输入值时,将应用相同的值.

如何使每个对象动态输入并推送到array.

当我呼叫addNewRowItem时,我可以添加新项目,但我为第一个输入输入的值也会为新输入复制相同的值

推荐答案

我们可以使用单独的值list,而不是对所有行使用单个state属性.当您更新任何值时,我们需要在更新值onChange事件之后使用setList([...list])创建一个list的新引用,这将给出预期的输出!

import React, { FC, useState } from 'react';

import './style.css';
import { v4 as uuid } from 'uuid';

export const App: FC<{ name: string }> = ({ name }) => {
  const [list, setList] = useState([
    {
      id: uuid(),
      name: '',
      isRemovable: true,
    },
  ]);
  const [newRowValue, setNewRowValue] = React.useState('');
  const [newRowIsRemovable, setNewRowRemovable] = React.useState(true);

  const removeItem = (removeId) => {
    setList((prevState) => prevState.filter(({ id }) => id !== removeId));
  };

  const addNewRowItem = (e) => {
    e.preventDefault();

    setList((prevState) => [
      ...prevState,
      {
        id: uuid(),
        name: '',
        isRemovable: newRowIsRemovable,
      },
    ]);
    setNewRowValue('');
    setNewRowRemovable(true);
  };
  return (
    <div className="app">
      {list.length > 0 ? (
        list.map((item, index) => (
          <div className="uk-card uk-card-default uk-card-body" key={item.id}>
            <>
              <form
                className="uk-card uk-card-default uk-card-body"
                onSubmit={addNewRowItem}
              >
                <input
                  placeholder="Add a new row..."
                  defaultValue={item.name}
                  onChange={(e) => {
                    list[index].name = e.target.value;
                    setList([...list]);
                  }}
                />
              </form>

              {item.isRemovable && (
                <button
                  color="danger"
                  type="button"
                  onClick={() => removeItem(item.id)}
                >
                  Remove
                </button>
              )}
            </>
          </div>
        ))
      ) : (
        <div>(Empty List)</div>
      )}
      <form
        className="uk-card uk-card-default uk-card-body"
        onSubmit={addNewRowItem}
      >
        <button
          className="uk-margin-small-bottom"
          color="secondary"
          type="submit"
        >
          Add Row
        </button>
      </form>
      {JSON.stringify(list, null, 4)}
    </div>
  );
};

stackblitz demo

Javascript相关问答推荐

如何访问react路由v6加载器函数中的查询参数/搜索参数

主要内部的ExtJS多个子应用程序

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

如何解决CORS政策的问题

Next.js(react)使用moment或不使用日期和时间格式

google docs boldText直到按行执行应用脚本错误

当试图显示小部件时,使用者会出现JavaScript错误.

如何在模块层面提供服务?

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

Chart.js-显示值应该在其中的引用区域

如何通过将实例方法的名称传递给具有正确类型的参数的继承方法来调用实例方法?

从页面到应用程序(NextJS):REST.STATUS不是一个函数

在数组中查找重叠对象并仅返回那些重叠对象

Angular 形式,从DOM中删除不会删除指定索引处的内容,但会删除最后一项

使用自动识别发出信号(&Q)

react 路由如何使用从加载器返回的数据

从异步操作返回对象

使用Perl Selify::Remote::Driver执行Java脚本时出错

更新文本区域行号

在Reaction Native中,ScrolltoIndex在结束时不一致地返回到索引0