this.refs.something returns "undefined"
Solution 1
The correct place to work with refs
is inside specific React lifecycle methods e.g. ComponentDidMount, ComponentDidUpdate
You cannot reference refs
from the render()
method. Read more about the cautions of working with refs
here.
If you move your console.log('REFS', this.refs.russian);
call to ComponentDidMount
or ComponentDidUpdate
lifecycle methods (assuming you are on React >= 14) you should not get undefined as a result.
UPDATE: also refs will not work on stateless components per the caution link above
Solution 2
Check that you are not accessing ref before the child component has been mounted. E.g. it doesn't work in componentWillMount
. A different pattern which auto invokes ref related callback after the element has been mounted is this-
<div ref={(elem)=>(console.log(elem))}/>
You can use this notation to get mounted elements in deep nesting as well -
<div ref={this.props.onMounted}/>
Solution 3
Update since React version 16.4
In your constructor method define your ref like this
constructor(props) {
super(props);
this.russian = React.createRef();
}
In your render where you are using ref
do this.
<input
name="russian"
ref={this.russian} // Proper way to assign ref in react ver 16.4
/>
For e.g if you want to have focus when component mounts do this
componentDidMount() {
console.log(this.russian);
this.russian.current.focus();
}
Reference Refs Documentation React
Solution 4
Instead of putting your Console.log inside the function example(){...}
you should put it inside:
example=()=>{....}
John Doe
Updated on August 21, 2020Comments
-
John Doe over 3 years
I have an element with a
ref
that is defined and ends up getting rendered into the page :<div ref="russian" ...> ... </div>
I want to access the DOM element properties like
offset...
or something. However, I keep gettingundefined
and I haven't the faintest idea why. After some searching it's clear thatrefs
are only applicable to one file but I'm not using this anywhere besides this one page. I'm saying this to log it:console.log('REFS', this.refs.russian);
What could be causing this?
-
Reza almost 5 yearsuse an arrow function to wrap around an event handler, This is equivalent to calling .bind(Binding methods helps ensure that the second snippet works the same way as the first one) When you need to invoke a function prop with an argument, you should always specify a fat arrow function that invokes the prop, React will evaluate the expression when the component renders its content, which will invoke the prop even though the user hasn’t clicked the button element. This is rarely the intended effect and can cause unexpected behaviors or produce an error.
-
Jamie Marshall about 2 yearswhy do it this way?