Wire Decorator in Lightning Web Component
@wire
To read Salesforce data, Lightning web components use a reactive wire service. When the wire service provisions data, the component rerenders. Components use @wire
in their JavaScript class to specify a wire adapter or an Apex method.
We call the wire service reactive in part because it supports reactive variables, which are prefixed with $
. If a reactive variable changes, the wire service provisions new data. We say “provisions” instead of “requests” or “fetches” because if the data exists in the client cache, a network request may not be involved.
Decorate a Function with @wire
Wiring a property is useful when you want to consume the data or error
If the property decorated with @wire
is used as an attribute in the template and its value changes, the wire service provisions the data and triggers the component to rerender. The property is private, but reactive.
This code applies @wire
to the record
property.
// wireFunction.js
import { LightningElement, api, track, wire } from 'lwc';
import { getRecord } from 'lightning/uiRecordApi';
export default class WireFunction extends LightningElement {
@api recordId;
@track record;
@track error;
@wire(getRecord, { recordId: '$recordId', fields: ['Account.Name'] })
wiredAccount({ error, data }) {
if (data) {
this.record = data;
this.error = undefined;
} else if (error) {
this.error = error;
this.record = undefined;
}
}
/////// this function use to display the record value in html page
get name() {
return this.record.fields.Name.value;
}
}
<!-- wireFunction.html -->
<template>
<lightning-card title="Wire Function" icon-name="standard:contact">
<template if:true={record}>
<div class="slds-m-around_medium">
<p>{name}</p>
</div>
</template>
<template if:true={error}>
<c-error-panel errors={error}></c-error-panel>
</template>
</lightning-card>
</template>
Wire Apex Methods to Lightning Web Components
To use @wire
to call an Apex method, annotate the Apex method with @AuraEnabled(cacheable=true)
. A client-side Lightning Data Service cache is checked before issuing the network call to invoke the Apex method on the server. To refresh stale data, call refreshApex()
, because Lightning Data Service doesn’t manage data provisioned by Apex.
public with sharing class ContactController {
@AuraEnabled(cacheable=true)
public static List<Contact> getContactList() {
return [
SELECT Id, Name, Title, Phone, Email
FROM Contact
WHERE Email != ''
LIMIT 10
];
}
}
// apexWireWithLWC.js
import { LightningElement, wire } from 'lwc';
import getContactList from '@salesforce/apex/ContactController.getContactList';
export default class ApexWireWithLWC extends LightningElement {
@wire(getContactList) contacts;
}
<!-- apexWireWithLWC.html -->
<template>
<lightning-card title="ApexWireWithLWC" icon-name="custom:custom63">
<div class="slds-m-around_medium">
<template if:true={contacts.data}>
<template for:each={contacts.data} for:item="contact">
<p key={contact.Id}>{contact.Name}</p>
</template>
</template>
<template if:true={contacts.error}>
<c-error-panel errors={contacts.error}></c-error-panel>
</template>
</div>
</lightning-card>
</template>