Skip to main content

Enable reactivity in lwc:spread (LWC)



With the introduction of Salesforce Summer '23 release, a new feature for LWC components called lwc:spread became available. This feature enables us to spread properties on child components. Although the documentation provides instructions on its usage, ensuring the spread feature's reactivity is essential to fully leverage its capabilities. In this article, we will delve into examples of a parent component and a nested child component to grasp how to achieve reactivity for maximum usability.


The lwc:spread directive allows accepting a single object with key-value pairs, where the keys represent property names. In the example below, we demonstrate how to use this feature to spread properties on child components:


<!-- app.html -->

<template>

    <c-child lwc:spread={childProps}></c-child>

</template>

In this case, the parent component sets an object called "childProps" with properties "name" and "country" having values 'James Smith' and 'USA' respectively.


// app.js

import { LightningElement } from 'lwc';


export default class extends LightningElement {

childProps = { name: 'James Smith', country: 'USA' };

}


The child component, "c-child," utilizes these properties within its template:


<!-- child.html -->

<template>

  <p>Name: {name}</p>

  <p>Country : {country} </p>

</template>

To expose the properties to the parent component, we use the @api decorator:


// child.js

import { LightningElement, api } from 'lwc';


export default class Child extends LightningElement {

@api name;

@api country;

}


One important thing to note is that lwc:spread is always applied last and will override any directly declared properties in the template. Only one lwc:spread instance can be used on a directive.


<!-- app.html -->

<template>

  <c-child name="lwc" lwc:spread={childProps}></c-child>

</template>

In this example, even though the parent component sets "name" as "LWC," the child component receives "name" as "Lightning Web Components" due to the spread functionality.


Additionally, it's crucial to know that lwc:spread doesn't bind the component to event handlers defined in the template. For instance, you can pass an onclick handler as a property in the object.


<!-- app.html -->

<template>

    <c-child lwc:spread={simpleProps}></c-child>

</template>

Here, the "c-child" component receives "name" as "LWC." When the "c-child" element is clicked, "spreadClick()" updates "name" to "Lightning Web Components."


// app.js

import { LightningElement } from 'lwc';


export default class extends LightningElement {

simpleProps = { name: "LWC", onclick: this.spreadClick.bind(this) };

spreadClick() {

this.simpleProps = { name: "Lightning Web Components" };

}

}


Remember that although we don't include onclick in spreadClick(), the element retains the onclick behavior as previously assigned via the simpleProps object.


Lastly, HTML attributes on a child component are mostly reflected as properties. For instance, the class attribute is reflected as the className property.


For example:


<!-- app.html -->

<template>

    <c-child lwc:spread={spanProps}></c-child>

</template>

The spanProps property causes the "c-child" element to be rendered as <c-child class="spanclass" id="mySpan"></c-child>.


// app.js

import { LightningElement } from 'lwc';


export default class extends LightningElement {

spanProps = { className: 'spanclass', id: 'myspan' };

}


Reactivity Challenge:


you'll notice that the className and i in the child component won't be re-rendered as they would with the regular parameter passing approach. The provided documentation offers an example where we can modify the name, but it requires completely assigning another object to the same variable.


Here's the static approach presented in the documentation:



spanProps = { className: 'spanclass', id: 'myspan' };


{


    this.spanProps.className = 'childProps123235';


    this.spanProps.id = 9876;


    this.spanProps = {...this.spanProps};


}

However, this static approach lacks the dynamic flexibility that developers might seek when changing parameters.


Findings:


We begin with the example provided by Salesforce, which at least works, and then attempt to modify it:

{


    this.spanProps = {};


    this.spanProps.className = 'childProps12355';


    this.spanProps.id = 9876;


}

While this solution does work, it may not be suitable if spanProps already contains important information.


An alternative approach involves using a temporary variable:

{


    const a = {...this.spanProps};


    a.className = 'ABCD';


    this.spanProps = a;


}

In both cases, the property is re-rendered on the component. By comparing this with the earlier example that didn't work, we can see that it's essential to put the reassignment first before any data manipulations or use destructuring reassignment with the required parameters.


However, it's important to note that some reliable methods like Object.assign or JSON.parse(JSON.stringify(obj)) do not work:


This behavior is not adequately described in the documentation, resulting in inconsistency. To make the spread operator reactive, developers must be aware of these rules. Hopefully, it will be addressed or better explained in the near future since this feature is truly beneficial and can efficiently manage child component parameters.


Conclusion:


Reactivity plays a crucial role when utilizing the lwc:spread feature in LWC components. Although there are workarounds to achieve reactivity, the behavior and rules are not explicitly documented. By understanding the correct approaches, developers can fully leverage the power of lwc:spread to enhance the management of child component parameters.


Happy coding, everyone!



Comments

Popular Posts

Top 100 Most common used Apex Method in Salesforce

  Here are 100 more Apex methods in Salesforce: 1.       insert: Inserts records into the database. 2.       update: Updates records in the database. 3.       delete: Deletes records from the database. 4.       upsert: Updates or inserts records into the database. 5.       query: Retrieves records from the database using SOQL. 6.       getContent: Retrieves the content of a document or attachment. 7.       getContentAsPDF: Generates a PDF file from a Visualforce page or HTML content. 8.       addError: Adds a custom error message to a record and prevents saving. 9.       start: Initiates processing in batch Apex. 10.    execute: Processes a batch of records in batch Apex. 11.    finish: Finalizes processing in batch Apex....

How to create ICS/Calendar File | Helps you to download the calendar invites

  Want to know how to create ICS(Internet Calendar Scheduling) file for Business purpose....👀    ICS (Internet Calendar Scheduling) file is a calendar file saved in a universal calendar format used by several email and calendar programs, including Microsoft Outlook, Google Calendar, Notes and Apple Calendar. It enables users to publish and share calendar information on the web and over email. Lets see the code. The code is written in lwc(Lightning web component). HTML:   <template> <div class="login-container"> <h1 style="size: 14px;"><b>Create ICS File</b></h1> <div class="form-group"> <lightning-input type="datetime" name="input1" value={EventEndValue} onchange={startDate} label="Enter Start date/time value" ></lightning-input> </div> <div class="form-group"> <lightning-input type="...

Sharing records by Apex in Salesforce

  Greetings, everyone! In today's session, we'll delve into the topic of sharing records within an Apex class. As we're aware, there exist various methods through which we can accomplish the sharing of records. We engage in record sharing primarily when the object's Organization Wide Default (OWD) settings are set to private. Sharing settings come into play when certain predefined criteria are met, allowing us to extend access to records to designated groups or roles. In cases where intricate logic is involved, manual sharing is employed. While this approach proves beneficial for specific records, instances where a multitude of records require automated handling, Apex sharing becomes the preferred solution. Salesforce offers a 'Share' object for each type of object, with distinct naming conventions: For standard objects, it's 'StandardobjectName+Share', such as 'AccountShare' for the 'Account' object. Custom objects follow the pattern...

Login Salesforce Without Credentials(Without UserName and Password)

  Want to login into Salesforce without credentials. Please follow the below STEPS: STEPS:-  1)  Goto to setup  --> Open Developer Console. 2) Goto debug --> Open Execute Anonymous Window --> It will open the pop. 3) Please write the below code in Anonymous window.       String sessionId = UserInfo.getOrganizationId() + '' + UserInfo.getSessionId().SubString(15);      System.debug('$$$$ Session Id ' + sessionId); 4) Click on Execute and filter the debug. You can see one session Id with Organization Id. Now, we have to copy the debug session Id and create one login URL. Steps to create Login URL: 1) Copy the Salesforce URL. Please refer the screenshot shown below. 2) Now concatenate the session Id with the salesforce URL and your Session Id Will look like below. https://d5g000004zfq2eai-dev-ed.lightning.force.com/secur/frontdoor.jsp?sid=00D5g000004zfQ2EAI!AQgAQKzTcnQTifXpRnQ7DgECtk_rv.w9BT5FoPEAmoy_UrgG4HJ6B9YFpQ2LVlmnJhBrYPSf8cI...

SF Fact #03 | Undelete Failed, Entity is not in recycle bin

  Similar to ENTITY_IS_DELETED error, if we attempt to undelete a record from recycle bin by mistake which has already been hard deleted, the following error is encountered: UNDELETE_FAILED. When a record is deleted, it moves to the Recycle Bin. This is known as "soft deletion," allowing the record to be easily restored through the user interface. However, under certain conditions, a deleted record will no longer appear in the Recycle Bin: Master-Detail Relationship (Child Deleted First): If a record is a child or detail in a master-detail relationship and it is deleted before its parent record, then after the parent is deleted, the child record transitions to a "hard deleted" status. In this state, the child record cannot be recovered through the Recycle Bin and must be recreated if needed. Master-Detail Relationship (Parent Deleted): If a record is a child or detail in a master-detail relationship and the parent record is deleted, the child record is also soft del...