首页 > 其他分享 >【Salesforce】【lwc】@api @track @wire

【Salesforce】【lwc】@api @track @wire

时间:2023-08-01 17:28:46浏览次数:47  
标签:wire track age Salesforce api LightningElement 类型 lwc

一、@api @track @wire的区别

1.@track注解private类型的reactive变量。

2. @api注解public类型的reactive变量(public类型:即可暴露给其他的APP用来可以赋值注入)。

3. @wire:我们常用的注解除了@track 以及 @api以外,还会经常使用@wire,区别为前两个是只针对前台的,wire既可以用在前台也可以用在后台,可以用来获取数据,创建数据,调用apex等等。

例子

@api

1 // howToUseVariables.js
2 import { LightningElement, api } from 'lwc';
3 export default class howToUseVariables extends LightningElement {
4     @api
5     age;
6 }

 

<!-- howToUseVariables.html -->
<template>
    <lightning-card class="slds-m-around_small">
        (@api)
        <p>age : {age}</p>
    </lightning-card>
</template>

-------------------------------------------------------------------------
1 // parent.js
2 export default class parent extends LightningElement {
3     @api
4     age;
5 
6     handleChanges(e){
7         age = e.target.value;
8     }
9 }
1 <!-- parent.html -->
2 <template>
3     <c-how-to-use-variables age={age}></c-how-to-use-variables>
4     <lightning-input type="number" default=40 onchange={handleChanges} label="age"></lightning-button>
5 </template>

 

表示

@api を用いると、外部に変数や関数を公開することができます。
この例のように、親のコンポーネントが、公開された変数に値を入力することができます。

@track

@track

 1 // howToUseVariables.js
 2 import { LightningElement, track } from 'lwc';
 3 export default class howToUseVariables extends LightningElement {
 4     @track
 5     parsonObj = {
 6         name : 'オブジェ太郎',
 7         age : 123
 8     };
 9 
10     @track
11     parsonObjList = [
12         {name : 'リスト太郎', age : '40'},
13         {name : 'リスト次郎', age : '30'},
14         {name : 'リスト三郎', age : '20'},
15     ];
16 
17     handleChange = function(e){
18         this.parsonObj.age = e.target.value;
19         this.parsonObjList[0].age = e.target.value;
20     }
21 }

 

 1 <!-- howToUseVariables.html -->
 2 <template>
 3     <lightning-card class="slds-m-around_small">
 4         (@track - Object)
 5         <div class="slds-box">
 6             <p>name : {parsonObj.name}</p>
 7             <p>age : {parsonObj.age}</p>
 8         </div>
 9 
10         (@track - Array)
11         <template for:each={parsonObjList} for:item="parsonObj">
12             <div key={parsonObj.name} class="slds-box">
13                 <p>name : {parsonObj.name}</p>
14                 <p>age : {parsonObj.age}</p>
15             </div>
16         </template>
17 
18         <form>
19             <lightning-input type="number" default=40 onchange={handleChange}>
20             </lightning-input>
21         </form>
22     </lightning-card>
23 </template>

 

表示

このサンプルでは、「オブジェクト」「配列」に対して @track を使ってみました。

以前は、@track を使わないと、変数の変更時に再描画が行われませんでしたが、
Spring’20 の更新以降は、@track をつけなくても、再描画がされるようになっています。
しかし、オブジェクトや配列の子要素に変更を加えた場合の再描画は、@track を付けないと行われません。
そのため、このサンプルでは オブジェクトと配列を扱いました。

上記の画像は、入力欄 に99を入力したあとの状態です。
handleChanges()によってオブジェクトとリストの子要素の値が変更し、画面に反映されているのが分かると思います。

@wire の2つの方法

@wire は、組織からデータを取得できるデコレータです。

uiRecordApi.getRecord を用いる場合と、Apex を用いる場合があるので、それぞれ書いていきます。

uiRecordApi.getRecord を用いる場合

 1 // howToUseVariables.js
 2 import { LightningElement, wire } from 'lwc';
 3 import { getRecord } from 'lightning/uiRecordApi';
 4 export default class howToUseVariables extends LightningElement {
 5 
 6     @wire(getRecord, { recordId: '0035h00000DN1ciAAD', fields: ['Contact.Name', 'Contact.Phone']})
 7     contactRecord;
 8 
 9     get NameOfContactRecord() {
10         if(this.contactRecord.data) {
11             return this.contactRecord.data.fields.Name.value;
12         }
13         return null;
14     }
15 
16     get PhoneOfContactRecord() {
17         if(this.contactRecord.data) {
18             return this.contactRecord.data.fields.Phone.value
19         }
20         return null;
21     }
22 }

 

<!-- howToUseVariables.html -->
<template>
    <lightning-card class="slds-m-around_small">
        (@wire - uiRecordApi.getRecord)<br>
        <p>Name : {NameOfContactRecord}</p>
        <p>Phone : {PhoneOfContactRecord}</p>
    </lightning-card>
</template>

表示

この方法では、レコードID と 取得する項目を指定して、組織からデータを取得することができます。

this.contactRecord.data.fields.Name.valueといったように、項目の値を参照するのに、少し深く階層を指定する必要があります。
これをそのままHTML側で指定すると、データがまだ取得できていないときに ~.dataが null になるので、エラーになります。
そのため、このサンプルでは getter プロパティ から値を取得しています。

getRecord について、公式の説明はこちらになります。

Apex を用いる場合

 1 // ContactUtil.cls
 2 public with sharing class ContactUtil {
 3     
 4     @AuraEnabled (cacheable=true)
 5     public static Contact getContact(){
 6         try {
 7             return (Contact) [SELECT Name, Phone FROM Contact LIMIT 1];
 8         } catch (QueryException e) {
 9             throw new AuraHandledException(e.getMessage());
10         }
11     }
12 }
 1 // howToUseVariables.js
 2 import { LightningElement, wire } from 'lwc';
 3 import getContact from '@salesforce/apex/ContactUtil.getContact';
 4 export default class howToUseVariables extends LightningElement {
 5 
 6     @wire(getContact)
 7     contactByApex;
 8 
 9     get NameOfContactByApex() {
10         if(this.contactByApex.data) {
11             return this.contactByApex.data.Name;
12         }
13         return null;
14     }
15 
16     get PhoneOfContactByApex() {
17         if(this.contactByApex.data) {
18             return this.contactByApex.data.Phone;
19         }
20         return null;
21     }
22 }

 

 1 <!-- howToUseVariables.html -->
 2 <template>
 3     <lightning-card class="slds-m-around_small">
 4         (@wire - Apex)
 5         <p>Name :&nbsp;
 6             <lightning-formatted-text
 7                 value={NameOfContactByApex}
 8             ></lightning-formatted-text>
 9         </p>
10         <p>Phone :&nbsp;
11             <lightning-formatted-phone
12                 value={PhoneOfContactByApex}
13             ></lightning-formatted-phone>
14         </p>
15     </lightning-card>
16 </template

 

二、Private和 Reactive的区别

Private 以及 Reactive,针对 Private,举一个不太恰当的比喻,在apex中可以声明变量为 private / public / global 类型,其中 private只能当前这个类当中引用,并且 apex page中无法引用,这里的 Private也有这层意思,区别是 Private类型变量可以在component中使用,但是他的后期的任何变化不会对component进行重新渲染,而且父页面也无法通过注入方式修改此类型变量;我们更多的要介绍的是 Reactive类型变量,此种变量的特点为当此变量改变以后,component便会重新渲染,在这个component中的所有的表达式都会重新计算。此种变量有两个类型: public / tracked(private). public 使用@api注解进行修饰。tracked使用@track注解进行修饰。这里需要注意的是,如果使用了@track 或者@api,必须要import track或者 import api在头部才能使用。

 Tracked: Tracked类型也可以称为Private类型的Reactive,此种声明类型可以实现当变量改变以后,component进行reRender操作,此种类型的变量当其他的component引用以后,不可以通过attribute方式进行注入值,;此种类型头部声明需要引用:

import { LightningElement, track} from 'lwc';

Public:Public类型和Track类型区别为当其他的component进行引用时,可以通过attribute进行注入值。此种类型声明时头部需要引用:

import { LightningElement, api} from 'lwc';

看到上面这几种类型的介绍,我们可能会有一个疑问,声明成reactive是不是比private更好更方便?其实在变量声明时我们一定要千万的注意考虑好变量的作用域,变量类型。reactive类型当改变以后整个component都会reRender,所有template中包含的表达式都会被重新计算,使用不当可能会造成不准确或者不必要的性能影响,所以声明以前要考虑清楚变量用途。下面的Demo用来深化一下Tracked以及Public的用法。我们想要知道LWC封装了哪些component,我们可以访问:https://developer.salesforce.com/docs/component-library/overview/components进行查看。

既然reActive类型变量这么神奇,是否有什么相关的limitation呢?答案是有的。针对reActive类型变量只支持三种类型:

  • Primitive values
  • Plain objects created with {…}
  • Arrays created with []

只有这三种类型允许reActive,其他的类型即使声明了,也没法做到改变以后重新渲染component,并且会在console log里面提示你当前类型不支持track。

标签:wire,track,age,Salesforce,api,LightningElement,类型,lwc
From: https://www.cnblogs.com/zhuzhubaoya/p/17597996.html

相关文章

  • 优测优分享-3分钟全面了解API Moke
    一、什么是密闭服务?Google测试团队的博客中,有一篇博文介绍的正是《HermeticServers(密闭服务)》。如下图所示,当被测试系统依赖了AnotherBackend,这种依赖即产生了“不可控”因素。怎么定义密闭服务呢?如果可以在一台没有网络的机器上启动整个服务并且服务可以按照预期的工作,那么......
  • YAPI部署服务器(Docker)
    【一】YAPI介绍YApi是高效、易用、功能强大的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护API,YApi还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的......
  • 为什么大多数restful-api都要求使用POST
    2023年6月20日13:50:561,因为前后端对http的认识差异比较大,而且很多前端开发有些是培训速成或者其他行业转过来的,所以基础知识差异大,你要求他们具备和后端一样的基础知识水平,不太可能2,http协议支持的方法GET方法:获取资源,POST方法:传输实体主题,PUT方法:传输文件,HEAD方法:获取报文首......
  • 【AGC】Publishing API调用问题汇总
    ​【问题背景】开发者可以通过PublishingAPI完成几乎所有应用的管理和发布工作,自己制定自动发布接口。PublishingAPI有很多接口,包括了查询应用信息、更新应用信息、上传文件、提交发布等主要接口。下面总结了一些开发者在使用PublishingAPI过程中容易遇到的问题,供大家在使用时......
  • 一分钟掌握技术术语:API(接口)
    很多产品经理在项目开发过程中经常听到:你调我这个接口就好了;这个功能你写个接口给我;有什么不懂的就看下API接口文档。开发经常说的接口是什么意思呢?术语解释:API(ApplicationProgrammingInterface),简单理解就是程序之间的约定。主要用于满足应用访问另一应用一组例程,但又无需访问源......
  • 亚马逊国际按关键字搜索商品 API 返回值
    item_search-按关键字搜索商品 前往注册开通测试onebound.amazon.item_search公共参数名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否......
  • API数据接口该怎么对接
    随着互联网和移动互联网的发展,API(ApplicationProgrammingInterface)接口的作用越来越重要。API接口将各种平台相互连接,使得不同系统的信息可以互相获取和使用,大大提高了系统的互操作性和开发效率。本文将介绍如何对接API数据接口,以及注意事项和技巧。获取API接口首先需要找到需要......
  • 关于API接口应用
    随着互联网技术的发展,API接口已成为众多应用程序开发中的必备工具,它不仅方便了开发者进行应用程序开发,也为应用程序提供了更多的功能和服务。本文将介绍API接口的概念和应用,以及API接口的优势和未来趋势。一、什么是API接口API是ApplicationProgrammingInterface,即应用程序接口。......
  • 你是一个资深API接口爬虫程序员,现在需要你介绍一下如何通过商品id来获取商品数据并读
    获取商品数据通常需要使用API接口,根据接口文档中的说明传递商品id参数,并使用相应的请求方式(通常为GET请求)向API服务器发送请求即可。以下是一个获取商品数据的示例请求:首先打开API接口文档,找到获取商品数据的API接口。例如:https://api.xxx.com/products/{product_id}API文档中会说......
  • 拼多多按关键字搜索商品 API
    一、拼多多平台优势:1、独创拼团模式拼团拼单是拼多多独创的营销模式,其特点是基于人脉社交的裂变传播,非常具有传播性。由于本身走低价路线,加上拼单折扣,商品的分享和人群裂变效果非常明显,电商前期最难在于吸引用户,拼多多初期利用低价拼团模式,快速大量的分享曝光可以把产品知名度很快......