当前位置: 首页 > 面试题库 >

如何将道具传递给{this.props.children}

尚棋
2023-03-14
问题内容

我试图找到定义可以以一般方式使用的组件的正确方法:

<Parent>
  <Child value="1">
  <Child value="2">
</Parent>

当然,可以想象<select>并在父组件和子组件之间进行渲染的<option>逻辑。

对于这个问题,这是一个虚拟的实现:

var Parent = React.createClass({
  doSomething: function(value) {
  },
  render: function() {
    return (<div>{this.props.children}</div>);
  }
});

var Child = React.createClass({
  onClick: function() {
    this.props.doSomething(this.props.value); // doSomething is undefined
  },
  render: function() {
    return (<div onClick={this.onClick}></div>);
  }
});

问题是,每当您用于{this.props.children}定义包装器组件时,如何将某些属性传递给其所有子组件?


问题答案:

用新道具克隆Children

您可以使用React.Children遍历子级,然后使用React.cloneElement使用新的道具(浅合并)克隆每个元素,例如:

import React, { Children, isValidElement, cloneElement } from 'react';

const Child = ({ doSomething, value }) => (
  <div onClick={() => doSomething(value)}>Click Me</div>
);

function Parent({ children }) {
  function doSomething(value) {
    console.log('doSomething called by child with value:', value);
  }

  render() {
    const childrenWithProps = Children.map(children, child => {
      // Checking isValidElement is the safe way and avoids a TS error too.
      if (isValidElement(child)) {
        return cloneElement(child, { doSomething })
      }

      return child;
    });

    return <div>{childrenWithProps}</div>
  }
};

ReactDOM.render(
  <Parent>
    <Child value="1" />
    <Child value="2" />
  </Parent>,
  document.getElementById('container')
);

小提琴:https :
//jsfiddle.net/2q294y43/2/

称呼children为功能

您也可以将道具传递给带有渲染道具的children。在这种方法中,子代(可以是children或任何其他prop名称)是一个函数,可以接受您要传递的任何参数并返回子代:

const Child = ({ doSomething, value }) => (
  <div onClick={() =>  doSomething(value)}>Click Me</div>
);

function Parent({ children }) {
  function doSomething(value) {
    console.log('doSomething called by child with value:', value);
  }

  render() {
    // Note that children is called as a function and we can pass args to it
    return <div>{children(doSomething)}</div>
  }
};

ReactDOM.render(
  <Parent>
    {doSomething => (
      <React.Fragment>
        <Child doSomething={doSomething} value="1" />
        <Child doSomething={doSomething} value="2" />
      </React.Fragment>
    )}
  </Parent>,
  document.getElementById('container')
);

如果您愿意,也可以代替<React.Fragment>或简单地<>返回一个数组。

小提琴:https :
//jsfiddle.net/ferahl/y5pcua68/7/



 类似资料:
  • 问题内容: 我正在尝试找到定义可以以一般方式使用的某些组件的正确方法: 当然,您可以想象并作为该逻辑的示例,在父组件和子组件之间存在一种渲染逻辑。 对于这个问题,这是一个虚拟的实现: 问题是,每当您用于定义包装器组件时,如何将某些属性传递给其所有子组件? 问题答案: Cloning children with new props 您可以使用React.Children遍历子级,然后使用React.

  • 我是一个相当新的反应,这是一个我正在努力解决的问题。

  • 我使用的是dev-express中的react-grid库,库中有一个表组件,我们可以向它传递单元格组件,在CustomCell中,我使用的是Material UI中的菜单 在上述情况下,菜单工作良好, 但是我想要传递道具到这个组件,我尝试了以下操作 在这种情况下菜单不工作,我想知道是否有一个替代的方法来实现第二种情况。

  • 使用RxJS如何在观察者上传递新属性?所以基本上我希望道具“customProp”可以被观察到 添加更多的信息-所以基本上,我试图创建一个冷可观察的,其中制片人需要一个道具,应该来自订户 添加用法信息--coldObservable是DB连接函数,customProp是需要在DB上执行的查询

  • 我是新的TypeScript和我正在努力写HOC与typecheck。这是我的HOC: 它抛出一个错误: 类型(组件:反应。组件类型 我完全不知道如何继续使用这段代码,也不知道如何让它工作。 有什么想法吗?

  • 问题内容: 一个人如何将没有价值的道具传递给反应成分? 注意-没有为这些道具指定默认道具值。 我似乎找不到关于它的任何引用,但是通过观察这些属性的值(它们在默认情况下会分配给它们)。 问题答案: 编译器将您传递的内容解释为布尔值属性。编写纯HTML时也是如此。没有值的属性被解释为布尔值。由于JSX是用于编写HTML的语法糖,因此具有相同的行为是有道理的。 官方的React文档包含以下内容: 布尔属