我正在试图弄清楚如何提交任意数量的数组元素,因此至少有一个元素是无穷大的.

这是一种只需单击提交按钮即可传递的状态:

const [gallery, setGallery] = useState({
    title: "",
    description: "",
    image_url: [],
  });

我正在循环执行以下状态...

const [linkInput, setLinkInput] = useState([{ id: 1, link: "" }]);

...就像这样:

<div className="form-group mx-sm-3 mb-2">
          <label htmlFor="image_url">Image URLs*</label>
          {Array.isArray(linkInput) &&
            linkInput.map((input, i) => (
              <div className="input-group mb-3" key={input.id}>
                <input
                  className="form-control"
                  id="image_url"
                  type="text"
                  value={input.link}
                  required
                  onChange={(e) =>
                    onChangeLink({ ...input, link: e.target.value })
                  }
                />
                <br />
                <div style={{ color: "#ffffff" }}>__</div>
                {linkInput.length !== 1 && (
                  <>
                    <button
                      type="button"
                      className="btn btn-primary"
                      onClick={() => removeLink(input.id)}
                    >
                      Remove Image
                    </button>
                  </>
                )}
              </div>
            ))}
          <br />
          <button
            type="button"
            className="btn btn-primary"
            onClick={() => addInput()}
          >
            Add another image
          </button>
        </div>

这些是我用来通过修改"linkInput"状态来添加或删除输入字段的函数:

const handleRemoveLink = (id) => {
    setLinkInput(linkInput.filter((el) => el.id !== id));
};

  const handleAddInputField = () => {
    const lastItem = linkInput[linkInput.length - 1];
    setLinkInput([...linkInput, { id: Number(lastItem.id + 1), link: "" }]);
  };

我正try 从每个输入元素中获取"link"值,并在单击表单上的提交按钮后将其放入"Image_url:[]"中.目前我甚至没有接近,形式是这样的:它完全消失时,即使放置一个单一的字符.我该怎么办?

推荐答案

您可以通过将现有的linkInput数组与返回new数组的map进行映射来完成此操作.

const handleLink = (e, index) => {
  const result = linkInput.map((linkObj, i) => {
    if (i === index) {
      // create a new object with the values of the previous link object
      // set the link prop to the new value
      return {
        ...linkObj,
        link: e.target.value,
      };
    }
    return linkObj;
  });
  setLinkInput(result);
};

一个常见的错误是不返回new对象,而直接对linkObj进行变异.执行此操作时,您将更改原始对象.

const linkInput = [{ id: 1, link: "" }];

let result = [...linkInput];
result = result.map((x, i) => {
  if (i === 0) x.link = "mutated";
  return x;
});

console.log('linkInput',linkInput);
console.log('result',result);

正如您所看到的,在复制列表时,两个数组都具有"Mutations "值.

Reactjs相关问答推荐

如何等待我的插入内容提交后再继续执行指令?

从`redux—thunk`导入thunk `在stackblitz中不起作用

CreateBrowserRouter将props 传递给父组件以验证权限

滚动事件监听器在Next.js客户端组件中不触发

react 副作用循环

有没有办法在Shopify中显示自定义计算的交货日期?

使用REACT-RUTER-DOM链接仅更新一个搜索参数

禁止直接访问Next.js中的页面,同时允许从应用程序内部访问

如何优化 React 应用程序的性能?

是否可以直接在 jsx 标签上使用 CSS 定义的 colored颜色 ?

useEffect内部的RETURN语句在首次按钮点击事件中似乎无效的原因是什么?

useRef.current.value 为空值

React Js和Firestore中如何将当前ID与集合中的ID查询以仅显示具有相似字段和值的文档-第二部分

如何在 React 过滤器中包含价格过滤器逻辑?

将外部 JavaScript 导入 React(通过文件)

cypress `cy.now()` Type 'Promise' 没有调用签名

如何在 Next Js 13 App Router 中添加 Favicon 图标?

在按钮单击中将动态参数传递给 React Query

如何从 extrareducer redux 更改对象中元素的值

如何在按钮左下角制作 Material UI 菜单下拉菜单