What does calling super() in a React constructor do?
Learning React from the docs and came across this example:
class Square extends React.Component {
constructor() {
super();
this.state = {
value: null,
};
}
...
}
According to Mozilla, super allows you to use this
in the constructor. Is there any other reason to use a standalone super
(I know super
allows you to access parent class's methods as well) but with React is there any other use case of just calling super()
by itself?
super()
will call the constructor
of its parent
class. This is required when you need to access some variables from the parent class.
In React, when you call super
with props, React will make props
available across the component through this.props
. See example 2 below
without super()
class A {
constructor() {
this.a = 'hello'
}
}
class B extends A {
constructor(){
console.log(this.a) //throws an error
}
}
console.log(new B())
with super()
class A {
constructor(props) {
this.props = props
}
}
class B extends A {
constructor(props) {
super(props)
console.log(this.props)
}
}
console.log(new B({title: 'hello world'}))
Hope this helps!
super()
is called inside a react component only if it has a constructor. For example, the below code doesn't require super:
class App extends React.component {
render(){
return <div>Hello { this.props.world }</div>;
}
}
However if we have a constructor then super()
is mandatory:
class App extends React.component {
constructor(){
console.log(this) //Error: 'this' is not allowed before super()
}
}
The reason why this
cannot be allowed before super()
is because this
is uninitialized if super()
is not called. However even if we are not using this
we need a super()
inside a constructor because ES6 class constructors MUST call super if they are subclasses
. Thus, you have to call super()
as long as you have a constructor. (But a subclass does not have to have a constructor.)
We call super(props)
inside the constructor if we have to use this.props
, for example:
class App extends React.component{
constructor(props){
super(props);
console.log(this.props); // prints out whatever is inside props
}
}
I hope I could make it clear.