Si está haciendo esto simplemente porque quiere que el Niño proporcione un rasgo reutilizable a sus padres, entonces puede considerar hacerlo usando accesorios de renderizado .
Esa técnica realmente pone la estructura al revés. El Childahora envuelve al padre, por lo que lo he renombrado a AlertTraitcontinuación. Mantuve el nombre Parentde continuidad, aunque en realidad no es un padre ahora.
// Use it like this:
<AlertTrait renderComponent={Parent}/>
class AlertTrait extends Component {
// You may need to bind this function, if it is stateful
doAlert() {
alert('clicked');
}
render() {
return this.props.renderComponent(this.doAlert);
}
}
class Parent extends Component {
render() {
return (
<button onClick={this.props.doAlert}>Click</button>
);
}
}
En este caso, AlertTrait proporciona uno o más rasgos que pasa como accesorios a cualquier componente que se le haya dado en su renderComponent accesorio.
El padre recibe doAlert como accesorio y puede llamarlo cuando sea necesario.
(Para mayor claridad, llamé al accesorio renderComponenten el ejemplo anterior. Pero en los documentos React vinculados anteriormente, simplemente lo llamanrender ).
El componente Trait puede representar cosas que rodean al elemento primario, en su función de representación, pero no representa nada dentro del elemento primario. En realidad, podría representar cosas dentro del padre, si pasara otro accesorio (por ejemplo,renderChild ) al padre, que el padre podría usar durante su método de renderizado.
Esto es algo diferente de lo que solicitó el OP, pero algunas personas podrían terminar aquí (como lo hicimos nosotros) porque querían crear un rasgo reutilizable, y pensaron que un componente hijo era una buena manera de hacerlo.