LWCのベストプラクティスは子メソッドを呼び出す

例を参照 https://developer.salesforce.com/docs/component-library/tools/playground/q8rtcVIBf/79/edit

親コンポーネント

<template> Value in Parent : {objMap.key} Value in Parent : {dummyStr} <lightning-button onclick={updateValue} label="Update Data"></lightning-button> <c-child obj-map={objMap} dummy-str={dummyStr}></c-child> </template> export default class App extends LightningElement { @track objMap = {key:"value"}; @track dummyStr updateValue() { this.objMap.key = "Value2"; this.dummyStr = Math.random(); // <---- ADD NEW VALUE this.template.querySelector("c-child").run(); } } 

子コンポーネント

export default class Child extends LightningElement { @api objMap @api dummyStr @api run() { console.log(this.dummyStr); // <---- OLD VALUE???? } } 

@api値を使用する必要があるときに親から子メソッドを呼び出す方法は?

回答

これは予想される動作です。プロパティ値は、メソッドjavascriptの実行が終了した後に子に渡されるため、変更されたすべてのプロパティが収集され、変更された値がチェーンにプッシュされます。これは、 に示すように、dummyStrの変更ハンドラーにログを記録することで理解できます。ここに

ここに画像の説明を入力してください div>

3つの異なる方法で実装できます。

オプション1:setTimeoutを使用する(推奨)

示されているように ここ の場合、親メソッドが処理を完了した後、setTimeoutを使用して子メソッドを呼び出すことができます。 setTimeoutを使用すると、呼び出しが非同期スレッドにプッシュされるため、後で同期スレッドの後に実行されます。

setTimeout(()=>this.template.querySelector("c-child").run()); 

オプション2:変更ハンドラーを使用

示されているように ここ では、子 api

プロパティが変更された後に呼び出されます。

@api get dummyStr() { return this._dummyStr; } set dummyStr(value) { this._dummyStr = value; console.log("dummyStr changed => ", this._dummyStr, value); this.run(); } 

オプション3:メソッドパラメータを使用

示されているように ここ 、必要な変更されたプロパティをメソッドパラメータとして渡します。

this.template.querySelector("c-child").run(this.dummyStr); 

コメント

  • どうもありがとうございました! '最初のオプションについて知りませんでした。コンポーネント間の値はリンクで送信されると思いました。

回答

これを試してください:

import { LightningElement, track } from "lwc"; export default class App extends LightningElement { @track objMap = {key:"value"}; @track dummyStr updateValue() { this.objMap.key = "Value2"; this.dummyStr = Math.random(); this.template.querySelector("c-child").run(this.dummyStr); } } 

子供:

import { LightningElement, track, api } from "lwc"; export default class Child extends LightningElement { @api objMap @api dummyStr @api run(dummyStr) { console.log(dummyStr); } } 

[データの更新]をクリックした後:

ここに画像の説明を入力

出力:

ここに画像の説明を入力

プレイグラウンドリンク

コメント

  • 私はただコンポーネント間の値はリンクで送信されると考えました。私はその振る舞いを期待していません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です