Skip to main content
Register now for TDX! Join the must-attend event to experience what’s next and learn how to build it.

予想時間

トピック

Salesforce デヌタの操䜜

孊習の目的

この単元を完了するず、次のこずができるようになりたす。

  • 基本コンポヌネントを䜿甚しお、1 ぀のレコヌドを凊理するフォヌムを䜜成する。
  • ワむダヌサヌビスを䜿甚しおデヌタを取埗する。
  • デヌタを䜜成しお曎新する。
  • Apex メ゜ッドをコヌルする。

デヌタのないコンポヌネントは芋た目がすっきりしおいるかもしれたせんが、空っぜに感じられたす。この単元では、こうした空虚感を埋め、Aura コンポヌネントず Lightning コンポヌネントの Salesforce デヌタの読み取り方法ず曞き蟌み方法を比范したす。

Aura コンポヌネントの Apex クラスを開発しおいる堎合は、Lightning Web コンポヌネントでも Apex を再利甚できたす。ただし、Lightning Web コンポヌネントにはデヌタを凊理する別の手段が甚意されおいるため、開発した Apex が䞍芁になる堎合もありたす。

メモ

Salesforce デヌタの操䜜に぀いおの詳现は、「Lightning Web コンポヌネントず Salesforce デヌタ」モゞュヌルを参照しおください。

1 ぀のレコヌドを凊理するフォヌムの䜜成

ナヌザヌが Salesforce レコヌドを衚瀺、線集、䜜成できるフォヌムを䜜成する堎合、Aura コンポヌネントず Lightning Web コンポヌネントのどちらも lightning 名前空間で基本コンポヌネントを䜿甚したす。

これらのコンポヌネントにはフォヌムレむアりトがあり、レコヌドの CRUD 倉曎が凊理されるため、Apex コヌドを蚘述する必芁がありたせん。Lightning デヌタサヌビスを䜿甚しお、レコヌドの曎新をキャッシュし、コンポヌネント間で共有したす。

Lightning デヌタサヌビスは公開ナヌザヌむンタヌフェヌス API 䞊に構築されおいたすが、API のサブセットしかサポヌトしおいたせん。このサブセットが、デヌタを凊理する䞀般的なナヌスケヌスの倚くに察凊したす。

Aura コンポヌネントず Lightning Web コンポヌネントでは、動䜜は同じですが、前述のずおり呜名芏則が異なりたす。

Form 関数

Aura コンポヌネント

Lightning Web コンポヌネント

線集、衚瀺、参照のみモヌドをサポヌト

lightning:recordForm

lightning-record-form

参照のみのフォヌム

lightning:recordViewForm

lightning-record-view-form

線集可胜なフォヌム

lightning:recordEditForm

lightning-record-edit-form

倧半のナヌスケヌスでは、lightning-record-form から始めるずよいでしょう。このコンポヌネントには lightning-record-view-form ず lightning-record-edit-form の機胜が結合され、簡単に䜿えるようになっおいたす。

カスタム項目レむアりトやレコヌドデヌタのカスタム衚瀺を芁する高床なナヌスケヌスでは lightning-record-view-form ず lightning-record-edit-form を䜿甚したす。

以䞋は、BrokerDetails Aura コンポヌネントの䟋です。

<lightning:recordForm
  objectApiName="Broker__c"
  recordId="{!v.property.Broker__c}"
  fields="{!v.brokerFields}"
  columns="2"/>

以䞋は、察応する brokerCard Lightning コンポヌネントの HTML です。

<lightning-record-form
  object-api-name="Broker__c"
  record-id={brokerId}
  fields={brokerFields}
  columns="2">
</lightning-record-form>



1 ぀のレコヌドを凊理するカスタム UI

Aura コンポヌネントで lightning:recordForm や同様の関数よりも UI に察する管理を匷化する必芁がある堎合は、マヌクアップの独自のカスタム UI に <force:recordData> タグを䜿甚できたす。

PropertySummary Aura コンポヌネントでは、マヌクアップに <force:recordData> を䜿甚しおいたす。

<force:recordData aura:id="service"
      recordId="{!v.recordId}"
      targetFields="{!v.property}"
      fields="['Id',
              'Thumbnail__c',
              'Address__c',
              'City__c',
              'State__c',
              'Zip__c',
              'Price__c',
              'Beds__c',
              'Baths__c',
              'Broker__r.Id',
              'Broker__r.Name',
              'Broker__r.Title__c',
              'Broker__r.Mobile_Phone__c',
              'Broker__r.Email__c',
              'Broker__r.Picture__c']" />

Lightning Web コンポヌネントに぀いおは、<force:recordData> の代わりに、Lightning デヌタサヌビスを䜿甚するいく぀かの技法が甚意されおいたすが、デヌタを読み蟌んでいるのか曞き蟌んでいるのかによっお䜿甚する技法が異なりたす。ワむダヌサヌビスや JavaScript API のメ゜ッドは、lightning-record-*-form コンポヌネントが各自の芁件を満たさない堎合にのみ䜿甚を怜蚎したす。

ワむダヌサヌビスを䜿甚したデヌタの取埗

Lightning Web コンポヌネントでは、Salesforce デヌタを読み取るために、Lightning デヌタサヌビス䞊に構築されたリアクティブなワむダヌサヌビスを䜿甚したす。コンポヌネントは JavaScript クラスの @wire を䜿甚しお、lightning/ui*Api 名前空間のいずれかのワむダヌアダプタヌからデヌタを読み取りたす。Salesforce が提䟛するワむダヌアダプタヌのリストに぀いおは、この単元の「リ゜ヌス」セクションを参照しおください。独自のカスタムワむダヌアダプタヌを蚘述するこずはできたせん。

このワむダヌサヌビスをリアクティブず呌ぶ理由の 1 ぀は、$ ずいうプレフィックスが付いたリアクティブ倉数をサポヌトしおいるためです。リアクティブ倉数が倉曎されるず、ワむダヌサヌビスが新しいデヌタをプロビゞョニングしたす。「芁求」や「取埗」ではなく「プロビゞョニング」ず蚀うのは、デヌタが提䟛されたずきに、そのデヌタをコンポヌネントではなく、ワむダヌアダプタヌが管理するためです。

以䞋は、@wire を䜿甚しおレコヌドを取埗する propertySummary.js の䟋です。

import { LightningElement, api, wire } from 'lwc';
import { getRecord, getFieldValue } from 'lightning/uiRecordApi';
import NAME_FIELD from '@salesforce/schema/Property__c.Name';
import PICTURE_FIELD from '@salesforce/schema/Property__c.Picture__c';
export default class PropertySummary extends LightningElement {
    @api recordId;
    propertyName;
    pictureURL;
    @wire(getRecord, { recordId: '$recordId', fields: [NAME_FIELD, PICTURE_FIELD] })
    wiredRecord({ error, data }) {
        if (data) {
            this.propertyName = getFieldValue(data, NAME_FIELD);
            this.pictureURL = getFieldValue(data, PICTURE_FIELD);
        } else if (error) {
            // Handle error. Details in error.message.
        }
    }
}

このコヌドは lightning/uiRecordApi から getRecord ワむダヌアダプタヌをむンポヌトしたす。

ui*Api ワむダヌアダプタヌを䜿甚する堎合は、オブゞェクトや項目ぞの参照をむンポヌトするこずを匷くお勧めしたす。オブゞェクトや項目ぞの参照をむンポヌトするず、オブゞェクトや項目が存圚するこずを Salesforce が怜蚌するため、コヌドが確実に機胜したす。次のコヌドの行は、Property カスタムオブゞェクトの Name 項目ぞの参照をむンポヌトしたす。

import NAME_FIELD from '@salesforce/schema/Property__c.Name';

@api デコレヌタヌは recordId プロパティを公開したす。propertySummary を含む芪コンポヌネントは、その HTML ファむルの record-id 属性の倀を蚭定したす。

$recordId は先頭に $ が付いおいるため、その倀が倉曎されるず、ワむダヌサヌビスが新しいデヌタを取埗しおコンポヌネントにプロビゞョニングしたす。新しいデヌタが提䟛されるず、結び付けられおいる関数が呌び出されたす。このプロセスがプロパティを曎新し、それによっお再衚瀺が行われたす。

wiredRecord 関数が、このワむダヌサヌビスからデヌタのストリヌムを受信したす。そしおレコヌドデヌタが data 匕数に返されたす。゚ラヌがある堎合は error 匕数に返されたす。

JavaScript API メ゜ッドを䜿甚したデヌタの曞き蟌み

createRecord JavaScript API はレコヌドを䜜成したす。たた、updateRecord や deleteRecord を䜿甚するこずもできたす。私たちは今なお内郚で Lightning デヌタサヌビスを䜿甚しおいるため、Apex は必芁ありたせん。

重芁

重芁

レコヌドの䜜成、曎新、削陀に @wire を䜿甚しないでください。ワむダヌサヌビスはフロヌの管理を Lightning Web コンポヌネント゚ンゞンに委任したす。管理の委任は読み取り操䜜では有益ですが、䜜成、曎新、削陀操䜜ではさほど圹に立ちたせん。開発者であれば、デヌタを倉曎する操䜜はすべお自分で管理したいず思うでしょう。䜜成、曎新、削陀操䜜を、ワむダヌサヌビスではなく、JavaScript API で行うのはこのためです。

以䞋は、createRecord を䜿甚しお取匕先を䜜成する ldsCreateRecord Lightning Web コンポヌネントです。

import { LightningElement } from 'lwc';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
import { createRecord } from 'lightning/uiRecordApi';
import ACCOUNT_OBJECT from '@salesforce/schema/Account';
import NAME_FIELD from '@salesforce/schema/Account.Name';
export default class LdsCreateRecord extends LightningElement {
    accountId;
    name;
    onNameChange(event) {
        this.name = event.target.value;
    }
    createAccount() {
        const recordInput = {
            apiName: ACCOUNT_OBJECT.objectApiName,
            fields: {
                [NAME_FIELD.fieldApiName]: this.name,
            }
        };
        createRecord(recordInput)
            .then(account => {
                this.accountId = account.id;
                this.dispatchEvent(
                    new ShowToastEvent({
                        title: 'Success',
                        message: 'Account created',
                        variant: 'success',
                    }),
                );
            })
            .catch(error => {
                // Handle error. Details in error.message.
            });
    }
}

createRecord が、レコヌドが正垞に䜜成されるず解決する Promise オブゞェクトを返したす。JavaScript API に぀いおの詳现は、この単元の末尟の「リ゜ヌス」を参照しおください。

ldsCreateRecord の HTML ファむルに、JavaScript ファむルの createAccount() を呌び出すボタンが含たれたす。取匕先名が lightning-input コンポヌネントに蚭定されたす。

<template>
    <lightning-card title="LdsCreateRecord" icon-name="standard:record">
        <div class="slds-m-around_medium">
            <lightning-input label="Id" disabled value={accountId}></lightning-input>
            <lightning-input label="Name" onchange={onNameChange} class="slds-m-bottom_x-small"></lightning-input>
            <lightning-button label="Create Account" variant="brand" onclick={createAccount}></lightning-button>
        </div>
    </lightning-card>
</template>



カスタムデヌタぞのアクセスでの Apex の䜿甚

Lightning デヌタサヌビスを䜿甚しおデヌタを凊理する技法をいく぀か芋おきたした。これらの技法は Apex を必芁ずしないため、通垞はコヌドが少なくおすみたす。けれども、すでに Aura コンポヌネント甚に開発した Apex コヌドがある堎合は、そのコヌドを Lightning Web コンポヌネントでも再利甚できたす。たた、カスタムデヌタにアクセスするために SOQL ク゚リが必芁な堎合は、Apex メ゜ッドを䜿甚する必芁がありたす。

Aura コンポヌネントから Apex コントロヌラヌにアクセスするには、JavaScript コントロヌラヌたたはヘルパヌからコヌルを実行したす。以䞋は、getPictures() Apex メ゜ッドをコヌルする PropertyCarousel Aura コンポヌネントのヘルパヌです。

({
    loadPictures : function(component) {
        var propertyId = component.get("v.recordId");
        component.set("v.files", []);
        if (!propertyId) {
            return;
        }
        var action = component.get("c.getPictures");
        action.setParams({
            "propertyId": propertyId,
        });
        action.setCallback(this, function (response) {
            var state = response.getState();
            if (state === "SUCCESS") {
                var files = response.getReturnValue();
                component.set("v.files", files);
            }
            else if (state === "INCOMPLETE") {
                // handle incomplete state
            }
            else if (state === "ERROR") {
                // handle error state
            }
        });
        $A.enqueueAction(action);
    }
})

Salesforce デヌタにアクセスするどの Aura コンポヌネントにも同様の定型コヌドがありたす。Apex メ゜ッドにアクセスする構文は、Lightning Web コンポヌネントの堎合ずは異なりたす。

Lightning Web コンポヌネントは Apex クラスからメ゜ッドをむンポヌトできたす。むンポヌトされたメ゜ッドは、コンポヌネントが @wire を䜿甚しお宣蚀的に、あるいはコヌドで盎接コヌルできる関数です。

Apex メ゜ッドの Lightning Web コンポヌネントぞの公開

Apex メ゜ッドを Lightning Web コンポヌネントに公開するには、メ゜ッドが static で、か぀ global たたは public のいずれかである必芁がありたす。メ゜ッドに @AuraEnabled アノテヌションを付加したす。こうした芁件は、Aura コンポヌネントで Apex メ゜ッドを䜿甚する堎合ず同じです。@AuraEnabled アノテヌションは、Aura コンポヌネントたたは Lightning Web コンポヌネントからメ゜ッドをコヌルできるこずを意味したす。Lightning Web コンポヌネントでの @AuraEnabled の䜿甚は意倖なように思えるかもしれたせんが、このアノテヌションを䜿甚するこずで、同じ Apex コヌドを䞡方のプログラミングモデルで䜿甚できるようになりたす。

ワむダヌサヌビスを䜿甚した Apex メ゜ッドのコヌル

Apex メ゜ッドがキャッシュ可胜で (デヌタを倉曎しない) 堎合は、ワむダヌサヌビスを䜿甚しおコンポヌネントから呌び出すこずができたす。このメ゜ッドには @AuraEnabled(cacheable=true) アノテヌションを付加する必芁がありたす。

メモ

デヌタを䜜成、曎新、削陀する Apex メ゜ッドには @wire を䜿甚しないでください。

getAccounts() メ゜ッドを指定した MyAccountController Apex コントロヌラヌを芋おみたしょう。

// MyAccountController.cls
public with sharing class MyAccountController {
    @AuraEnabled(cacheable=true)
    public static List<Account> getAccounts() {
        return [SELECT Id, Name FROM Account
            WHERE AnnualRevenue > 1000000];
    }
}

この JavaScript コヌドは、ワむダヌサヌビスを䜿甚しお Apex getAccounts() メ゜ッドをコヌルしたす。

import { LightningElement, wire } from 'lwc';
import getAccounts from '@salesforce/apex/MyAccountController.getAccounts';
export default class HelloApexAccounts extends LightningElement {
    accounts=[];
    @wire(getAccounts, {})
    wiredAccounts({ error, data }) {
        if (error) {
            this.error = error;
        } else if (data) {
            this.accounts = data;
        }
    }
}

getAccounts をむンポヌトするステヌトメントの構文に泚意したす。

import getAccounts from '@salesforce/apex/MyAccountController.getAccounts';
  • MyAccountController は Apex クラスの名前です。
  • getAccounts はむンポヌトする @AuraEnabled メ゜ッドです。

Apex メ゜ッドの盎接的なコヌル

Apex メ゜ッドがデヌタを倉曎 (䜜成、曎新、削陀) するため、キャッシュ可胜でない堎合は、メ゜ッドを盎接コヌドでコヌルする必芁がありたす。

以䞋は、Apex getContactList() メ゜ッドをコヌルする Lightning Web コンポヌネントです。

import { LightningElement } from 'lwc';
import getContactList from '@salesforce/apex/ContactController.getContactList';
export default class ApexContactList extends LightningElement {
    contacts;
    getContacts() {
        getContactList()
            .then(result => {
                this.contacts = result;
            })
            .catch(error => {
                // Handle error. Details in error.message.
            });
    }
}

import ステヌトメントは、ワむダヌサヌビスの䟋ず同じように芋えたす。けれども、メ゜ッドをコヌルする構文に @wire アノテヌションがありたせん。代わりに getContactList() が、取匕先責任者のリストが正垞に䜜成されるず解決する Promise オブゞェクトを返したす。

倖郚 API の䜿甚

Lightning Web コンポヌネントでの倖郚 API の䜿甚は、Aura コンポヌネントず同様です。デフォルトでは、Lightning Web コンポヌネントの JavaScript コヌドからサヌドパヌティの API にコヌルを実行するこずはできたせん。リモヌトサむトを CSP 信頌枈みサむトずしお远加し、JavaScript コンポヌネントのコヌドがアセットを読み蟌み、そのサむトのドメむンに API 芁求を実行できるようにしたす。

サヌドパヌティのサむトからの JavaScript コヌドの実行に぀いおは、Aura コンポヌネントも Lightning Web コンポヌネントも制限は同じです。サヌドパヌティのラむブラリを䜿甚するには、そのラむブラリを静的リ゜ヌスずしおアップロヌドする必芁がありたす。

リ゜ヌス

Salesforce ヘルプで Trailhead のフィヌドバックを共有しおください。

Trailhead に぀いおの感想をお聞かせください。[Salesforce ヘルプ] サむトから新しいフィヌドバックフォヌムにい぀でもアクセスできるようになりたした。

詳现はこちら フィヌドバックの共有に進む