我有两种类型的组件.我们称之为外在和内在.想象一下这样的事情:
{this.prop.title} ({this.state.withX}/{this.state.total})
我有这个功能:
getInitialState: function() { return { total: React.Children.count(this.props.children), withX: /// ??? /// }; }
我如何获得这个价值?我试图得到这样的东西:
withX: function() { var counter = React.Children.forEach(this.props.children, function(child) { // if... return //something }); return counter; }
但是......我觉得它会让我无处可去.
React现在有React.Children.count(children)
这里记录的方法https://facebook.github.io/react/docs/react-api.html#react.children.count
更新:经过反思,我不确定这实际上是否回答了这个问题,但无论如何都会离开这里,因为人们已经投了票.
当您遍历孩子时,您可以检查他们的道具.例如,使用forEach
上面提到的方法,您可以执行以下操作:
withX: function() { var counter = 0; React.Children.forEach(this.props.children, function(child) { if (child.props.isX) counter++; }); return counter; }
React还提供了一个toArray
帮助程序,允许您使用JS提供的nice数组方法执行相同的操作:
return React.Children.toArray(this.props.children).filter(function(child) { return child.props.isX; }).length;
如果您正在使用ES6,可以使用箭头功能非常简洁地执行此操作:
return React.Children.toArray(this.props.children).filter(c => c.props.isX).length;
唯一的问题是,如果Outer
正在进行计数,那么Outer
还需要渲染h4
.这是一个完整的例子:
const App = React.createClass({ render() { return (); } }); const Outer = React.createClass({ getInitialState() { return { total: React.Children.count(this.props.children), withX: this.countChildrenWithX(this.props.children) }; }, countChildrenWithX(children) { const { toArray } = React.Children; return toArray(children).filter(c => c.props.isX).length; }, render() { return ( ); } }); const Inner = React.createClass({ render() { return{this.props.title} ({this.state.withX}/{this.state.total})
{this.props.children}Inner - withX = {String(!!this.props.isX)}; } });
而这里的工作JS斌证实:https://jsbin.com/xameyun/edit?js,output