LoginSignup
33
28

More than 3 years have passed since last update.

Lightning Web Components(JS)

Last updated at Posted at 2019-01-09

プロパティ(属性)定義

内部で使用する属性には @track を付ける。@trackを付けないと、変数の内容が変更されても画面が再描画されないことに注意。
外部に公開したいpublicな属性に対しては @api を付ける。
なお、JSコード内で属性を参照する場合は ES6の記法に従って this.属性名 でアクセスする。
属性として定義できるのは、Primitive型、連想配列({})、配列([])の3種類。

import { LightningElement, track, api} from 'lwc';

export default class lwc_OppList extends LightningElement {
    attribute1;          //ただの変数 (省略可)
    @track attribute2;   //変数の内容が変更された時にHTMLが再描画される
    @api attribute3;     //属性を外部に公開する(public)

※ 変数が定義されると、プリコンパイル後に自動的に constructor関数内で this.xxx = void 0; に展開される。

JSとHTMLの変数名の差異

JS内の変数名はCamel case(先頭小文字、単語の切れ目で大文字)、HTML内の変数名とコンポーネント名は Kebab case(単語を-で区切る)で定義する。

//JS内の変数名は Camel case
@api itemName

//HTMLでの参照時は Kebab case
<c-lwc_opp-list item-name="123" ...

getter/setter

プロパティの代わりに getter/setter を定義することもできる。@apiを付ければ外部に公開可能。@apiはgetter/setterの両方に付ける必要はなく通常はgetterのみ付ける。JSコード内から参照する場合は属性と同じようにthisを付けて参照する。

export default class TodoItem extends LightningElement {

    //HTMLから参照するgetter
    get record() {
        return this.records[0];
    }

    //Publicなgetter
    @api
    get itemName() {
        return this._itemName;
    }

    set itemName(value) {
       this._itemName = value.toUpperCase();
    }

・・・・
   //JSコードから参照する場合
   it (this.itemName == 'xxxx') {

}

静的リソースの利用

import 任意の名前 from '@salesforce/resourceUrl/静的リソースの名前'

import trailheadLogoUrl from '@salesforce/resourceUrl/trailheadLogo';

ラベルの利用

import 任意の名前 from '@salesforce/label/c.ラベルのAPI名';
'c.' は自分の組織を表すnamespace.

import greeting from '@salesforce/label/c.greeting';

export default class aComponent extends LightningElement {

  //HTMLから参照できるように属性として定義する
  label = {
    greeting,
    ・・・
  };
#HTMLファイルからラベルを参照する
 {label.greeting}

レコードIDの取得

コンポーネントをレコードページに配置した時に、当該レコードのIDを取得するには、recordId 属性をpulic属性として定義する。自動的にIDがセットされる。

import { LightningElement, api } from 'lwc';
export default class TestClass extends LightningElement {
    @api recordId;
}

コンポーネントの横幅の取得

Lightning Pageにコンポーネントを配置すると、コンポーネントの横幅は自動的に調整される。この自動設定される横幅を flexipageRegionWidth 属性で取得できる。

 @api flexipageRegionWidth;

オブジェクト名の取得

Lightning Record Pageにコンポーネントを配置すると、配置元のオブジェクトのAPI名をobjectApiName 属性で取得できる。

 @api objectApiName;

Apexメソッドの呼出し

Apexメソッドのimport

import apexMethod from '@salesforce/apex/Namespace.Classname.apexMethod';

自分の組織上のクラスの場合、Namespece の 'c.'は付けない。

import retrieveOpps from '@salesforce/apex/LWC_OpportunityListController.retrieveOpps';

サーバー側コントローラの実装は、Auraコンポーネントの時と同じで staticメソッドに @AuraEnabled を付ける。 クライアント側で@Wireする場合は サーバー側コントローラメソッドには(Cacheable=true)は必須であることに注意する。

/*
 * 指定された企業に紐付く商談の一覧を返す
 *  accountId 取引先ID
 */
@AuraEnabled(cacheable=true)
public static List<Opportunity> retrieveOpps(Id accountId){
    Opportunity[] opps =
        [SELECT Id, Name, StageName, Amount
            FROM Opportunity
            WHEREAccountId = :accountId
            ORDER BY Name ];
    return opps;
}
/*
 * ユーザーのデータを返す
 *  userId ユーザーID
 */
 @AuraEnabled(cacheable=true)
 public static User retrieveUserInfo(Id userId){
     User record =
            [SELECT Id,
                      Username,
                      Name,
                      Profile.Name,
                FROM User
                WHERE Id = :userId ];
        return record;
    }

Apexメソッドのコール

LWCでは複数の手段でApexメソッドをコールすることができる。

A. プロパティへのWire

コンポーネントのロード時にApexメソッドがコールされ、取得した値が変数にセットされる。
注意:この方式は開発時のデバッグが難しいこと、サーバー側のApexメソッド呼出時のエラー処理をカスタマイズできないため、BまたはCの実装方法をお薦めします。

@wire(retrieveUserInfo, { 'userId': userid })
record;

//引数がない場合
@wire(retrieveCurrentUserInfo)
record;

取得したデータは data属性に、エラー情報はerror属性にセットされる。

<lightning-formatted-text value={record.data.Username} ></lightning-formatted-text>
B. メソッドへのWire

コンポーネントのロード時にApexメソッドがコールされ、メソッドが呼び出される。取得したデータは 引数dataに、エラー情報は引数errorにセットされる。

@wire(retrieveUserInfo, {'userId': userid})
wiredUserInfo({ error, data }) {
    if (data) {
        this.record = data;
    } else if (error) {
        this.showToast(error.details.body.message);
    }
}
<lightning-formatted-text value={record.Username}></lightning-formatted-text>
C. コード内での呼出し

メソッドからの戻り値のデータ型の制限は従来のAuraコンポーネントと同じ。
従来のAuraコンポーネントでのApexメソッドのコールと同じく、任意のタイミングでコードから呼び出す。
取得したデータは thenメソッドの引数dataに、エラー情報はcatchメソッドの引数errorにセットされる。

retrieveUserInfo({ 'userId' : userid })
    .then(data => {
        record = result;
    })
    .catch(error => {
        this.showToast(error.body.message);
    });
<lightning-formatted-text value={record.Username}></lightning-formatted-text>

トーストメッセージの表示

画面上にトーストメッセージを表示する。

import { ShowToastEvent } from 'lightning/platformShowToastEvent'

/*
 *トーストによるメッセージ表示
 */
showToast(message) {
    const event = new ShowToastEvent({
        title: 'Sending Toasts is a Blast!',
        message: message,
        variant: 'error', //info/success/warning/error
        mode: 'sticky'  //sticky クローズボタンを押すまで表示
                        //pester 3秒間表示
                        //dismissable sticky+pester
    });
    this.dispatchEvent(event);
}

Screen Shot 2019-01-29 at 22.15.54.png

開発ガイド(英語)

JSコードの共有化

JSコードを共有化したい場合は、新しくLWCコンポーネントを作成し、htmlファイルを削除する(jsとメタデータのみ残す)。ES6の文法に従って、メソッドをexportする。

共有コードの定義

import { ShowToastEvent } from 'lightning/platformShowToastEvent'

/*
 *トーストによるメッセージ表示
 * that this をセットする
 * message メッセージ
 * mode (オプション)  sticky|pester|dismissal
 */
const showToast = (that, message, mode) => {
    const modevalue = mode != null ? mode : 'dismissable';
    const event = new ShowToastEvent({
        title: 'エラーが発生しました',
        message: message,
        variant: 'error',
        mode: modevalue
    });
    that.dispatchEvent(event);
};

//メソッドをexport する
export { showToast };

Screen Shot 2019-01-29 at 23.41.21.png

呼出側のコード

//c は同じ組織であることを示す
import { showToast } from 'c/lwc_CommonUtils';
//複数のメソッドをimport する場合は列挙する
import { showToast, xx, xx } from 'c/lwc_CommonUtils';
//ファイル内の全てのメソッドをimportする
import * from 'c/lwc_CommonUtils';

・・・
//importしたメソッドは自由に呼び出せる
showToast(this, error.body.message);

開発ガイド(英語)

外部JS/CSSファイルの読み込み

jqueryなどの外部JSファイルやCSSファイルを使い対場合は、jsファイルを静的リソースとして登録した後にplatform-resource-loaderを使用する。

import { loadStyle, loadScript } from 'lightning/platformResourceLoader';
import leaflet from '@salesforce/resourceUrl/leaflet';

・・・

connectedCallback() {
    Promise.all([
      loadStyle(this, leaflet + '/leaflet.css'),
      loadScript(this, leaflet + '/leaflet.js')
    ]).then(() => {
        //リソースロード後の処理を記述
        ・・・
    });
  }

リファレンス

33
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
28