Imperative vs Wire Apex Calls in Lightning Web Components (LWC)
In Salesforce development, Lightning Web Components (LWC) support two primary approaches to communicate with Apex (server-side logic): the reactive ‘@wire’ and the direct, on-demand imperative calling method.
What is Imperative Apex Calling?
Imperative Apex calling refers to explicitly invoking an Apex method inside a JavaScript function or event handler (like a button click), rather than binding it declaratively using ‘@wire’. It gives developers full control over when the Apex call is made, how the response is handled, and how errors are managed.
When to Use Imperative Apex Calls?
– Triggering server logic on user actions (e.g., button clicks)
– Applying conditional logic before calling Apex
– Avoiding unnecessary data fetching
– Post-processing or transforming returned data
Syntax and Setup
Step-by-step example of imperative call:
📁 Apex Controller:
public with sharing class AccountController {
@AuraEnabled
public static List<Account> getAccounts(String industry) {
return [SELECT Id, Name, Industry FROM Account WHERE Industry = :industry LIMIT 10];
}
}
📁 LWC JavaScript:
import { LightningElement, track } from ‘lwc’;
import getAccounts from ‘@salesforce/apex/AccountController.getAccounts’;
export default class ImperativeAccountCaller extends LightningElement {
@track accounts;
@track error;
industry = ‘Technology’;
handleFetchAccounts() {
getAccounts({ industry: this.industry })
.then(result => {
this.accounts = result;
this.error = undefined;
})
.catch(error => {
this.error = error;
this.accounts = undefined;
});
}
}
📁 LWC HTML Template:
<template>
<lightning-button label=”Get Accounts” onclick={handleFetchAccounts}></lightning-button>
<template if:true={accounts}>
<template for:each={accounts} for:item=”acc”>
<p key={acc.Id}>{acc.Name} – {acc.Industry}</p>
</template>
</template>
<template if:true={error}>
<p style=”color:red”>Error: {error.body.message}</p>
</template>
</template>
Key Benefits of Imperative Calls
– Full control over execution timing
– Can add pre-call logic and data transformation
– Easier to handle complex flows or user interactions
Considerations
– Not reactive: doesn’t auto-refresh when data changes
– Manual error/data handling needed
– Best for conditional flows, not passive auto-fetching
What is @wire Apex Calling?
@wire is a reactive mechanism in LWC that automatically calls Apex methods and refreshes the data when the parameter values change. It’s used for simple, read-only data fetching and is more declarative.
Syntax Example of @wire:
import { LightningElement, wire } from ‘lwc’;
import getAccounts from ‘@salesforce/apex/AccountController.getAccounts’;
export default class WireExample extends LightningElement {
@wire(getAccounts, { industry: ‘Technology’ })
accounts;
}
Imperative vs. @wire Comparison
| Feature | @wire (Reactive) | Imperative (Manual) |
|———————–|——————–|———————|
| Auto-fetch on param change | ✅ Yes | ❌ No |
| Called on user action | ❌ No | ✅ Yes |
| Error/Data auto-handling | ✅ Yes | ❌ No |
| Custom logic control | ❌ Limited | ✅ Full |
Conclusion
Both imperative and @wire approaches have their place in LWC development. Use @wire for passive, reactive data loading and imperative calls when you need user-driven or conditional logic. Understanding both gives you the flexibility to build efficient and responsive applications.