reactjs - 在 React 中递归克隆和修改子组件 - 包括其他组件的子组件

标签 reactjs

我读过这篇文章https://stackoverflow.com/a/42498730/64105 ,并且它可以很好地运行 <TitleList> 中的所有元素。渲染时向下:

  <TitlesList>
    <ul>
      <li>First</li>
      <li>Second</li>
      <li>Third</li>
    </ul>
  </TitlesList>

...但当分成多个组件时则不然,例如:

const List = () => (
  <ul>
    <li>First</li>
    <li>Second</li>
    <li>Third</li>
  </ul>
);

<TitlesList>
  <List />
</TitlesList>

有没有办法在渲染时递归到子组件并克隆/修改它们的元素?

有关运行示例,请参阅 https://codesandbox.io/s/friendly-ives-c8df0

最佳答案

这是我需要修改的内容才能使其正常工作:

function recursiveMap(children, fn) {
  return React.Children.map(children, child => {
    if (!React.isValidElement(child)) {
      return child;
    }

    if (typeof child.type === "function") {
      child = child.type();
    }

    if (child.props.children) {
      child = React.cloneElement(child, {
        children: recursiveMap(child.props.children, fn)
      });
    }

    return fn(child);
  });
}

我注意到,当一个组件作为子组件传递时,child.type 是一个函数,而不是一个对象。因此,为了获取组件的子组件,您只需调用 child.type()

Here is the CodeSandbox example .

关于reactjs - 在 React 中递归克隆和修改子组件 - 包括其他组件的子组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57992106/

相关文章:

javascript - 在循环中调用 setState 只更新状态 1 次

reactjs - 如果在node_modules中有react和react-native,flow会提示

html - 是否可以重用从 HTMLCanvasElement.toDataURL() 或 canvas.toBlob() 返回的 DOMString?

javascript - HOC 和 ReactJS 中提升状态有什么区别?

reactjs - 使用 redux 和异步请求响应钩子(Hook)表单

javascript - requireNativeComponent : "RNSScreenStackHeaderConfig" was not found in the UIManager when running android app

javascript - Webpack 分块。没有内容出现 - block 未加载

javascript - 在 ReactJS 中等待嵌套对象数据可用的最佳方法

javascript - 如何使用 nextProps 值在 React componentWillReceiveProps 方法中编写整洁干净的代码

reactjs - Makefile 命令在子文件夹中运行 react 测试套件