React:创建 onClick HOC 而不使用额外的

2024-01-05

我想避免手动添加onClick我的自定义组件的属性。

为此,我考虑了一个名为的高阶组件WithClick这将用集成的组件包裹我的组件onClick财产。

我面临的问题是,为了包装它,我必须使用额外的<div />标签来访问事件属性。这个标签弄乱了我的 CSS。

例子 :

import React, { Component } from 'react'

const WithClick = (WrappedComponent) => {
  class BaseComponent extends Component {
    render () {
      return (
        <div onClick={this.props.onClick}>
          <WrappedComponent {...this.props} />
        </div>
      )
    }
  }

  return BaseComponent
}

export default WithClick

解决方案是一个 hack,允许将 onClick 事件附加到<React.Fragment />标签或类似的东西。

我尝试将 ref 附加到孩子身上,但它不起作用,我必须处理孩子中的 ref 道具,所以这样做是没有意义的。

你知道解决方法吗?


虽然我对这样做的必要性也有点怀疑,但我可以看到一些特定的情况,在这些情况下,您向许多组件添加相同的处理程序,这是必要的。

ReactDOM.findDOMNode文档不鼓励这样做,并在严格模式下弃用。 React.cloneElement 是一个更好的选择。

const addClickToComponent = ({component}) => (
  React.cloneElement(component, {
    onClick: someComplicatedClickFunction,
  }
);

const ComponentWithClick = addClickToComponent(noClickComponent);

我通常制作这些包装组件而不是 HOC,如果您需要向多个子组件添加属性,您可以这样做。

const ClickWrapper = ({children}) => (
  <React.Fragment>
    {React.Children.map(children, child => (
      React.cloneElement(child, {
       onClick: someComplicatedClickFunction,
      )
     )
    }
  </React.Fragment>
 );

 // jsx

 <ClickWrapper>
   <ChildComponent />
   <ChildComponent />
   <ChildComponent />
 </ClickWrapper>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React:创建 onClick HOC 而不使用额外的
的相关文章

随机推荐

  • 在从桌面 C++ 启动的 Win10 现代应用程序中打开文件时出错

    我尝试使用以下代码从桌面 C 使用 Windows 10 照片应用程序 这是一个 现代 应用程序 打开图像文件 为简单起见 省略了错误检查 DWORD pid CComPtr
  • 我们如何在 selenium/protractor 中设置缩放级别,即缩放到 90%

    我们如何将硒 量角器缩放页面大小的缩放级别设置为 90 等 不知道量角器中是否有等效的东西 因为从未工作过 但这就是我通过 JavascriptExecutor 在 java webdriver 中放大和缩小的方式 使用 document
  • Google Apps 脚本:从亚马逊销售合作伙伴 API 获取订单(签名请求)

    我正在尝试在此之后创建对亚马逊销售合作伙伴 API 的请求guide https github com amzn selling partner api docs blob main guides developer guide Selli
  • MySQL:如何在触发器中使用分隔符?

    有人告诉我 我需要在触发器中使用分隔符 我正在查看 MySQL 手册页 并在示例中找到了它 但是 它不在通用文档中 这是我试图纠正的代码 CREATE TRIGGER adult BEFORE INSERT OR UPDATE ON tab
  • PHP MySQL 查询不起作用,但可以从终端运行

    这是我的代码 gid int stripslashes POST id echo gid db dbConnect test db gt query 更新玩过的游戏集 Play 1 where id gid 回显 db gt 错误 回声 d
  • 如何在 Service Worker 中动态加载 Javascript 文件?

    我无法使用任何涉及创建
  • 为列表视图列设置不同的对齐方式

    我在绘制列左对齐或居中对齐的列表视图时遇到问题 我查看了在这里或其他论坛上找到的一些解决方案 但它们似乎都适用所有列 https stackoverflow com questions 4883182 content alignment f
  • 简化 vb.net 中的列表初始化

    有哪些选项可以简化List初始化以消除重复New MyObject With以及参数名称 例如Value1 我需要创建 50 个对象的列表 因此有很多重复的 可能不必要的代码 我使用最新的 Visual Studio 2019 16 2 3
  • 事件时间序列的数据库建议

    对于我的一个项目 我必须将大量事件集合输入数据库以供以后处理 并且我正在尝试确定哪个 DBMS 最适合我的目的 I have 目前大约有 400 000 000 个离散事件 数据库中将存储约 600 GB 的数据 这些事件有多种形式 但我估
  • 在c中创建我自己的memset函数

    这是原型 void memset void s int c size t n 首先 我不确定是否必须返回某些内容 因为当我使用 memset 时 我会这样做 memset str a 5 代替 str memset str a 5 这是我的
  • saveRDS 问题

    我在重新保存对象时表现出了 saveRDS 的奇怪行为 这是一个可重现的示例 df lt data frame a c 1 2 b c 3 4 saveRDS df test rds readRdsFile lt readRDS test
  • import React 和 import { Component } 语法之间的区别[重复]

    这个问题在这里已经有答案了 假设我们正在使用 React 和 ES6 我们将 React 和 Component 导入为 import React from react import Component from react 为什么语法不同
  • 使用ansible添加交换内存

    我正在开发一个项目 其中需要在我的服务器上拥有交换内存 以避免某些 python 长时间运行的进程耗尽内存 并第一次意识到我的 ubuntu vagrant box 和 AWS ubuntu 实例还没有交换内存设置 In https git
  • 如何解决语法错误:await 仅在异步函数中有效?

    我编写了一段代码 使用 Promise 从异步调用返回一些数据 当我尝试执行时 我得到 语法错误等待仅在异步函数中有效 并且我还得到无法代理应用程序请求 错误 连接ECONNREFUSED 我不确定为什么会出现这些错误 我尝试在函数调用之前
  • 显示核心数据:如果属性具有相同的名称,则显示一次

    我查看了许多谓词问题 阅读了文档 但似乎没有什么可以回答我的问题 我有一个名为的核心数据实体材料我有属性category 子类别 and 描述 我有三个UITableViewControllers在每个我想使用谓词来显示如下 TableVi
  • 从 Web API .NET Core get 操作返回字符串

    我有一个 get 操作 我想从中返回一个字符串 一个例子是 000875 当我从完整的 NET Web API 控制器中的控制器返回此字符串时 它的格式如下 Property 000875 当我在转换后的 NET Core 控制器中返回字符
  • webpack 对 *.js 的意外修改

    我是 webpack 和类似工具的新手 我想重新组织我的项目 目前我所有的 JS 代码都位于 App js 中 因此 在将其拆分为模块并进行改进之前 我只想设置复制它的工作流程 这是 webpack config js 的内容 const
  • 将ASP.Net Core 2.1preview2网站发布到本地IIS MSB3030 *.PrecompiledViews.dll

    Update 1 根据 Priyesh Kumar 的反馈 我使用了网站根文件夹中的以下命令 网站带有 csproj 的命令 这有效 然后我将 win10 x64 内容文件复制到 c www sigex com 中 dotnet publi
  • 在多阶段 docker 构建中使用变量

    我想在多阶段 docker 构建中使用变量 如同这个问题 https stackoverflow com questions 52904847 在撰写本文时尚未得到答复 我的具体用例是在builder阶段并保存目录 这是在变量中完成的 并在
  • React:创建 onClick HOC 而不使用额外的

    我想避免手动添加onClick我的自定义组件的属性 为此 我考虑了一个名为的高阶组件WithClick这将用集成的组件包裹我的组件onClick财产 我面临的问题是 为了包装它 我必须使用额外的 div div 标签来访问事件属性 这个标签