Skip to main content

LWC Order of Execution Explained: The Complete Lifecycle Guide

In plain words: The "Order of Execution" in Lightning Web Components (LWC) is simply the timeline of a component's life. It dictates exactly when a component is created, added to the screen, updated with data, and finally removed. Knowing this timeline helps you put your JavaScript logic in the exact right place so your app runs quickly and without errors.

In Salesforce development, understanding how the Lightning framework orchestrates your code is crucial. If you try to access data before it loads, or modify an HTML element before it exists, your component will break. To build efficient and reliable applications, you must master the LWC lifecycle hooks.

Let's break down the exact order of execution for a Lightning Web Component, step by step.

1. The Initialization Phase (Creation)

The very first thing that happens is the creation of your component instance. Before anything is drawn on the screen, the framework sets up the basic foundation.

  • The Constructor: The constructor() method fires first. This is where basic component properties are initialized.
  • Setup: You must call super() inside the constructor to inherit the core LWC functionalities.
Developer Trap: Never try to access HTML elements, child components, or public properties (@api variables) inside the constructor(). They do not exist yet!

2. DOM Insertion (Connecting)

Once the component is created, the framework inserts it into the Document Object Model (DOM)—meaning it actually gets attached to the web page.

  • connectedCallback(): This hook fires the moment the component is inserted into the DOM.
  • Event Listeners: This is the perfect place to register event listeners or subscribe to Lightning Message Service (LMS) channels.
Real-Life Example: Use connectedCallback() to trigger an initial Apex callout to fetch data required for your component to display properly, such as grabbing a user's profile details as soon as the page loads.

3. The Rendering Phase

Now that the component is connected and has its initial data, it's time to actually paint the UI on the user's screen.

  • render(): The framework automatically invokes the render() method to generate the HTML structure. If you have nested child components, they are created and rendered now.
  • renderedCallback(): This hook fires after the component and all of its child components have finished rendering. It's used when you need to manipulate the DOM directly (like initializing a third-party charting library).
Developer Trap: Be extremely careful using renderedCallback(). If you update a reactive property (like a tracked variable) inside this hook, it will force the component to render again, which calls renderedCallback() again, creating an infinite loop that crashes the browser!

4. Data Binding & Reactivity

LWC is built on a reactive architecture. This means the framework constantly monitors your component for changes during its lifespan.

  • Whenever a reactive property (like an @api or @track variable) changes, the component automatically flags itself to re-render.
  • Asynchronous operations—like resolving Promises, waiting for timers, or getting a response from Apex—do not block the user interface. Once the data returns, the reactivity system seamlessly updates the screen.

5. Component Destruction (Cleanup)

When the user navigates away or closes a modal, the component is removed from the DOM. This triggers the destruction phase.

  • disconnectedCallback(): This hook runs just before the component is completely destroyed.
  • Cleanup: Always use this hook to purge caches, clear setInterval timers, and unsubscribe from event listeners to prevent memory leaks in the browser.
360 Card: The LWC Lifecycle Sequence
1. constructor() → Component is created.
2. connectedCallback() → Component is added to the page.
3. render() → HTML is generated.
4. renderedCallback() → HTML finishes painting on screen.
5. disconnectedCallback() → Component is removed.
Bonus: errorCallback() → Catches any errors bubbling up from child components.
import { LightningElement, api } from 'lwc';

export default class LifecycleDemo extends LightningElement {
    
    constructor() {
        super();
        console.log('1. Constructor fired');
    }

    connectedCallback() {
        console.log('2. Component connected to DOM');
    }

    renderedCallback() {
        console.log('3. Component finished rendering');
    }

    disconnectedCallback() {
        console.log('4. Component removed from DOM (Cleanup here)');
    }
}
Core Takeaway: Put your setup logic in connectedCallback, keep direct DOM manipulation in renderedCallback, and always clean up your messes in disconnectedCallback.

Conclusion

Mastering the order of execution in Lightning Web Components is the secret to building high-performance, enterprise-grade Salesforce applications. By aligning your JavaScript logic with the natural flow of the LWC framework, you ensure your apps are reactive, bug-free, and provide an outstanding user experience.

Happy coding!