2.5 KiB
title | layout | permalink |
---|---|---|
Refs Must Have Owner Warning | single | warnings/refs-must-have-owner.html |
You are probably here because you got one of the following error messages:
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).
earlier versions of 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
render
method, or you have multiple copies of React loaded.
This usually means one of three things:
- You are trying to add a
ref
to a function component. - You are trying to add a
ref
to an element that is being created outside of a component's render() function. - You have multiple (conflicting) copies of React loaded (eg. due to a misconfigured npm dependency)
Refs on Function Components
If <Foo>
is a function component, you can't add a ref to it:
// Doesn't work if Foo is a function!
<Foo ref={foo} />
If you need to add a ref to a component, convert it to a class first, or consider not using refs as they are rarely necessary.
Strings Refs Outside the Render Method
This usually means that you're trying to add a ref to a component that doesn't have an owner (that is, was not created inside of another component's render
method). For example, this won't work:
// Doesn't work!
ReactDOM.render(<App ref="app" />, el);
Try rendering this component inside of a new top-level component which will hold the ref. Alternatively, you may use a callback ref:
let app;
ReactDOM.render(
<App ref={inst => {
app = inst;
}} />,
el
);
Consider if you really need a ref before using this approach.
Multiple copies of React
Bower does a good job of deduplicating dependencies, but npm does not. If you aren't doing anything (fancy) with refs, there is a good chance that the problem is not with your refs, but rather an issue with having multiple copies of React loaded into your project. Sometimes, when you pull in a third-party module via npm, you will get a duplicate copy of the dependency library, and this can create problems.
If you are using npm... npm ls
or npm ls react
might help illuminate.