ionic 4 列表渲染需要很长时间
ionic 4 list rendering takes a very long time
我正在使用 ionic 4,我的代码从 firebase 中提取数据。请求中有 40 个对象。我将它们推入一个数组,然后使用 ion-list 来渲染它。
渲染这 40 个对象需要 8-10 秒。我认为这是一个巨大的时间。下面是执行此操作的代码 html
<ion-content>
<ion-searchbar style="padding-bottom:0px" placeholder="{{ 'CONTACT_SEARCH_PLACEHOLDER' | translate }}" (ionChange)="doSearch()" [(ngModel)]="searchTerm" (ionClear)="searchReset()"></ion-searchbar>
<ion-list>
<ion-list-header>
<ion-label>{{ 'FAVORITE_CONTACTS' | translate }}</ion-label>
</ion-list-header>
<ng-container *ngFor="let card of core.syncedCards">
<app-contact-card *ngIf="card.favoriteContact == false" [card]="card"></app-contact-card>
</ng-container>
</ion-list>
</ion-content>
名片组件html是
<ion-card style="margin-top:5px">
<ion-card-header [ngClass]="card.partyNumber == 'demo' ? 'demoCard' : 'realCard'">
<ion-card-title>
{{card.firstName}} {{card.lastName}}
<ion-icon name="more" mode="md" color="primary" size="large" style="float:right" (click)="showCardActions($event, card)"></ion-icon>
<ion-icon *ngIf="card.partyNumber == 'demo'" size="large" style="float:right" color="danger" name="trash" (click)="deleteDemoCard(card.tempContactId)"></ion-icon>
<ion-icon style="float:right" size="large" *ngIf="card.favoriteContact == true" color="warning" name="star" (click)="toggleFavorite(card)"></ion-icon>
<ion-icon style="float:right" size="large" *ngIf="card.favoriteContact == false" color="warning" name="star-outline" (click)="toggleFavorite(card)"></ion-icon>
</ion-card-title>
<ion-card-subtitle>{{card.jobTitle}}<span *ngIf="card.dept != undefined && card.dept != ''">, {{card.dept}}</span></ion-card-subtitle>
</ion-card-header>
<ion-card-content style="padding:0px">
<ion-item (click)="viewCard(card)">
<ion-thumbnail slot="start" class="profile-pic">
<img *ngIf="card.profilePic == undefined || card.profilePic == ''" src="assets/images/noPerson.jpg">
<img *ngIf="card.profilePic != undefined && card.profilePic != ''" [src]="card.profilePic">
</ion-thumbnail>
<ion-label class="ion-text-wrap">
<ion-row><ion-col class="ion-no-padding">{{card.company}}</ion-col></ion-row>
<ion-row *ngIf="card.city != undefined && card.city != '' && card.state != undefined && card.state != ''"><ion-col class="ion-no-padding">{{card.city}}, {{card.state}}</ion-col></ion-row>
<ion-row *ngIf="(card.city == undefined || card.city == '') && card.state != undefined && card.state != ''"><ion-col class="ion-no-padding">{{card.state}}</ion-col></ion-row>
<ion-row *ngIf="card.city != undefined && card.city != '' && (card.state == undefined || card.state == '')"><ion-col class="ion-no-padding">{{card.city}}</ion-col></ion-row>
</ion-label>
</ion-item>
<ion-row class="ion-padding" style="padding-bottom:0px"> <ion-col size="auto" *ngIf="card.mobile != undefined && card.mobile != ''">
<ion-icon name="phone-portrait" color="primary" size="large" (click)="callPhone(card.mobileCountryCode, card.mobile)"></ion-icon>
</ion-col>
<ion-col size="auto" *ngIf="card.workPhone != undefined && card.workPhone != ''">
<ion-icon name="call" color="primary" size="large" (click)="callPhone(card.workPhoneCountryCode, card.workPhone)"></ion-icon>
</ion-col>
<ion-col size="auto" *ngIf="card.email != undefined && card.email != ''">
<ion-icon name="mail" color="primary" size="large" (click)="sendMail(card.email)"></ion-icon>
</ion-col>
<ion-col size="auto" *ngIf="card.website != undefined && card.website != ''">
<ion-icon name="globe" color="secondary" size="large" (click)="openSite(card.website)"></ion-icon>
</ion-col>
<ion-col class="ion-text-right" *ngIf="card.status == globalVariables.SYNC_FAILED" style="font-size: small">CRM Sync failed</ion-col>
</ion-row>
</ion-card-content>
</ion-card>
填充同步卡片的代码是
this.syncedCards = []
const res:any = await this.dataSvc.getPendingCards(this.getUserKey())
for(let cardQ of res) {
if(cardQ._status == GlobalVariables.QUEUED || cardQ._status == GlobalVariables.REJECTED)
continue
var card = this.copyContactDataFromJson(cardQ)
this.syncedCards.push(card)
}
12 月 23 日更新:我现在确定这不是网络问题。数据在不到一秒的时间内在 syncedCards 数组中可用。整个 8-10 秒都花在了渲染上。
所以,我不会关闭它,但有一件事产生了巨大的变化,我一生都在忽略它。
在创建构建时我没有使用 --prod 标志并且仅使用 --prod 标志将 UI 渲染时间从 25+ 秒缩短到 3-5 秒。
它仍然很高,但至少是可管理和可接受的,因为应用程序现在不再只是等待渲染而已。
我正在使用 ionic 4,我的代码从 firebase 中提取数据。请求中有 40 个对象。我将它们推入一个数组,然后使用 ion-list 来渲染它。
渲染这 40 个对象需要 8-10 秒。我认为这是一个巨大的时间。下面是执行此操作的代码 html
<ion-content>
<ion-searchbar style="padding-bottom:0px" placeholder="{{ 'CONTACT_SEARCH_PLACEHOLDER' | translate }}" (ionChange)="doSearch()" [(ngModel)]="searchTerm" (ionClear)="searchReset()"></ion-searchbar>
<ion-list>
<ion-list-header>
<ion-label>{{ 'FAVORITE_CONTACTS' | translate }}</ion-label>
</ion-list-header>
<ng-container *ngFor="let card of core.syncedCards">
<app-contact-card *ngIf="card.favoriteContact == false" [card]="card"></app-contact-card>
</ng-container>
</ion-list>
</ion-content>
名片组件html是
<ion-card style="margin-top:5px">
<ion-card-header [ngClass]="card.partyNumber == 'demo' ? 'demoCard' : 'realCard'">
<ion-card-title>
{{card.firstName}} {{card.lastName}}
<ion-icon name="more" mode="md" color="primary" size="large" style="float:right" (click)="showCardActions($event, card)"></ion-icon>
<ion-icon *ngIf="card.partyNumber == 'demo'" size="large" style="float:right" color="danger" name="trash" (click)="deleteDemoCard(card.tempContactId)"></ion-icon>
<ion-icon style="float:right" size="large" *ngIf="card.favoriteContact == true" color="warning" name="star" (click)="toggleFavorite(card)"></ion-icon>
<ion-icon style="float:right" size="large" *ngIf="card.favoriteContact == false" color="warning" name="star-outline" (click)="toggleFavorite(card)"></ion-icon>
</ion-card-title>
<ion-card-subtitle>{{card.jobTitle}}<span *ngIf="card.dept != undefined && card.dept != ''">, {{card.dept}}</span></ion-card-subtitle>
</ion-card-header>
<ion-card-content style="padding:0px">
<ion-item (click)="viewCard(card)">
<ion-thumbnail slot="start" class="profile-pic">
<img *ngIf="card.profilePic == undefined || card.profilePic == ''" src="assets/images/noPerson.jpg">
<img *ngIf="card.profilePic != undefined && card.profilePic != ''" [src]="card.profilePic">
</ion-thumbnail>
<ion-label class="ion-text-wrap">
<ion-row><ion-col class="ion-no-padding">{{card.company}}</ion-col></ion-row>
<ion-row *ngIf="card.city != undefined && card.city != '' && card.state != undefined && card.state != ''"><ion-col class="ion-no-padding">{{card.city}}, {{card.state}}</ion-col></ion-row>
<ion-row *ngIf="(card.city == undefined || card.city == '') && card.state != undefined && card.state != ''"><ion-col class="ion-no-padding">{{card.state}}</ion-col></ion-row>
<ion-row *ngIf="card.city != undefined && card.city != '' && (card.state == undefined || card.state == '')"><ion-col class="ion-no-padding">{{card.city}}</ion-col></ion-row>
</ion-label>
</ion-item>
<ion-row class="ion-padding" style="padding-bottom:0px"> <ion-col size="auto" *ngIf="card.mobile != undefined && card.mobile != ''">
<ion-icon name="phone-portrait" color="primary" size="large" (click)="callPhone(card.mobileCountryCode, card.mobile)"></ion-icon>
</ion-col>
<ion-col size="auto" *ngIf="card.workPhone != undefined && card.workPhone != ''">
<ion-icon name="call" color="primary" size="large" (click)="callPhone(card.workPhoneCountryCode, card.workPhone)"></ion-icon>
</ion-col>
<ion-col size="auto" *ngIf="card.email != undefined && card.email != ''">
<ion-icon name="mail" color="primary" size="large" (click)="sendMail(card.email)"></ion-icon>
</ion-col>
<ion-col size="auto" *ngIf="card.website != undefined && card.website != ''">
<ion-icon name="globe" color="secondary" size="large" (click)="openSite(card.website)"></ion-icon>
</ion-col>
<ion-col class="ion-text-right" *ngIf="card.status == globalVariables.SYNC_FAILED" style="font-size: small">CRM Sync failed</ion-col>
</ion-row>
</ion-card-content>
</ion-card>
填充同步卡片的代码是
this.syncedCards = []
const res:any = await this.dataSvc.getPendingCards(this.getUserKey())
for(let cardQ of res) {
if(cardQ._status == GlobalVariables.QUEUED || cardQ._status == GlobalVariables.REJECTED)
continue
var card = this.copyContactDataFromJson(cardQ)
this.syncedCards.push(card)
}
12 月 23 日更新:我现在确定这不是网络问题。数据在不到一秒的时间内在 syncedCards 数组中可用。整个 8-10 秒都花在了渲染上。
所以,我不会关闭它,但有一件事产生了巨大的变化,我一生都在忽略它。
在创建构建时我没有使用 --prod 标志并且仅使用 --prod 标志将 UI 渲染时间从 25+ 秒缩短到 3-5 秒。
它仍然很高,但至少是可管理和可接受的,因为应用程序现在不再只是等待渲染而已。