Dlaczego nie mogę uzyskać dostępu do metod komponentów „z zewnątrz” w ReactJS? Dlaczego nie jest to możliwe i czy jest jakiś sposób na jego rozwiązanie?
Rozważ kod:
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
użytkownik1518183
źródło
źródło
Pubsub
?Odpowiedzi:
React zapewnia interfejs do tego, co próbujesz zrobić za pomocą
ref
atrybutu . Przypisz składnik aref
, a jegocurrent
atrybut będzie składnikiem niestandardowym:Uwaga : Działa to tylko wtedy, gdy komponent potomny zostanie zadeklarowany jako klasa, zgodnie z dokumentacją znajdującą się tutaj: https://facebook.github.io/react/docs/refs-and-the-dom.html#adding-a- ref-to-a-class-component
Aktualizacja 2019-04-01: Zmieniono przykład użycia klasy i
createRef
najnowszych dokumentów React.Aktualizacja 19.09.2016: Zmieniono przykład użyć ref zwrotnego za wytycznymi z tych
ref
atrybutów Smyczkowych docs.źródło
props
i odpowiednio zrenderuje.{(child) => this._child = child}
spowoduje utworzenie funkcji, która zawsze zwracatrue
, ale ta wartość nie jest używana przezref
atrybut React .Jeśli chcesz wywoływać funkcje na komponentach spoza React, możesz je wywołać na wartości zwracanej przez renderComponent:
Jedynym sposobem na uzyskanie dojścia do instancji React Component poza React jest przechowywanie wartości zwracanej React.renderComponent. Źródło .
źródło
Alternatywnie, jeśli metoda na Child jest naprawdę statyczna (nie jest produktem bieżących rekwizytów, stan), możesz ją zdefiniować,
statics
a następnie uzyskać do niej dostęp, tak jak metoda klasy statycznej. Na przykład:źródło
Od React 16.3
React.createRef
można używać, (użyj,ref.current
aby uzyskać dostęp)źródło
Od React 0.12 interfejs API został nieznacznie zmieniony . Prawidłowy kod do zainicjowania myChild byłby następujący:
źródło
Możesz to zrobić w ten sposób, nie jestem pewien, czy to dobry plan: D
źródło
Jak wspomniano w niektórych komentarzach,
ReactDOM.render
nie zwraca już instancji komponentu. Możesz przekazaćref
wywołanie zwrotne podczas renderowania katalogu głównego komponentu, aby uzyskać instancję, na przykład:i:
źródło
Kolejny sposób tak łatwy:
funkcja na zewnątrz:
Wiąż to:
Zobacz pełny samouczek tutaj: Jak korzystać z „tego” komponentu React z zewnątrz?
źródło