¿Por qué no puedo acceder a los métodos de componentes desde "afuera" en ReactJS? ¿Por qué no es posible y hay alguna forma de resolverlo?
Considera el código:
var Parent = React.createClass({
render: function() {
var child = <Child />;
return (
<div>
{child.someMethod()} // expect "bar", got a "not a function" error.
</div>
);
}
});
var Child = React.createClass({
render: function() {
return (
<div>
foo
</div>
);
},
someMethod: function() {
return 'bar';
}
});
React.renderComponent(<Parent />, document.body);
javascript
reactjs
dom
usuario1518183
fuente
fuente
Pubsub
?Respuestas:
React proporciona una interfaz para lo que está intentando hacer a través del
ref
atributo . Asigne un componente aref
, y sucurrent
atributo será su componente personalizado:Nota : Esto solo funcionará si el componente hijo se declara como una clase, según la documentación que se encuentra aquí: https://facebook.github.io/react/docs/refs-and-the-dom.html#adding-a- componente de referencia a clase
Actualización 2019-04-01: Se modificó el ejemplo para usar una clase y los
createRef
últimos documentos de ReactActualización 2016-09-19: Se modificó el ejemplo para usar la devolución de llamada de referencia por guía de los
ref
documentos del atributo String .fuente
props
volverá a generar de manera apropiada.{(child) => this._child = child}
crearía una Función que siempre regresatrue
, pero ese valor no es usado por elref
atributo React .Si desea llamar a funciones en componentes desde fuera de React, puede llamarlas al valor de retorno de renderComponent:
La única forma de obtener un identificador para una instancia de React Component fuera de React es almacenando el valor de retorno de React.renderComponent. Fuente .
fuente
Alternativamente, si el método en Child es verdaderamente estático (no es un producto de accesorios actuales, estado), puede definirlo
statics
y luego acceder a él como lo haría con un método de clase estática. Por ejemplo:fuente
A partir de React 16.3
React.createRef
se puede usar (usarref.current
para acceder)fuente
Desde React 0.12, la API ha cambiado ligeramente . El código válido para inicializar myChild sería el siguiente:
fuente
También podría hacerlo así, no estoy seguro si es un buen plan: D
fuente
Como se menciona en algunos de los comentarios,
ReactDOM.render
ya no devuelve la instancia del componente. Puede pasar unaref
devolución de llamada al representar la raíz del componente para obtener la instancia, de esta manera:y:
fuente
Otra forma tan fácil:
funcionar afuera:
Atarlo:
Vea el tutorial completo aquí: ¿Cómo usar "esto" de un Componente React desde afuera?
fuente