DEV Community

Emal Isuranga
Emal Isuranga

Posted on

Why Do We Write `super(props)` in React?

If you've been working with React class components, you've likely come across the super(props) statement in the constructor method. This might seem a bit confusing, especially for those who are new to JavaScript's class syntax and inheritance model. In this blog post, we'll delve into what super(props) does and why it's necessary in React class components.

Understanding super(props)

To understand super(props), it's essential to know a bit about JavaScript classes and inheritance. In JavaScript, classes can inherit properties and methods from other classes. This is done using the extends keyword.

When a class is derived from another class, the derived class inherits the properties and methods of the base class. The super keyword is used to call the constructor of the base class and initialize the this context in the derived class.

The super Keyword

The super keyword refers to the parent class. When used in a constructor, it must be called before accessing this in the derived class. Failing to call super before accessing this will result in a ReferenceError.

The props Argument

In React, components can accept inputs, called props, which are passed down from parent components. When we define a class component, we often want to access these props within our component.

The Constructor in React Components

In React class components, the constructor is used for two main purposes:

  1. Initializing state: If you need to set the initial state of your component, you can do so in the constructor.
  2. Binding event handlers: If you need to bind methods to the class in stance, you can do this in the constructor.

Here’s a basic example:

import React, { Component } from 'react';

class MyComponent extends Component {
  constructor(props) {
    super(props);
    // Now 'this' is initialized and we can set the initial state
    this.state = {
      message: 'Hello, world!'
    };
  }

  render() {
    return (
      <div>{this.state.message}</div>
    );
  }
}

export default MyComponent;
Enter fullscreen mode Exit fullscreen mode

In the example above, super(props) is called inside the constructor. Let's break down why this is necessary.

Why Call super(props)?

1. Accessing this.props

When you call super(props), you pass the props argument to the constructor of the parent class, which is React.Component in this case. This allows you to access this.props inside the constructor and throughout the component.

class MyComponent extends Component {
  constructor(props) {
    super(props);
    console.log(this.props); // Props are now accessible
  }

  render() {
    return (
      <div>{this.props.message}</div>
    );
  }
}
Enter fullscreen mode Exit fullscreen mode

Without calling super(props), this.props would be undefined inside the constructor, which could lead to unexpected behavior and bugs.

2. Ensuring Proper Initialization

Calling super(props) ensures that the base class (React.Component) is properly initialized with the props passed to it. This is necessary for React's internal component management and lifecycle methods to work correctly.

3. Following ES6 Class Syntax Rules

According to the ES6 class specification, if a derived class has a constructor, it must call super() before accessing this. This is a rule enforced by JavaScript to ensure that the base class is properly initialized.

What Happens if You Don’t Call super(props)?

If you forget to call super(props) in a React class component, you’ll encounter an error when trying to access this.props or this.state inside the constructor. For example:

class MyComponent extends Component {
  constructor(props) {
    // super(props); // Uncommenting this will fix the error
    console.log(this.props); // ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
  }

  render() {
    return (
      <div>{this.props.message}</div>
    );
  }
}
Enter fullscreen mode Exit fullscreen mode

The above code will throw a ReferenceError because super(props) is not called, which means this is not properly initialized.

Conclusion

In summary, super(props) in React class components is crucial for the following reasons:

  • It allows you to access this.props inside the constructor.
  • It ensures that the base class (React.Component) is properly initialized.
  • It follows the ES6 class syntax rules, ensuring that this is correctly initialized before use.

While React has moved towards functional components and hooks for most new development, understanding how class components work is still valuable, especially for maintaining and upgrading older codebases. So, the next time you see super(props), you'll know exactly why it's there and what it does.

Top comments (0)