如何在 React JS-Functional 组件中使用“Select-Drop down”、“Text Field”、“Text-Area auto size”添加和删除动态行

Posted

技术标签:

【中文标题】如何在 React JS-Functional 组件中使用“Select-Drop down”、“Text Field”、“Text-Area auto size”添加和删除动态行【英文标题】:How to add and remove dynamic rows with "Select-Drop down", "Text Field", "Text-Area auto size" in React JS- Functional component 【发布时间】:2022-01-11 22:30:09 【问题描述】:

我是 React JS 的新手。我需要动态开发添加或删除控件(行)。

我在第一行有两个“文本字段”控件、一个“选择(下拉)”控件、“文本区域”控件和一个按钮(添加按钮)控件。 当我单击第二行中的添加按钮时,会自动添加第一行控件。 (文本字段、选择、文本区域、按钮)。第一行值没有改变,第二行字段为空。如何在 React js 功能组件中使用带有 yup 验证的 React Material UI(基于控制器的组件)来执行此操作? 我在代码沙箱中得到了一些示例代码。但是,代码是在没有验证和使用状态的情况下编写的类内组件。我附上以下链接:

https://codesandbox.io/s/3vk7jxv69p

import React from "react";
import  render  from "react-dom";

class App extends React.Component 
  state = 
    rows: []
  ;
  handleChange = idx => e => 
    const  name, value  = e.target;
    const rows = [...this.state.rows];
    rows[idx] = 
      [name]: value
    ;
    this.setState(
      rows
    );
  ;
  handleAddRow = () => 
    const item = 
      name: "",
      mobile: ""
    ;
    this.setState(
      rows: [...this.state.rows, item]
    );
  ;
  handleRemoveRow = () => 
    this.setState(
      rows: this.state.rows.slice(0, -1)
    );
  ;
  handleRemoveSpecificRow = (idx) => () => 
    const rows = [...this.state.rows]
    rows.splice(idx, 1)
    this.setState( rows )
  
  render() 
    return (
      <div>
        <div className="container">
          <div className="row clearfix">
            <div className="col-md-12 column">
              <table
                className="table table-bordered table-hover"
                id="tab_logic"
              >
                <thead>
                  <tr>
                    <th className="text-center"> # </th>
                    <th className="text-center"> Name </th>
                    <th className="text-center"> Mobile </th>
                    <th />
                  </tr>
                </thead>
                <tbody>
                  this.state.rows.map((item, idx) => (
                    <tr id="addr0" key=idx>
                      <td>idx</td>
                      <td>
                        <input
                          type="text"
                          name="name"
                          value=this.state.rows[idx].name
                          onChange=this.handleChange(idx)
                          className="form-control"
                        />
                      </td>
                      <td>
                        <input
                          type="text"
                          name="mobile"
                          value=this.state.rows[idx].mobile
                          onChange=this.handleChange(idx)
                          className="form-control"
                        />
                      </td>
                      <td>
                        <button
                          className="btn btn-outline-danger btn-sm"
                          onClick=this.handleRemoveSpecificRow(idx)
                        >
                          Remove
                        </button>
                      </td>
                    </tr>
                  ))
                </tbody>
              </table>
              <button onClick=this.handleAddRow className="btn btn-primary">
                Add Row
              </button>
              <button
                onClick=this.handleRemoveRow
                className="btn btn-danger float-right"
              >
                Delete Last Row
              </button>
            </div>
          </div>
        </div>
      </div>
    );
  


render(<App />, document.getElementById("root"));

我希望得到相同的输出,但是我想使用一个带有 yup 验证的功能组件(React Material UI 和基于控制器的组件)。谁知道这个答案告诉我。

【问题讨论】:

【参考方案1】:

如何在 React js 功能组件中使用带有 yup 验证的 React Material UI 来做到这一点

在复制粘贴您在此处找到的一些代码之前,您可以从了解更多信息中受益,但我希望这会有所帮助。

“在 react js 功能组件中”

为此,我建议您从Digital Ocean 快速阅读。本质上,您需要了解,您需要实现React Hooks,而不是在类中管理状态和生命周期事件。有了这里的组件,一旦你阅读了这两个链接,这应该很容易。

“带有 React 材质 UI”

这只需要使用 Material UI 组件更改 html/CSS 表。一个简单的替代方法是保留表结构,但使用 MUI 表单元素,例如 button 和 text field。如果您正在寻找更全面、更强大的更新,我也推荐MUI Data Grid。

“通过 yup 验证”

这真的应该只需要在你的项目中安装它,并准确地实现它as the docs say。您只需要定义模式并通过const tableIsValid = Promise.all(state.map(row =&gt; schema.isValid)).every(x =&gt; x) 之类的方式检查所有行是否有效,但如果您想通知用户,您将希望按行拆分结果而不是一次全部执行它们行无效。

【讨论】:

以上是关于如何在 React JS-Functional 组件中使用“Select-Drop down”、“Text Field”、“Text-Area auto size”添加和删除动态行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 react-hook-form 在 React 中存储无线电组的状态

如何使用 React 过渡组对每个项目使用不同的延迟?

「React」如何在React中优雅的实现动画

如何映射一组对象,删除一个并将我的状态设置为 react-native 中的新数组?

如何使用 React Faux DOM 在 D3 分组条形图中呈现矩形?

运行 navigator.pop() 后如何刷新 React 状态?