如何为打开表单的大量按钮创建可重用组件

2023-12-23

使用的库:mui 5.4.1

创建一个TableCell含有一个IconButton打开一个Form,代码编写如下。

const data = [
  {
    id: "001",
    name: "A",
    price: 2000
  },
  { id: "002", name: "B", price: 100 },

  ...

];

const SandboxTable = () => {
  return (
    <ThemeProvider theme={muiTheme}>
      <TableContainer>
        <Table>
          
           ...

            {data.map((datum) => (
              <TableRow key={datum.id}>
                <TableCell>{datum.id}</TableCell>
                <TableCell>{datum.name}</TableCell>
                <TableCell>{datum.price}</TableCell>
                <ApproveFormButtonCell
                  toolTip={"approve"}
                  id = {datum.id}
                  IconComponent={<CheckCircleOutlineIcon color={"success"} />}
                />
                <RejectFormButtonCell
                  toolTip={"Reject"}
                  name = {datum.name}
                  IconComponent={<CancelOutlinedIcon color="error" />}
                />
              </TableRow>
            ))}
          </TableBody>
        </Table>
      </TableContainer>
    </ThemeProvider>
  );
};
const ApproveFormButtonCell = ({ toolTip, IconComponent }) => {
  const usePopoverProps = usePopover();
  return (
    <TableCell>
      <IconButtonWithTooltip
        toolTip={toolTip}
        onClick={usePopoverProps.handleOpen}
        IconComponent={IconComponent}
      />
      <BasePopover usePopverProps={usePopoverProps}>
        <ApproveForm id={id} handleClose={usePopoverProps.handleClose} />
      </BasePopover>
    </TableCell>
  );
};

然后我必须创建一个new ButtonCell component每次添加新按钮时。

为了避免这种情况,当在SandboxTable中使用ApproveForm时,无法接收handleClose。

<ApproveFormButtonCell
  toolTip={"approve"}
  id = {datum.id}
  IconComponent={<CheckCircleOutlineIcon color={"success"} />}
/>
  <ApproveForm handleClose={??}/>
</ApproveFormButtonCell>

我需要很多按钮打开表单。 有什么好的答案可以解决这种情况吗?

代码沙箱 https://codesandbox.io/s/silent-framework-dcoslx?file=/src/component/SandboxTable.jsx


为了避免一次性制作每种类型和类型的表单按钮单元组件,您可以抽象常见的行为/UI,即IconButtonWithTooltip and BasePopover组件,转换为通用组件,并将不同的内容作为 prop 传入。在这种情况下,表单组件似乎有所不同。

创建一个通用组件,利用渲染道具 https://reactjs.org/docs/render-props.html,即渲染期间调用的函数的 prop。此渲染道具将传递关闭处理程序作为参数。

Example:

const FormButton = ({ toolTip, IconComponent, renderForm }) => {
  const popoverProps = usePopover();
  return (
    <>
      <IconButtonWithTooltip
        toolTip={toolTip}
        onClick={popoverProps.handleOpen}
        IconComponent={IconComponent}
      />
      <BasePopover usePopverProps={popoverProps}>
        {renderForm({ handleClose: popoverProps.handleClose })}
      </BasePopover>
    </>
  );
};

用法示例:

import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutline";
import CancelOutlinedIcon from "@mui/icons-material/CancelOutlined";
import FormButton from "./FormButton";
import RejectForm from "./RejectForm";
import ApproveForm from "./ApproveForm";

...

<TableBody>
  {data.map((datum) => (
    <TableRow key={datum.id}>
      <TableCell>{datum.id}</TableCell>
      <TableCell>{datum.name}</TableCell>
      <TableCell>{datum.price}</TableCell>
      <TableCell>
        <FormButton
          toolTip={"approve"}
          IconComponent={<CheckCircleOutlineIcon color={"success"} />}
          renderForm={({ handleClose }) => (
            <ApproveForm id={datum.id} handleClose={handleClose} />
          )}
        />
      </TableCell>
      <TableCell>
        <FormButton
          toolTip={"Reject"}
          IconComponent={<CancelOutlinedIcon color="error" />}
          renderForm={({ handleClose }) => (
            <RejectForm handleClose={handleClose} name={datum.name} />
          )}
        />
      </TableCell>
    </TableRow>
  ))}
</TableBody>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为打开表单的大量按钮创建可重用组件 的相关文章

随机推荐

  • 在 Orchard CMS 中将不同的 CSS 文件添加到不同的页面?

    假设 Orchard CMS 中有两个页面 主页和关于我们页面 我想在主页上使用 RoyalSlider 它有自己的 CSS 文件 如何仅将其包含在主页上而不包含在 关于我们 页面上 在 Orchard CMS 中 我使用 Contoso
  • Android 地图 v2 在第二次充气时出现错误

    我正在尝试在我的应用程序中使用新的 Android 地图 我有一个 FragmentActivity 其布局包含 除其他外
  • scoverage:结合 test 和 it:test 的覆盖率

    我用过滤器分割了单元测试和集成测试 lazy val FunTest config it extend Test def funTestFilter name String Boolean name endsWith Spec def un
  • 正则表达式选择多行字符串中的最后一行

    我有一个 ANT 脚本 它有一个属性 其值可以是一行或多行 例如 财产 prop1 A 12 1 REL B121000 10 18 2011 1700 A 12 1 REL B121001 10 25 2011 6059 A 12 1 R
  • 获取 NullPointerException:尝试在 Android 中读取字节数组时尝试获取 Parcelable 中空数组的长度

    我有一个实现 Parcelable 的类 我的所有值都通过 writeToParcel 方法设置正常 但在构造函数中读取时 我遇到了引发 NullPointerException 的字节数组问题 public final class Pro
  • 字符串被分配给列表而没有编译错误[重复]

    这个问题在这里已经有答案了 据我所知 Java 中泛型的主要目的之一是提供编译时类型安全 如果它被编译 代码将毫无问题地运行 那么为什么下面的代码会被编译呢 public static void main String args Strin
  • Python与selenium并行执行

    我对使用 selenium 在 python 中并行执行感到困惑 似乎有几种方法可以解决这个问题 但有些似乎已经过时了 有一个名为的 python 模块python wd parallel好像有一些功能可以做到这一点 但这是 2013 年的
  • 从 Pyspark 数据帧创建字典显示 OutOfMemoryError: Java 堆空间

    我见过并尝试过很多existing https stackoverflow com questions 37335 how to deal with java lang outofmemoryerror java heap space er
  • DXF图像实体组代码解释

    我正在开发一个 Delphi 类来从 DXF 文件导入 导出某种实体 我想添加对图像实体的支持 但我不明白一些组代码 我正在使用官方 DXF 指南参考 2002 http www autodesk com techpubs autocad
  • Entity Framework 6.1 本身支持 XML 数据类型吗?

    某些 RDBMS 包括 SQL Server 支持 XML 列 我不想将这样的列映射到string数据类型 Entity Framework 6 1 是否以任何方式原生支持 XML 更具体地说 我可以映射一个xml NET 的 XML 数据
  • Spring data jpa存储库内存中测试用例

    在我的项目中 我编写了一个存储库类 我需要编写内存中测试类 我的存储库代码如下 package org jaap reference repository import java util List import org springfra
  • 统一流畅的动作

    我开始学习统一 我面临着一个我无法摆脱的问题 那就是 但是我试图让动作平滑 它不像通常的视频游戏 无论 FPS 有多高或有多少不同我尝试实现逻辑的方法 我尝试使用固定更新和固定增量时间 但似乎没有什么区别 void Update movem
  • 动态更新配置数据codeigniter

    我创建了自定义配置文件来存储有关站点的信息 例如它是在线还是离线 为此 我在 config 文件夹中创建了新文件 并使用我自己的索引将默认值存储在全局 config 数组中 我想通过管理员控制动态更新这些配置数据 例如 他可以选择将站点置于
  • 不带标签的单选按钮样式

    我现在面临这个问题 我想样式单选按钮 and 复选框由系统生成并没有标签 我正在使用 IBM SPSS Data Collection 进行在线调查 这意味着它会根据我可以设置样式的某个模板 主要是使用 CSS 样式 生成所有页面问题 我发
  • 在应用程序中找不到传递库依赖项

    假设我有一个库模块 其中包含一些第三方库 例如 OkHttp 当我在我的应用程序中包含这个库时 我无法使用这些第三方库 我阅读了以下文章第1条 https stackoverflow com questions 22795455 trans
  • CakePHP 管理部分路由和重定向

    我正在努力解决在 CakePHP 项目中创建管理部分的概念 2 3 5版本 我已取消注释 Config core php 中的行 Configure write Routing prefixes array admin 我在 Config
  • 为什么 Angular 仍然将请求编码为 JSON? ( $http, $httpParamSerializerJQLike )

    我想要有角度的制作x www form urlencoded要求默认情况下 不是 JSON angular 1 4 5 defaults paramSerializer仅用于 URL 构建 不用于POST身体 defaults transf
  • MongoDB - 具有聚合的地理空间索引

    我从 to 文档中读到 不可能在 MongoDB 聚合上使用地理空间索引 有替代方案吗 我正在尝试运行一个查询 获取特定半径内的所有活动 然后按活动发生的次数对它们进行分组 排序 有办法解决这个问题吗 您可以在地理查询上使用map redu
  • 如何将复选框添加到 jQgrid 标题中

    每个 jQgrid 行都有多个复选框 因此我不能 仅 使用多选 这就是该列的设置方式 名称 ColName 标签 宽度 50 可编辑 true 可排序 false edittype 复选框 格式化程序 复选框 格式选项 禁用 false 索
  • 如何为打开表单的大量按钮创建可重用组件

    使用的库 mui 5 4 1 创建一个TableCell含有一个IconButton打开一个Form 代码编写如下 const data id 001 name A price 2000 id 002 name B price 100 co