Предупреждение: У рефа должен быть владелец
Вероятно, вы зашли на эту страницу потому что получили одно из следующих сообщений об ошибке:
React 16.0.0+
Warning:
Element ref was specified as a string (myRefName) but no owner was set. You may have multiple copies of React loaded. (details: https://fb.me/react-refs-must-have-owner).
более ранние версии React
Warning:
addComponentAsRefTo(…): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component’s
rendermethod, or you have multiple copies of React loaded.
Обычно это означает одно из трёх:
- Вы пытаетесь добавить
refв функциональный компонент. - Вы пытаетесь добавить
refк элементу, который был создан вне методаrender()текущего компонента. - У вас загружено несколько конфликтующих копий React (например, из-за неправильной настройки npm-зависимостей).
Рефы и функциональные компоненты
Если <Foo> — функциональный компонент, ему нельзя добавить ref:
// Не работает, если Foo это функция!
<Foo ref={foo} />Если требуется добавить ref к компоненту, преобразуйте его в класс или не пользуйтесь механизмом рефов, потому что он редко необходим.
Строковые рефы вне метода render
Обычно это означает, что вы пытаетесь добавить реф к компоненту, который не имеет владельца (т.е. не был создан внутри метода render какого-либо компонента).
Следующий пример не будет работать:
// Не работает!
ReactDOM.render(<App ref="app" />, el);Попробуйте отрендерить этот компонент внутри нового компонента-обёртки, который будет содержать реф. Как вариант, вы можете использовать колбэк-реф:
let app;
ReactDOM.render(
<App ref={inst => {
app = inst;
}} />,
el
);Хорошо подумайте, действительно ли вам нужен реф перед использованием этого подхода.
Несколько копий React
Bower хорошо решает вопрос дублирования зависимостей, а вот npm — нет. Если вы не делаете с вашими рефами ничего особенного, скорее всего, проблема не в вашем коде, а в нескольких загруженных копиях React. Иногда, когда вы устанавливаете сторонний пакет через npm, вы можете получить дублирование библиотеки из зависимостей, и это может создать проблему.
Если вы используете npm, npm ls или npm ls react поможет разобраться, какие установлены зависимости.