javascript - react : Create onClick HOC without using an additional <div/>

标签 javascript reactjs

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

为此,我考虑了一个名为 WithClick 的高阶组件这将用集成的 onClick 包装我的组件属性(property)。

我面临的问题是为了包装它,我必须使用额外的 <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

解决方案是黑客攻击,允许将 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>

关于javascript - react : Create onClick HOC without using an additional <div/>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54521354/

相关文章:

reactjs - 使用 Jest/Enzyme 测试延迟的自定义 React 钩子(Hook)?

reactjs - 如何在 solana 中从 PDA 中提取 sol/lamports

javascript - 使用 mysqljs 执行 UPDATE 语句

javascript - 当路由匹配时,React Router 不显示组件(但渲染有效)

reactjs - React/Redux - 调度不更新 View

javascript - react-scripts build thenserve 正在提供 html,而不是 main.js 文件

javascript - 如何在jquery中仅重新加载元素

javascript - 如何在点击图片后加载&lt;iframe&gt;以提高性能?

javascript - 绝望的图像定位问题

visual-studio - 改进 Visual Studio 2017 中的 JSX 编辑