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

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

<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}来定义一个包装组件,如何将某些属性传递给它的所有子项?


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

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

class Parent extends React.PureComponent {
  doSomething = (value) => {
    console.log('doSomething called by child with value:', value);
  }

  render() {
    const { children } = this.props;

    const childrenWithProps = React.Children.map(children, child =>
      React.cloneElement(child, { doSomething: this.doSomething }));

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

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

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


要获得一个稍微干净的方法,请尝试:

<div>
    {React.cloneElement(this.props.children, { loggedIn: this.state.loggedIn })}
</div>

注意 :只有在有一个孩子的情况下,它才有效,它是一个有效的React元素。


尝试这个

<div>{React.cloneElement(this.props.children, {...this.props})}</div>

它为我使用react-15.1。

链接地址: http://www.djcxy.com/p/4743.html

上一篇: How to pass props to {this.props.children}

下一篇: Should href be set with prop() or attr()?