javascript - 使用 React 高阶组件获取所有子组件 href

标签 javascript reactjs higher-order-components

我的目标是在所有带有链接到外部域的 href 的 anchor 元素上添加点击处理程序。

这是我的组件:

import React from 'react';
import LinkWrapper from './LinkWrapper'

function ComponentWithLinks() {
  return (
    <div>
      <div>
        <ul>
          <li>
            <a href="/">internal link</a>
          </li>
          <li>
            <a href="http://example.com/external">external link</a>
          </li>
        </ul>
      </div>
      <div>
        <p>
          <a href="http://google.com">another external link</a>
        </p>
      </div>
    </div>
  );
}

const wrapped = LinkWrapper(ComponentWithLinks)

export default wrapped;

这是我的包装器:

import React from 'react';

function LinkWrapper(WrappedComponent) {
  return class extends React.Component {
    render() {
      return <WrappedComponent {...this.props} />;
    }
  }
}

export default LinkWrapper;

子级嵌套任意深。

我如何捕获每一个以便我可以将点击处理程序附加到它?

最佳答案

好吧,这个比较乱,我们就用React.Children API遍历所有反应元素,和React.createElement注入(inject)属性(在本例中为 onClick)。

const injectToChildren = (children, addOnClickToAnchors) =>
  React.Children.map(children, addOnClickToAnchors);

const injectToAnchor = child =>
  React.cloneElement(child, { onClick: () => console.log('New Click') });

const addOnClickToAnchors = child => {
  const children = child.props.children;

  // Recursion end condition
  if (!children) return;

  const isAnchor = child.type === 'a';

  return isAnchor
    ? injectToAnchor(child)
    : {
        ...child,
        // Recursion step
        props: { children: injectToChildren(children, addOnClickToAnchors) }
      };
};

function ComponentWithLinks({ children }) {
  // Map every children recursively
  return injectToChildren(children, addOnClickToAnchors)
}

function App() {
  return (
    <ComponentWithLinks>
      // All kinds of children components
    </ComponentWithLinks>
  );
}

Edit Inject All Tree

关于javascript - 使用 React 高阶组件获取所有子组件 href,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56227327/

相关文章:

javascript - 有人可以解释这段 angularjs 指令代码吗?

javascript - ReactJS/Javascript - 对象中项目的问题渲染组件

reactjs - 使用 React-beautiful-dnd 和 Cloud Firestore 发生 Flash

reactjs - 高阶组件总是重新渲染,忽略 shouldComponentUpdate

reactjs - 如何让 TypeScript 通过 Typescript 中的多个高阶组件推断类型?

javascript - 如何在 React 中编写一个需要另一个特殊功能的 HOC?

javascript - Aurelia Router hook - 提供一个预实例化和激活的模块

javascript - 页面加载后加载广告

javascript - 从一个屏幕检索数据到另一个屏幕进行渲染(React Native Javascript)

reactjs - useEffect 在高阶组件中调用