Почему я не могу получить доступ к методам компонента извне в ReactJS? Почему это невозможно и есть ли способ решить это?
Рассмотрим код:
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
user1518183
источник
источник
Pubsub
?Ответы:
React предоставляет интерфейс для того, что вы пытаетесь сделать с помощью
ref
атрибута . Назначьте компонент aref
, и егоcurrent
атрибут будет вашим пользовательским компонентом:Примечание : это будет работать, только если дочерний компонент объявлен как класс, согласно документации, найденной здесь: https://facebook.github.io/react/docs/refs-and-the-dom.html#adding-a- реф-к-а-класс компонент
Обновление 2019-04-01: Изменен пример использования класса и
createRef
последних документов React.Обновление 2016-09-19: Изменен пример использование рефа обратного вызова каждого из руководства по
ref
атрибутам Струнных документов.источник
props
и выполнит повторную визуализацию соответственно.{(child) => this._child = child}
приведет к созданию функции, которая всегда возвращаласьtrue
, но это значение не используетсяref
атрибутом React .Если вы хотите вызывать функции для компонентов извне React, вы можете вызывать их по возвращаемому значению renderComponent:
Единственный способ получить дескриптор экземпляра React Component вне React - сохранить возвращаемое значение React.renderComponent. Источник .
источник
В качестве альтернативы, если метод Child действительно статичен (не является продуктом текущего состояния реквизита), вы можете определить его
statics
и затем обращаться к нему, как если бы вы использовали метод статического класса. Например:источник
Начиная с React 16.3
React.createRef
можно использовать (использоватьref.current
для доступа)источник
Начиная с React 0.12 API немного изменился . Действительный код для инициализации myChild будет следующим:
источник
Вы могли бы также сделать это так, не уверен , если это план хорошо: D
источник
Как упоминалось в некоторых комментариях,
ReactDOM.render
больше не возвращает экземпляр компонента. Вы можете передатьref
обратный вызов при рендеринге корня компонента, чтобы получить экземпляр, например так:и:
источник
Еще один способ так просто:
функция снаружи:
Свяжите это:
Пожалуйста, ознакомьтесь с полным руководством здесь: Как использовать «это» React Component извне?
источник