LWC
問題一覧
1
<namespace-component-name>に置き換えられる
2
c デフォルト名前空間と呼ばれている。 コンポーネントを呼び出す際は、 c-my-component
3
モジュールで宣言されたクラス、関数、変数をインポートして利用できる
4
モジュールで宣言したクラス、関数、変数を他のコードで利用可能にできる
5
lwcはLWCのコアモジュール LightningElementは標準HTML要素のカスタムラッパー lwcモジュールからLightningElementをインポートしている
6
そのコンポーネントを他のコンポーネントで利用可能とするため
7
サポートされていない。 エクスポート可能なのはLightningElementを継承したクラスのみ
8
サービスコンポーネントを作成し、 変数や関数をエクスポートする。
9
CSSファイルと設定ファイルのみを含むモジュールを作成し、LWCのCSSファイルにそのモジュールをインポートする CSSを静的リソースにあげるのもありか?
10
SVGリソースをLWCと同じ名前で作成し、同じフォルダに追加する。 フォルダあたり1つまで。
11
ディレクティブである必要があるが、含めることができる。
12
できない。 アクセスするにはドット表記のみ person.firstNameみたいな
13
greeting currentDate1 再描画時に、ゲッターやセッターなどの式は再評価される。 プロパティは再評価されない
14
<template lwc:if={property}> ディレクティブを使用する elseif elseもある
15
HTMLのテンプレートで利用されているLWC(JavaScript)のプロパティ HTMLのテンプレートで利用されているgetterメソッドの中で使用されている LWC(JavaScript)のプロパティ ※直接HTMLテンプレートで利用してなくてもgetterを通して間接的に利用していればリアクティブとなる。
16
コンポーネントが再表示される。 再表示されると、すべての式が再表示される。プロパティは再評価されない (つまりgetter関数が再実行される。) renderedCallback()ライフサイクルフックが実行される。
17
===で変更前と変更後をチェックされる。 等価ではなく、値のIDを比較する。 よって、オブジェクト内部の変更まではチェックされない。
18
新しいオブジェクトを作成して再度項目に割り当てる。 @trackデコレータを利用することで内部まで項目値の変更を深く追跡させるようにする。
19
for:each={items} for:item="item" for:index="idx" key={item.id} {idx}:{item} <template for:each={items} for:item="item" for:index="idx"> <p key={item.id}>{idx}:{item}</p> </template>
20
リストの中身が変更された際、keyを利用して変更箇所を特定し再描画する。 keyは文字列か数値のみで一意である必要がある。 keyごとに要素を管理しているということ
21
iteratorディレクティブ 最初の要素と最後の要素の振る舞いを変えることができる。 最初の要素と最後の要素の識別が可能!
22
<template iterator:it={contacts}> <li key={it.value.Id}> <div if:true={it.first} class="list-first"></div> {it.value.Name}, {it.value.Title} <div if:true={it.last} class="list-last"></div> </li> </template> ※例では記載ないがindexも指定可能 この例では、スタイルを適用することで、 一番上と一番下にボーダーを表示することができる
23
そのコンポーネントのJavaScriptで、複数のHTMLを同フォルダからインポートし、 render()メソッドを定義し、条件に応じて返却値にHTMLを返す https://developer.salesforce.com/docs/platform/lwc/guide/create-render.html
24
SLDSの該当コンポーネントのVariationsセクションを確認し、 記載があるものは、標準コンポーネントでvariant属性で指定することで、そのスタイルが利用できる
25
SLDSのユーティリティクラスを利用する。 具体的には、上記から探したクラスをコンポーネントのクラスに適用する。 https://www.lightningdesignsystem.com/utilities/alignment/
26
SLDSスタイル設定フックを利用する
27
SLDSのStyleHooks Overviewにて該当コンポーネントのバリエーションにあう(ある場合)スタイルフックを使用する。 使用する際はホストに対して適用すれば、テンプレート内のすべてのコンポーネントにスタイルが適用される。(子コンポーネントへもスタイルが適用される シャドウルートを貫通する) 補足として、標準コンポーネントでは CSSカスタムプロパティとして、スタイルを利用しているため、プレースホルダーとして活用している。 :host { --slds-c-button-brand-color-background: orange; --slds-c-button-brand-color-border: orange; /* Other CSS custom properties here */ }
28
もっとも近いSLDSブループリントをみつけて独自のコンポーネントを作成する
29
SLDSブループリントのタイトルの下にあるデバイスサポートの詳細を確認する (アダプティブ レスポンシブ、デスクトップ専用)
30
アダプティブはデスクトップ用と非デスクトップ用のマークアップが定義されている。 レスポンシブはマークアップは1つで、画面サイズに合わせて拡大縮小される
31
sldsブループリントページの右上にlightningComponentボタンがある場合は対応している
32
ブループリントをコピーし、テンプレートへ貼り付ける ブループリントの中身で、アイコンなど基本コンポーネントに置き換え可能なものは置き換える あとはjavascriptで表示メッセージなどを制御できるようにかえる
33
そのコンポーネントのclassやVariant属性の値に対して{}でバインドし、JavaScriptで制御する
34
設計トークンを利用する —lwcプレフィックスがついている CSSカスタムプロパティで宣言する div { margin-right: var(--lwc-spacingSmall); } https://www.lightningdesignsystem.com/design-tokens/
35
コンパイル時に置き換えられるため、 CSSStyleDeclaration.getPropertyValue()メソッドでCSSプロパティの値を得ると、置き換えられた文字列が取得される
36
カスタムAuraトークンを定義し、利用する <aura:tokens> <aura:token name="myBackgroundColor" value="#f4f6f9" /> </aura:tokens> /* myLightningWebComponent.css */ color: var(--c-myBackgroundColor); --c プレフィックスで参照可能
37
そのコンポーネントに限定される。
38
子コンポーネントの内部コンポーネントに対するスタイルの適用はできないが、子コンポーネントを一つの要素としてスタイル設定はできる。
39
親側は 子コンポーネントのセレクタでスタイル設定する 子側は:hostセレクタでコンポーネントそのものにスタイル設定できる (:hostは親側から設定するみたいな認識)
40
:host(.クラス名)セレクタを利用する。 親側からセレクタで子コンポーネントにスタイル設定したのと同等 シャドウホストがセレクタにマッチする場合に適用される。 これを利用することで、子コンポーネント側からは自身に対してどのような設定が親から行われているかで、スタイル設定が可能である。 どういう時につかうかはわからん 標準コンポーネントではvariantのスタイル適用はjavascriptで制御しているし。
41
:host-context(セレクタ) ShadowホストがあるHTMLに対してセレクタを実行する。 ::part(セレクタ) 親側からShadowコンポーネントの要素にスタイル適用するのに使用する ネイティブShadowになれば対応するかも
42
salesforceが合成Shadowプロフィルを使用しているから。 将来的ににネイティブShadowになる予定らしい
43
Idセレクタ テンプレート表示時に、idの値がグローバル一意値に変換される場合があるため
44
利用可能ではない。 @apiで定義した変数は確かに利用する時属性とて扱うが、LWCエンジンでは属性名をキャメルケースに自動変換されるため、取得できない。 代替手段としてはdata-を使用し、属性セレクタで取得するなどがある
45
親側からHTMLで、子コンポーネントに対して変数を付与したいときに利用できる data-sub=‘aaa’ で属性設定すると、 そのオブジェクトの要素.dataset.subで取得できる。 それで子側のコンポーネントで振る舞いをかえてもいいし、 ただ単種に一意の値として、属性セレクタで取得するためのラベル付けとして利用するのもあり
46
スタイルフックを公開したい要素に対してカスタムプロパティを設定する。 ちなみに第二引数はデフォルト値として機能する .light { background-color: var(--light-theme-background-color, lightcyan); } 親側のコンポーネントで以下のような設定をすると、子コンポーネントに対してスタイル設定可能 :host { --light-theme-backgroud-color: honeydew;
47
子コンポーネントの内部要素に対してスタイル設定はできないが、 CSSカスタムプロパティを公開しておくと、親側からスタイルを適用することができる! つまり、カスタムプロパティはShadowDomを貫通し、親側の値を継承することができる!
48
Salesforceでは、レンダリングされた出力に基づくスタイル設定はサポートされてない というかShadow境界を超えて基本コンポーネントに対してスタイル設定できないだけだと思う
49
すでに設定されているSLDSクラスに対して、上書きをしてはいけない。 将来そのクラスが変更される可能性があるため かわりとしては、設計トークンを利用したカスタムClassを付与するなどを検討する!
50
Classやstyle属性の場合、 その値の文字列の完全一致をセレクタで行うと、うまく取得できない場合があるため 理由としては、SalesForceが空白や予期せぬ文字を付与してしまうことがあるらしい
51
CSSライブラリモジュールをimportできる。 /* Example */ @import "c/cssLibrary"; cssLibrary ├──cssLibrary.css └──cssLibrary.js-meta.xml
52
オーナー テンプレートを所有するコンポーネント コンテナ テンプレートの内側 親と子 そのまま
53
ケバブケースになる。 @api itemName に対して 親から item-name=“あああ“ で渡す
54
参照のみとなり、変更不可能(エラーがでる) データ変更するには浅いコピーをすればよい。
55
対応している 推奨はされていない
56
単純にオブジェクト型だとインタフェースが複雑になり開発者でオブジェクト定義を共有しないといけないから 標準HTMLでは、属性に設定できるのは、プリミティブ型のみだから。 属性値に{オブジェクト}で渡すことができるのはLWCだけだから、想像しずらい仕様となる
57
子コンポーネントでメソッドに対して@apiアノテーションを付与すると、メソッドを公開することができる。 例 子側 @api play() { なんかやる } 親側は this.template.querySelector("子コンポーネント").play(); でよべる また、戻り値を設定することで、親に値を渡すこともできる 他にパラメータを設定することで、@api公開プロパティを使用せずに子に値を渡すこともできる!
58
公開メソッドをたたき、返却値を手に入れることができる。
59
@api公開メソッドの引数に値を渡せば子側で受け取ることができる また、data-属性への値設定する方法もある。
60
カスタム子コンポーネント側で、slotを作成する。 親側ではカスタム子コンポーネントの内部にマークアップを定義する 子側 <!-- slotDemo.html --> <template> <h1>Add content to slot</h1> <div> <slot></slot> </div> </template> 親側 <!-- slotWrapper.html --> <template> <c-slot-demo> <p>content from parent</p> </c-slot-demo> </template> slotにname属性を付与することで、親側からslot属性で割り当てるslotを選択することもできる <template> <p>First Name: <slot name="firstName">Default first name</slot></p> <p>Last Name: <slot name="lastName">Default last name</slot></p> <p>Description: <slot>Default description</slot></p> </template> <template> <c-item> <span slot={dynamicName}></span> </c-item> </template>
61
シャドウツリー内部に対してセレクトする場合はthis.template.querySelector() を利用する
62
スロットで渡されるDOM要素はシャドウツリーの一部とならならず、DOMのホスト要素に直接追加される そのため、テンプレートを使用しない、this.querySelectorで取得する。
63
lwc:if elseif else ディレクティブを使用し、それぞれslotタグを作成する。 従来のif:true false ディレクティブだとコンパイラが重複スロットと見なして、警告を発する
64
slotchangeイベント 直接の子ノードが追加、削除されると起動されるイベントである
65
テンプレートディレクティブを活用することで テンプレートが切り替わるごとに slotchangeイベントが呼び出されるようになる。
66
ShadowDomと比較して、検索範囲がコンポーネント(テンプレート)に限定されないので、別のlLightDomコンポーネントの要素やslotで渡された要素が取得されてしまう懸念がある 親側でShadow境界が作られてれば問題ない
67
実行コンテキストのこと つまり 今実行しているコンポーネント自身
68
DOM要素のクエリでwindow documentは使用しないこと。 javascriptでDomを操作しないこと(推奨) →ディレクティブをつかえ スタイル設定はおけー!
69
HTMLでlwc:lef属性を追加し、値を割り当てると javascriptでとれるようになる <template> <div lwc:ref="myDiv"></div> </template> export default class extends LightningElement { renderedCallback() { console.log(this.refs.myDiv); } }
70
とれてくる要素は参照のみの、プレーンなオブジェクトなので、そのオブジェクトの内部に対して変更や追加削除を行うとエラーがでる。 スロットやテンプレート、for:eachやiterator などのループ内の要素に対してref属性を付与することはできない。
71
現在表示されているものしか取得しない。 (ディレクティブによって表示されてないものは取得対象とならない)
72
シャドウツリーではなく、ホスト要素にコンテンツが添付される。
73
配布できないらしい。 管理パッケージ内で名前空間の参照はcで行うから、LightDOMでは管理パッケージ内の資産と、ローカルの資産の切り分けができないみたいな感じ?らしい
74
親コンポーネント側でスタイルの上書きが可能なこと サードパーティライブラリが使いやすい
75
static renderMode = "light" をコンポーネント内部で宣言し、 テンプレートで <template lwc:render-mode="light"> を利用する。 import { LightningElement } from "lwc"; export default class LightDomApp extends LightningElement { static renderMode = "light"; // the default is 'shadow' } <template lwc:render-mode="light"> <my-header> <p>Hello World</p> </my-header> </template>
76
まとめ
77
Shadow境界を超えてイベントを伝播させる場合は イベントのプロパティであるcomposed:trueにしておく必要がある デフォルトでなってる時もある ちなみにLightDOMでは必要なし
78
できない。 子側のCSSのセレクタの対象はtemplete内部に対するもの(Shadowツリー)であるため。 ホスト要素に追加されたスロット要素はCSSからはセレクトできない。
79
プレーンオブジェクト、配列 上記はネストされてても可能 サポートされないのは、Objectから継承するオブジェクトや、クラスインスタンス、Date Set Map など。
80
前の表示サイクル中にアクセスしたプロパティしか変更検知してくれないということ。 つまり、オブジェクトのプロパティを追加しても、前の表示サイクルでアクセスしてないため、検知対象とならない。 配列は問題ない。
81
追加しても検知してくれないので、再度割り当てる this.obj ={ ...this.obj, value: ‘あああ‘};
82
variant属性の値は入力apiで受け取り、 ノーマライズ(大文字→小文字変換や設定値がない場合にデフォルト値の設定)を行う。 それをもとに、文字列で各variantのスタイル定義されたクラスの値を定義し、 標準HTMLのボタンコンポーネントのクラス属性に設定する。
83
テンプレートはslotだけ用意している ホスト側からslotを通してボタンコンポーネントがわたってくる想定になっている ボタンコンポーネントのconnectedCallback処理で、カスタムイベントが飛ぶようになっており、 ボタングループではそれをキャッチし、ボタングループのプロパティにボタンコンポーネントを登録する(配列で管理してる) 補足として、コンストラクタでボタンから飛んでくるイベントのリスナーを登録している。 また上記の一連の処理で、 ボタン側は、自コンポーネントのプロパティにアクセスするメソッドを定義しており、ボタングループ側では、それを呼び出すことによって、orderプロパティや、ボタングループのプロパティを参照するdisconnect用のメソッドをボタン側のプロパティへに登録している。 ボタン側では、disconnectする際、そのメソッドを呼び出すことによって、ボタングループのプロパティのボタンを管理している配列から、そのボタンを削除している。
84
コンストラクタでやる。
85
this.をバインドした関数やアロー関数をイベントを介して親側に渡すことによって、親のオブジェクトから子コンポーネントを更新を行うことができ、、シームレスなやり取りができるテクニックといえる。 こういったメソッドをやり取りすることで、子からも親を更新することも可能
86
親のコンストラクタ実行→親のconnectedCallback→子のコンストラクタ実行→子のconnectedCallback
87
privateなメソッド、変数は_をつける
88
設定からLightningコンポーネントで該当のLWCを確認すると、連動関係がみれる
89
表示されない。 ただ、ネイティブshadow なら表示される
90
setterを定義する @apiアノテーションはgetterにだけつける
91
実はされてない 使うなら@apiでデコレートして入力としてサポートするようにしてほしいらしい。 ユーティリティクラス使う場合はdivとかで囲ったほうがいいかも
92
いいえ 順不同で渡されてくる
93
コンポーネントと同じフォルダにjsファイルを作成し、相対パスでインポート サービスこんぽーねんとを作成し、c/componentName形式でインポート
94
各jsファイルでもexportして フォルダ名と同名のjsファイルで まとめてexportする export { classSet} from ‘./classSet’; export * from ‘./banks’; アスタリスクをつかうと全部exportできる
95
静的リソースにアップロードして importする import myLib from "@salesforce/resourceUrl/myLib"; platformResourceLoaderモジュールからメソッドをインポートする import { loadStyle, loadScript } from "lightning/platformResourceLoader"; インポートしてきたメソッドと実行コンテキストと静的リソースからの相対パスを指定して実行! loadScript(this, myLib + "/myLib.js").then(() => { let result = myLib.myFunction(2, 2); });
96
同名のjsファイルが存在するとそちらが優先してimportされてしまうので注意 c/moduleNameとして読み込んだときに、 jsがなければ、cssを読み込むという順序で処理される
97
Dom操作対象のコンポーネントにたいして lwc:dom="manual"を利用する。 これを指定するとカプセル化を維持するらしい。 <template> <div lwc:dom="manual"></div> </template> これでこの要素に対してappendChildとかができる。
98
Lightning Lockerを使用している場合は、 ライブラリに対して制限がある Lightning Webセキュリティならないとのこと
99
デフォルトではできないが、 CSP信頼済みサイトに登録し、ポリシーなどの変更が必要。 JavaScriptリソースを外部から読み込むことはできない(静的リソースでやれ)
100
lightning Data Serviceのみ LDS以外のSalesforceApiは起動できない。(Apexでやれ)
その他
その他
谷峻輔 · 12問 · 2年前その他
その他
12問 • 2年前LWC2
LWC2
谷峻輔 · 28問 · 2年前LWC2
LWC2
28問 • 2年前Javascript
Javascript
谷峻輔 · 100問 · 2年前Javascript
Javascript
100問 • 2年前javascript2
javascript2
谷峻輔 · 58問 · 2年前javascript2
javascript2
58問 • 2年前js1 JavaScript の基礎
js1 JavaScript の基礎
谷峻輔 · 92問 · 2年前js1 JavaScript の基礎
js1 JavaScript の基礎
92問 • 2年前js2 コード品質、オブジェクト基本、データ型
js2 コード品質、オブジェクト基本、データ型
谷峻輔 · 100問 · 2年前js2 コード品質、オブジェクト基本、データ型
js2 コード品質、オブジェクト基本、データ型
100問 • 2年前js3 データ型
js3 データ型
谷峻輔 · 100問 · 2年前js3 データ型
js3 データ型
100問 • 2年前js4 データ型、関数の高度な機能
js4 データ型、関数の高度な機能
谷峻輔 · 100問 · 2年前js4 データ型、関数の高度な機能
js4 データ型、関数の高度な機能
100問 • 2年前js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
谷峻輔 · 96問 · 2年前js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
96問 • 2年前js6 クラス Promise, async/await
js6 クラス Promise, async/await
谷峻輔 · 100問 · 2年前js6 クラス Promise, async/await
js6 クラス Promise, async/await
100問 • 2年前js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
谷峻輔 · 96問 · 2年前js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
96問 • 2年前js8 その他
js8 その他
谷峻輔 · 57問 · 2年前js8 その他
js8 その他
57問 • 2年前Javaとは〜
Javaとは〜
谷峻輔 · 83問 · 2年前Javaとは〜
Javaとは〜
83問 • 2年前Reactクイックスタート
Reactクイックスタート
谷峻輔 · 15問 · 2年前Reactクイックスタート
Reactクイックスタート
15問 • 2年前デザインパターン
デザインパターン
谷峻輔 · 5問 · 2年前デザインパターン
デザインパターン
5問 • 2年前承認申請
承認申請
谷峻輔 · 16問 · 2年前承認申請
承認申請
16問 • 2年前アプリケーションビルダー2
アプリケーションビルダー2
谷峻輔 · 100問 · 2年前アプリケーションビルダー2
アプリケーションビルダー2
100問 • 2年前アプリケーションビルダー3
アプリケーションビルダー3
谷峻輔 · 100問 · 2年前アプリケーションビルダー3
アプリケーションビルダー3
100問 • 2年前アプリケーションビルダー4
アプリケーションビルダー4
谷峻輔 · 100問 · 2年前アプリケーションビルダー4
アプリケーションビルダー4
100問 • 2年前アプリケーションビルダー5
アプリケーションビルダー5
谷峻輔 · 94問 · 2年前アプリケーションビルダー5
アプリケーションビルダー5
94問 • 2年前アプリケーションビルダー6
アプリケーションビルダー6
谷峻輔 · 100問 · 2年前アプリケーションビルダー6
アプリケーションビルダー6
100問 • 2年前アプリケーションビルダー7
アプリケーションビルダー7
谷峻輔 · 100問 · 2年前アプリケーションビルダー7
アプリケーションビルダー7
100問 • 2年前アプリケーションビルダー8
アプリケーションビルダー8
谷峻輔 · 98問 · 2年前アプリケーションビルダー8
アプリケーションビルダー8
98問 • 2年前アプリケーションビルダー9
アプリケーションビルダー9
谷峻輔 · 70問 · 2年前アプリケーションビルダー9
アプリケーションビルダー9
70問 • 2年前フロー
フロー
谷峻輔 · 42問 · 2年前フロー
フロー
42問 • 2年前レポート、ダッシュボード
レポート、ダッシュボード
谷峻輔 · 60問 · 2年前レポート、ダッシュボード
レポート、ダッシュボード
60問 • 2年前SalesCloud
SalesCloud
谷峻輔 · 18問 · 2年前SalesCloud
SalesCloud
18問 • 2年前標準機能
標準機能
谷峻輔 · 72問 · 2年前標準機能
標準機能
72問 • 2年前宣言的開発
宣言的開発
谷峻輔 · 8問 · 2年前宣言的開発
宣言的開発
8問 • 2年前数式、人力規則
数式、人力規則
谷峻輔 · 18問 · 2年前数式、人力規則
数式、人力規則
18問 • 2年前アクセスレベル
アクセスレベル
谷峻輔 · 63問 · 2年前アクセスレベル
アクセスレベル
63問 • 2年前データ型変換
データ型変換
谷峻輔 · 22問 · 2年前データ型変換
データ型変換
22問 • 2年前オブジェクト、項目
オブジェクト、項目
谷峻輔 · 91問 · 2年前オブジェクト、項目
オブジェクト、項目
91問 • 2年前アプリ、タブ
アプリ、タブ
谷峻輔 · 92問 · 2年前アプリ、タブ
アプリ、タブ
92問 • 2年前自動化
自動化
谷峻輔 · 17問 · 2年前自動化
自動化
17問 • 2年前組織、開発モデル
組織、開発モデル
谷峻輔 · 65問 · 2年前組織、開発モデル
組織、開発モデル
65問 • 2年前ボタン、アクション
ボタン、アクション
谷峻輔 · 69問 · 2年前ボタン、アクション
ボタン、アクション
69問 • 2年前インテグレーション
インテグレーション
谷峻輔 · 40問 · 2年前インテグレーション
インテグレーション
40問 • 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
谷峻輔 · 46問 · 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
46問 • 2年前標準オブジェクト
標準オブジェクト
谷峻輔 · 42問 · 2年前標準オブジェクト
標準オブジェクト
42問 • 2年前ServiceCloud
ServiceCloud
谷峻輔 · 16問 · 2年前ServiceCloud
ServiceCloud
16問 • 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
谷峻輔 · 41問 · 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
41問 • 2年前データインポート、エクスポート
データインポート、エクスポート
谷峻輔 · 3回閲覧 · 12問 · 2年前データインポート、エクスポート
データインポート、エクスポート
3回閲覧 • 12問 • 2年前Chatter
Chatter
谷峻輔 · 21問 · 2年前Chatter
Chatter
21問 • 2年前承認申請
承認申請
谷峻輔 · 15問 · 2年前承認申請
承認申請
15問 • 2年前フロー
フロー
谷峻輔 · 44問 · 2年前フロー
フロー
44問 • 2年前レポート、ダッシュボード
レポート、ダッシュボード
谷峻輔 · 65問 · 2年前レポート、ダッシュボード
レポート、ダッシュボード
65問 • 2年前SalesCloud
SalesCloud
谷峻輔 · 18問 · 2年前SalesCloud
SalesCloud
18問 • 2年前標準機能
標準機能
谷峻輔 · 72問 · 2年前標準機能
標準機能
72問 • 2年前宣言的開発
宣言的開発
谷峻輔 · 8問 · 2年前宣言的開発
宣言的開発
8問 • 2年前アクセスレベル
アクセスレベル
谷峻輔 · 52問 · 2年前アクセスレベル
アクセスレベル
52問 • 2年前数式、人力規則
数式、人力規則
谷峻輔 · 17問 · 2年前数式、人力規則
数式、人力規則
17問 • 2年前データ型変換
データ型変換
谷峻輔 · 22問 · 2年前データ型変換
データ型変換
22問 • 2年前オブジェクト、項目
オブジェクト、項目
谷峻輔 · 89問 · 2年前オブジェクト、項目
オブジェクト、項目
89問 • 2年前アプリ、タブ
アプリ、タブ
谷峻輔 · 100問 · 2年前アプリ、タブ
アプリ、タブ
100問 • 2年前自動化
自動化
谷峻輔 · 18問 · 2年前自動化
自動化
18問 • 2年前組織、開発モデル
組織、開発モデル
谷峻輔 · 60問 · 2年前組織、開発モデル
組織、開発モデル
60問 • 2年前ボタン、アクション
ボタン、アクション
谷峻輔 · 69問 · 2年前ボタン、アクション
ボタン、アクション
69問 • 2年前インテグレーション
インテグレーション
谷峻輔 · 40問 · 2年前インテグレーション
インテグレーション
40問 • 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
谷峻輔 · 44問 · 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
44問 • 2年前標準オブジェクト
標準オブジェクト
谷峻輔 · 32問 · 2年前標準オブジェクト
標準オブジェクト
32問 • 2年前ServiceCloud
ServiceCloud
谷峻輔 · 17問 · 2年前ServiceCloud
ServiceCloud
17問 • 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
谷峻輔 · 18問 · 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
18問 • 2年前データインポート、エクスポート
データインポート、エクスポート
谷峻輔 · 11問 · 2年前データインポート、エクスポート
データインポート、エクスポート
11問 • 2年前Chatter
Chatter
谷峻輔 · 21問 · 2年前Chatter
Chatter
21問 • 2年前一時
一時
谷峻輔 · 89問 · 2年前一時
一時
89問 • 2年前一時2
一時2
谷峻輔 · 29問 · 2年前一時2
一時2
29問 • 2年前js9 ドキュメント
js9 ドキュメント
谷峻輔 · 80問 · 2年前js9 ドキュメント
js9 ドキュメント
80問 • 2年前問題一覧
1
<namespace-component-name>に置き換えられる
2
c デフォルト名前空間と呼ばれている。 コンポーネントを呼び出す際は、 c-my-component
3
モジュールで宣言されたクラス、関数、変数をインポートして利用できる
4
モジュールで宣言したクラス、関数、変数を他のコードで利用可能にできる
5
lwcはLWCのコアモジュール LightningElementは標準HTML要素のカスタムラッパー lwcモジュールからLightningElementをインポートしている
6
そのコンポーネントを他のコンポーネントで利用可能とするため
7
サポートされていない。 エクスポート可能なのはLightningElementを継承したクラスのみ
8
サービスコンポーネントを作成し、 変数や関数をエクスポートする。
9
CSSファイルと設定ファイルのみを含むモジュールを作成し、LWCのCSSファイルにそのモジュールをインポートする CSSを静的リソースにあげるのもありか?
10
SVGリソースをLWCと同じ名前で作成し、同じフォルダに追加する。 フォルダあたり1つまで。
11
ディレクティブである必要があるが、含めることができる。
12
できない。 アクセスするにはドット表記のみ person.firstNameみたいな
13
greeting currentDate1 再描画時に、ゲッターやセッターなどの式は再評価される。 プロパティは再評価されない
14
<template lwc:if={property}> ディレクティブを使用する elseif elseもある
15
HTMLのテンプレートで利用されているLWC(JavaScript)のプロパティ HTMLのテンプレートで利用されているgetterメソッドの中で使用されている LWC(JavaScript)のプロパティ ※直接HTMLテンプレートで利用してなくてもgetterを通して間接的に利用していればリアクティブとなる。
16
コンポーネントが再表示される。 再表示されると、すべての式が再表示される。プロパティは再評価されない (つまりgetter関数が再実行される。) renderedCallback()ライフサイクルフックが実行される。
17
===で変更前と変更後をチェックされる。 等価ではなく、値のIDを比較する。 よって、オブジェクト内部の変更まではチェックされない。
18
新しいオブジェクトを作成して再度項目に割り当てる。 @trackデコレータを利用することで内部まで項目値の変更を深く追跡させるようにする。
19
for:each={items} for:item="item" for:index="idx" key={item.id} {idx}:{item} <template for:each={items} for:item="item" for:index="idx"> <p key={item.id}>{idx}:{item}</p> </template>
20
リストの中身が変更された際、keyを利用して変更箇所を特定し再描画する。 keyは文字列か数値のみで一意である必要がある。 keyごとに要素を管理しているということ
21
iteratorディレクティブ 最初の要素と最後の要素の振る舞いを変えることができる。 最初の要素と最後の要素の識別が可能!
22
<template iterator:it={contacts}> <li key={it.value.Id}> <div if:true={it.first} class="list-first"></div> {it.value.Name}, {it.value.Title} <div if:true={it.last} class="list-last"></div> </li> </template> ※例では記載ないがindexも指定可能 この例では、スタイルを適用することで、 一番上と一番下にボーダーを表示することができる
23
そのコンポーネントのJavaScriptで、複数のHTMLを同フォルダからインポートし、 render()メソッドを定義し、条件に応じて返却値にHTMLを返す https://developer.salesforce.com/docs/platform/lwc/guide/create-render.html
24
SLDSの該当コンポーネントのVariationsセクションを確認し、 記載があるものは、標準コンポーネントでvariant属性で指定することで、そのスタイルが利用できる
25
SLDSのユーティリティクラスを利用する。 具体的には、上記から探したクラスをコンポーネントのクラスに適用する。 https://www.lightningdesignsystem.com/utilities/alignment/
26
SLDSスタイル設定フックを利用する
27
SLDSのStyleHooks Overviewにて該当コンポーネントのバリエーションにあう(ある場合)スタイルフックを使用する。 使用する際はホストに対して適用すれば、テンプレート内のすべてのコンポーネントにスタイルが適用される。(子コンポーネントへもスタイルが適用される シャドウルートを貫通する) 補足として、標準コンポーネントでは CSSカスタムプロパティとして、スタイルを利用しているため、プレースホルダーとして活用している。 :host { --slds-c-button-brand-color-background: orange; --slds-c-button-brand-color-border: orange; /* Other CSS custom properties here */ }
28
もっとも近いSLDSブループリントをみつけて独自のコンポーネントを作成する
29
SLDSブループリントのタイトルの下にあるデバイスサポートの詳細を確認する (アダプティブ レスポンシブ、デスクトップ専用)
30
アダプティブはデスクトップ用と非デスクトップ用のマークアップが定義されている。 レスポンシブはマークアップは1つで、画面サイズに合わせて拡大縮小される
31
sldsブループリントページの右上にlightningComponentボタンがある場合は対応している
32
ブループリントをコピーし、テンプレートへ貼り付ける ブループリントの中身で、アイコンなど基本コンポーネントに置き換え可能なものは置き換える あとはjavascriptで表示メッセージなどを制御できるようにかえる
33
そのコンポーネントのclassやVariant属性の値に対して{}でバインドし、JavaScriptで制御する
34
設計トークンを利用する —lwcプレフィックスがついている CSSカスタムプロパティで宣言する div { margin-right: var(--lwc-spacingSmall); } https://www.lightningdesignsystem.com/design-tokens/
35
コンパイル時に置き換えられるため、 CSSStyleDeclaration.getPropertyValue()メソッドでCSSプロパティの値を得ると、置き換えられた文字列が取得される
36
カスタムAuraトークンを定義し、利用する <aura:tokens> <aura:token name="myBackgroundColor" value="#f4f6f9" /> </aura:tokens> /* myLightningWebComponent.css */ color: var(--c-myBackgroundColor); --c プレフィックスで参照可能
37
そのコンポーネントに限定される。
38
子コンポーネントの内部コンポーネントに対するスタイルの適用はできないが、子コンポーネントを一つの要素としてスタイル設定はできる。
39
親側は 子コンポーネントのセレクタでスタイル設定する 子側は:hostセレクタでコンポーネントそのものにスタイル設定できる (:hostは親側から設定するみたいな認識)
40
:host(.クラス名)セレクタを利用する。 親側からセレクタで子コンポーネントにスタイル設定したのと同等 シャドウホストがセレクタにマッチする場合に適用される。 これを利用することで、子コンポーネント側からは自身に対してどのような設定が親から行われているかで、スタイル設定が可能である。 どういう時につかうかはわからん 標準コンポーネントではvariantのスタイル適用はjavascriptで制御しているし。
41
:host-context(セレクタ) ShadowホストがあるHTMLに対してセレクタを実行する。 ::part(セレクタ) 親側からShadowコンポーネントの要素にスタイル適用するのに使用する ネイティブShadowになれば対応するかも
42
salesforceが合成Shadowプロフィルを使用しているから。 将来的ににネイティブShadowになる予定らしい
43
Idセレクタ テンプレート表示時に、idの値がグローバル一意値に変換される場合があるため
44
利用可能ではない。 @apiで定義した変数は確かに利用する時属性とて扱うが、LWCエンジンでは属性名をキャメルケースに自動変換されるため、取得できない。 代替手段としてはdata-を使用し、属性セレクタで取得するなどがある
45
親側からHTMLで、子コンポーネントに対して変数を付与したいときに利用できる data-sub=‘aaa’ で属性設定すると、 そのオブジェクトの要素.dataset.subで取得できる。 それで子側のコンポーネントで振る舞いをかえてもいいし、 ただ単種に一意の値として、属性セレクタで取得するためのラベル付けとして利用するのもあり
46
スタイルフックを公開したい要素に対してカスタムプロパティを設定する。 ちなみに第二引数はデフォルト値として機能する .light { background-color: var(--light-theme-background-color, lightcyan); } 親側のコンポーネントで以下のような設定をすると、子コンポーネントに対してスタイル設定可能 :host { --light-theme-backgroud-color: honeydew;
47
子コンポーネントの内部要素に対してスタイル設定はできないが、 CSSカスタムプロパティを公開しておくと、親側からスタイルを適用することができる! つまり、カスタムプロパティはShadowDomを貫通し、親側の値を継承することができる!
48
Salesforceでは、レンダリングされた出力に基づくスタイル設定はサポートされてない というかShadow境界を超えて基本コンポーネントに対してスタイル設定できないだけだと思う
49
すでに設定されているSLDSクラスに対して、上書きをしてはいけない。 将来そのクラスが変更される可能性があるため かわりとしては、設計トークンを利用したカスタムClassを付与するなどを検討する!
50
Classやstyle属性の場合、 その値の文字列の完全一致をセレクタで行うと、うまく取得できない場合があるため 理由としては、SalesForceが空白や予期せぬ文字を付与してしまうことがあるらしい
51
CSSライブラリモジュールをimportできる。 /* Example */ @import "c/cssLibrary"; cssLibrary ├──cssLibrary.css └──cssLibrary.js-meta.xml
52
オーナー テンプレートを所有するコンポーネント コンテナ テンプレートの内側 親と子 そのまま
53
ケバブケースになる。 @api itemName に対して 親から item-name=“あああ“ で渡す
54
参照のみとなり、変更不可能(エラーがでる) データ変更するには浅いコピーをすればよい。
55
対応している 推奨はされていない
56
単純にオブジェクト型だとインタフェースが複雑になり開発者でオブジェクト定義を共有しないといけないから 標準HTMLでは、属性に設定できるのは、プリミティブ型のみだから。 属性値に{オブジェクト}で渡すことができるのはLWCだけだから、想像しずらい仕様となる
57
子コンポーネントでメソッドに対して@apiアノテーションを付与すると、メソッドを公開することができる。 例 子側 @api play() { なんかやる } 親側は this.template.querySelector("子コンポーネント").play(); でよべる また、戻り値を設定することで、親に値を渡すこともできる 他にパラメータを設定することで、@api公開プロパティを使用せずに子に値を渡すこともできる!
58
公開メソッドをたたき、返却値を手に入れることができる。
59
@api公開メソッドの引数に値を渡せば子側で受け取ることができる また、data-属性への値設定する方法もある。
60
カスタム子コンポーネント側で、slotを作成する。 親側ではカスタム子コンポーネントの内部にマークアップを定義する 子側 <!-- slotDemo.html --> <template> <h1>Add content to slot</h1> <div> <slot></slot> </div> </template> 親側 <!-- slotWrapper.html --> <template> <c-slot-demo> <p>content from parent</p> </c-slot-demo> </template> slotにname属性を付与することで、親側からslot属性で割り当てるslotを選択することもできる <template> <p>First Name: <slot name="firstName">Default first name</slot></p> <p>Last Name: <slot name="lastName">Default last name</slot></p> <p>Description: <slot>Default description</slot></p> </template> <template> <c-item> <span slot={dynamicName}></span> </c-item> </template>
61
シャドウツリー内部に対してセレクトする場合はthis.template.querySelector() を利用する
62
スロットで渡されるDOM要素はシャドウツリーの一部とならならず、DOMのホスト要素に直接追加される そのため、テンプレートを使用しない、this.querySelectorで取得する。
63
lwc:if elseif else ディレクティブを使用し、それぞれslotタグを作成する。 従来のif:true false ディレクティブだとコンパイラが重複スロットと見なして、警告を発する
64
slotchangeイベント 直接の子ノードが追加、削除されると起動されるイベントである
65
テンプレートディレクティブを活用することで テンプレートが切り替わるごとに slotchangeイベントが呼び出されるようになる。
66
ShadowDomと比較して、検索範囲がコンポーネント(テンプレート)に限定されないので、別のlLightDomコンポーネントの要素やslotで渡された要素が取得されてしまう懸念がある 親側でShadow境界が作られてれば問題ない
67
実行コンテキストのこと つまり 今実行しているコンポーネント自身
68
DOM要素のクエリでwindow documentは使用しないこと。 javascriptでDomを操作しないこと(推奨) →ディレクティブをつかえ スタイル設定はおけー!
69
HTMLでlwc:lef属性を追加し、値を割り当てると javascriptでとれるようになる <template> <div lwc:ref="myDiv"></div> </template> export default class extends LightningElement { renderedCallback() { console.log(this.refs.myDiv); } }
70
とれてくる要素は参照のみの、プレーンなオブジェクトなので、そのオブジェクトの内部に対して変更や追加削除を行うとエラーがでる。 スロットやテンプレート、for:eachやiterator などのループ内の要素に対してref属性を付与することはできない。
71
現在表示されているものしか取得しない。 (ディレクティブによって表示されてないものは取得対象とならない)
72
シャドウツリーではなく、ホスト要素にコンテンツが添付される。
73
配布できないらしい。 管理パッケージ内で名前空間の参照はcで行うから、LightDOMでは管理パッケージ内の資産と、ローカルの資産の切り分けができないみたいな感じ?らしい
74
親コンポーネント側でスタイルの上書きが可能なこと サードパーティライブラリが使いやすい
75
static renderMode = "light" をコンポーネント内部で宣言し、 テンプレートで <template lwc:render-mode="light"> を利用する。 import { LightningElement } from "lwc"; export default class LightDomApp extends LightningElement { static renderMode = "light"; // the default is 'shadow' } <template lwc:render-mode="light"> <my-header> <p>Hello World</p> </my-header> </template>
76
まとめ
77
Shadow境界を超えてイベントを伝播させる場合は イベントのプロパティであるcomposed:trueにしておく必要がある デフォルトでなってる時もある ちなみにLightDOMでは必要なし
78
できない。 子側のCSSのセレクタの対象はtemplete内部に対するもの(Shadowツリー)であるため。 ホスト要素に追加されたスロット要素はCSSからはセレクトできない。
79
プレーンオブジェクト、配列 上記はネストされてても可能 サポートされないのは、Objectから継承するオブジェクトや、クラスインスタンス、Date Set Map など。
80
前の表示サイクル中にアクセスしたプロパティしか変更検知してくれないということ。 つまり、オブジェクトのプロパティを追加しても、前の表示サイクルでアクセスしてないため、検知対象とならない。 配列は問題ない。
81
追加しても検知してくれないので、再度割り当てる this.obj ={ ...this.obj, value: ‘あああ‘};
82
variant属性の値は入力apiで受け取り、 ノーマライズ(大文字→小文字変換や設定値がない場合にデフォルト値の設定)を行う。 それをもとに、文字列で各variantのスタイル定義されたクラスの値を定義し、 標準HTMLのボタンコンポーネントのクラス属性に設定する。
83
テンプレートはslotだけ用意している ホスト側からslotを通してボタンコンポーネントがわたってくる想定になっている ボタンコンポーネントのconnectedCallback処理で、カスタムイベントが飛ぶようになっており、 ボタングループではそれをキャッチし、ボタングループのプロパティにボタンコンポーネントを登録する(配列で管理してる) 補足として、コンストラクタでボタンから飛んでくるイベントのリスナーを登録している。 また上記の一連の処理で、 ボタン側は、自コンポーネントのプロパティにアクセスするメソッドを定義しており、ボタングループ側では、それを呼び出すことによって、orderプロパティや、ボタングループのプロパティを参照するdisconnect用のメソッドをボタン側のプロパティへに登録している。 ボタン側では、disconnectする際、そのメソッドを呼び出すことによって、ボタングループのプロパティのボタンを管理している配列から、そのボタンを削除している。
84
コンストラクタでやる。
85
this.をバインドした関数やアロー関数をイベントを介して親側に渡すことによって、親のオブジェクトから子コンポーネントを更新を行うことができ、、シームレスなやり取りができるテクニックといえる。 こういったメソッドをやり取りすることで、子からも親を更新することも可能
86
親のコンストラクタ実行→親のconnectedCallback→子のコンストラクタ実行→子のconnectedCallback
87
privateなメソッド、変数は_をつける
88
設定からLightningコンポーネントで該当のLWCを確認すると、連動関係がみれる
89
表示されない。 ただ、ネイティブshadow なら表示される
90
setterを定義する @apiアノテーションはgetterにだけつける
91
実はされてない 使うなら@apiでデコレートして入力としてサポートするようにしてほしいらしい。 ユーティリティクラス使う場合はdivとかで囲ったほうがいいかも
92
いいえ 順不同で渡されてくる
93
コンポーネントと同じフォルダにjsファイルを作成し、相対パスでインポート サービスこんぽーねんとを作成し、c/componentName形式でインポート
94
各jsファイルでもexportして フォルダ名と同名のjsファイルで まとめてexportする export { classSet} from ‘./classSet’; export * from ‘./banks’; アスタリスクをつかうと全部exportできる
95
静的リソースにアップロードして importする import myLib from "@salesforce/resourceUrl/myLib"; platformResourceLoaderモジュールからメソッドをインポートする import { loadStyle, loadScript } from "lightning/platformResourceLoader"; インポートしてきたメソッドと実行コンテキストと静的リソースからの相対パスを指定して実行! loadScript(this, myLib + "/myLib.js").then(() => { let result = myLib.myFunction(2, 2); });
96
同名のjsファイルが存在するとそちらが優先してimportされてしまうので注意 c/moduleNameとして読み込んだときに、 jsがなければ、cssを読み込むという順序で処理される
97
Dom操作対象のコンポーネントにたいして lwc:dom="manual"を利用する。 これを指定するとカプセル化を維持するらしい。 <template> <div lwc:dom="manual"></div> </template> これでこの要素に対してappendChildとかができる。
98
Lightning Lockerを使用している場合は、 ライブラリに対して制限がある Lightning Webセキュリティならないとのこと
99
デフォルトではできないが、 CSP信頼済みサイトに登録し、ポリシーなどの変更が必要。 JavaScriptリソースを外部から読み込むことはできない(静的リソースでやれ)
100
lightning Data Serviceのみ LDS以外のSalesforceApiは起動できない。(Apexでやれ)