2015-09-06 49 views
1

所以,在反应过来,我们知道我们可以有孩子通过这样的回调与家长沟通:如何通过祖父母组件中的“子女”动态定义父母/子女组成部分之间的通信?

Child = React.createClass({ 
    render() { 
    return (
     <div> 
     <button onClick={this.props.onAction.bind(null, this.props.name)}>Child button</button> 
     </div> 
    ) 
    } 
}); 

Parent = React.createClass({ 
    handleChildAction(name) { 
    alert(`Child button ${name} clicked`); 
    }, 

    render() { 
    return (
     <div> 
     <Child name="robot1" onAction={this.handleChildAction} /> 
     </div> 
    ) 
    } 
}); 

但我不清楚如何可以有这个父母/子女之间的双向通信一种格式:

Container = React.createClass({ 
    render() { 
    return (
     <Parent> 
     <Child name="robot1" /> 
     <Child name="robot2" /> 
     </Parent> 
    ) 
    } 
}); 

我怎样才能得到Parent向下发送信息给孩子,并有Child发送信息吗?

+1

http://facebook.github.io/react/docs/two-way-binding-helpers.html –

+1

不错!这是通常回调结构的一个很好的捷径,但它并不能解释如何在上面的场景#2中让'Parent'与孩子交谈。 – ffxsam

回答

1

这是一个情况下,我一般尽量避免,但是当父母表示特定类型的孩子的一些容器,或者应该提出一些其他类型的抽象的也可以是有用in certain situations

当你觉得有必要,你可以利用mapping over this.props.children里面Parentalong with React.cloneElement给他们传递额外的道具。请记住,您应该将this.props.children视为不透明,并且只能通过React.Children帮助程序进行迭代。例如:

var Child = React.createClass({ 
    render() { 
    return (
     <div> 
     <button onClick={this.handleClick}>Child button</button> 
     </div> 
    ) 
    }, 

    handleClick(e) { 
    this.props.onAction(this.props.name); 
    } 
}); 

var Parent = React.createClass({ 
    handleChildAction(name) { 
    alert(`Child button ${name} clicked`); 
    }, 

    render() { 
    return (
     <div>{React.Children.map(this.props.children, this.renderChild)}</div> 
    ) 
    }, 

    renderChild(child) { 
    return React.cloneElement(child, {onAction: this.handleChildAction}); 
    } 
}); 

var Container = React.createClass({ 
    render() { 
    return (
     <Parent> 
     <Child name="robot1" /> 
     <Child name="robot2" /> 
     </Parent> 
    ); 
    } 
}); 

这里的a working JSBin演示了该技术:https://jsbin.com/mijune/edit?js,output

+0

我注意到'Container'组件中,你传递给'Child'的是下面的prop:'onAction = {this.handleChildAction}',但'Container'中没有'handleChildAction'方法。或者'this'是指'Parent'? – ffxsam

+0

我现在明白了。看起来你甚至不需要'Container'组件中的'onAction = {this.handleChildAction}'。我删除了这些,并且它仍然正常工作,因为您在克隆子项时添加处理程序道具。 – ffxsam

+0

@ffxsam啊,是的,这是一个错字。我会解决的! –

0

你没有提到祖父母。这个怎么样。

Child = React.createClass({ 
    handleAction(name) { 
     this.props.onAction(this.props.name); 
    }, 
    render() { 
     return (
      <div> 
       <button onClick={this.handleAction}>Child button</button> 
      </div> 
     ) 
    } 
}); 

Parent = React.createClass({ 
    getInitialState: function() { return {data: ''}; }, 
    handleChildAction(name) { 
     alert(`Child button ${name} clicked`); 
     this.props.grandParentAction(data); 
    }, 

    render() { 
     return (
      <div> 
       <Child name="robot1" onAction={this.handleChildAction} parentData={this.props.grandParentData} /> 
      </div> 
     ) 
    } 
}); 

GrandParent = React.createClass({ 
    getInitialState: function() { return {data: ''}; }, 
    handleParentAction(name) { 
     alert(`Parent passed ${name}`); 
     this.setState({data: 'newData'}); 
    }, 

    render() { 
     return (
      <div> 
       <Child name="robot1" onAction={this.handleChildAction} parentData={this.state.data} /> 
      </div> 
     ) 
    } 
});  
+0

它的确如此,但'Parent'不能包含特定的硬编码子代。 “父”包含在一个更大的组件中,该组件将定义孩子是什么。 – ffxsam

+0

然后,父母需要将状态传递给其父母,并将它的道具而不是其状态发送给孩子。 –

+0

或将祖父母处理程序传递给孩子。 –