【问题标题】:how to render a same component one or multiple time using event handler如何使用事件处理程序一次或多次渲染相同的组件
【发布时间】:2021-04-25 00:13:47
【问题描述】:

我想构建一个表单,其中有一些文本字段,如图所示

在这个表单中有一个按钮,点击Add Units按钮后会出现一个新的表单

如何使用按钮 onClick 事件处理程序 呈现此子表单,并且我还想在单击按钮时多次呈现它,如果我单击一次按钮,则会显示如果我点击按钮两次,子表单只会显示一次,然后它会显示两次

-主要问题是我希望子表单在我单击按钮时出现多次

可选如果我想使用按钮单击删除呈现的子表单,请提及代码)

最好使用反应钩子
你可以问我任何与问题有关的事情

【问题讨论】:

  • 在 React.useState 挂钩中存储一个“单位”数组。每次单击添加单位按钮时,将一些对象推送到数组中。然后映射该数组,返回数组中每个项目的表单组件。
  • 抱歉没弄明白,可以码一下吗?
  • const [units, setUnits] = React.useState([]); ... {units.map(unit = > )}
  • 如果这仍然没有意义,请告诉我,我可以将其写在答案块中。但 SO 不是“我的代码”网站,所以请发布您到目前为止编写的代码,然后人们可以根据它提供帮助。
  • 没有兄弟它不能正常工作。我会给你代码,但我只是看到了你的技能,对不起,你没有反应开发人员。我现在遇到的问题是,当我第一次单击按钮时,它将渲染组件两次,而当我第二次单击按钮时,它将渲染组件四次。如果你认为你可以解决它,那很好。顺便说一句,感谢您的帮助,谢谢

标签: reactjs react-hooks


【解决方案1】:

以下是如何解决您的问题的示例。您不需要 useEffect,也不需要三个单独的状态变量。你只需要一组对象。

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

function ReceiptContainer() {
  const [containers, setContainers] = useState([]);

  const handleAddContainer = () => {
    // adding an empty object; you will likely need to
    // initialize this object with whatever values are stored
    // in the container form
    setContainers((current) => [...current, {}]);
  };
  const handleRemove = (index) => {
    const current = [...containers];
    current.splice(index, 1);
    setContainers(current);
  };

  return (
    <div className="receiptContainer container">
      {/* Heading */}
      <div className="receiptContainer__heading mt-3">
        <h4>Container Invoice</h4>
        <hr />
      </div>
      <button onClick={handleAddContainer}>Add container</button>
      <div className="receiptContainer__container">
        {/* You will likely need to pass whatever values are in 
        the container to your ContainerSlot component */}
        {containers.map((container, index) => {
          const handleRemoveClick = () => {
            handleRemove(index);
          };
          return (
            <div
              key={`container-${index}`}
              style={{ display: "flex", alignItems: "center" }}
            >
              <div>
                <ContainerSlot {...container} />
              </div>
              <div>
                <button onClick={handleRemoveClick}>Remove</button>
              </div>
            </div>
          );
        })}
      </div>
    </div>
  );
}

export default ReceiptContainer;

编辑:更新以显示如何删除项目

【讨论】:

  • 感谢兄弟,这段代码运行顺利,感谢您的工作。我有两个疑问。 1- 为什么在 中使用扩展运算符。 2-与添加组件的方式相同,您可以使用另一个按钮将其删除吗?
  • 我使用扩展运算符只是为了说明如何将该对象的属性传递给 ContainerSlot 组件。我假设该对象将存储一些值,并且您需要使用 ContainerSlot 操作这些值。您可以通过几种不同的方式来处理它,例如,我只是列出了它。我更新了我的答案,以展示如何从数组中删除一个项目。
猜你喜欢
  • 2010-09-28
  • 2016-10-01
  • 2020-05-09
  • 2019-11-29
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 2020-07-14
相关资源
最近更新 更多