国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍

這篇具有很好參考價(jià)值的文章主要介紹了記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識(shí),希望對(duì)大家有所幫助

記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍

在切換詳情頁中有這么一個(gè)場景,點(diǎn)擊上一條,會(huì)顯示上一條的詳情頁,同理,點(diǎn)擊下一條,會(huì)顯示下一條的詳情頁。

記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍

偽代碼如下所示:

我們定義了一個(gè)?switcher?模版, 用戶點(diǎn)擊上一條、下一條時(shí)調(diào)用?goToPreOrNext?方法。該頁面通過?loadingDone?狀態(tài)判斷是否展示加載效果。

// html
<thy-loading [thyDone]="loadingDone"></thy-loading>
<ng-container *ngIf="loadingDone">
	<styx-pivot-detail>
		...
		<thy-arrow-switcher
			...
		  (thyPrevious)="goToPreOrNext($event)"
		  (thyNext)="goToPreOrNext($event)"
		></thy-arrow-switcher>
	...
	</styx-pivot-detail>
</ng-container>

在?goToPreOrNext?方法中,當(dāng)調(diào)用該方法時(shí),通過?goToPreOrNextResolve?接口返回下一條的詳情?id,通過該?id?請(qǐng)求詳情數(shù)據(jù)。

// 請(qǐng)求下一條 id
fetchPreOrNext(event: ThyArrowSwitcherEvent) {
	...
	this.goToPreOrNextResolve(event.index, topicId).subscribe(
		(id: string) => {
			this.getDetail(id);
		}
		...
	)
}

// 請(qǐng)求詳情數(shù)據(jù)
getDetail(postId: string) {
	this.loadingDone = false;
	this.store
      .fetchPost(postId)
      .pipe(
          finalize(() => {
              this.loadingDone = true;
          })
      )
      .subscribe();
}

這看起來好像沒有什么問題,應(yīng)該一般都是這么干的,我們運(yùn)行看看。

記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍

???如何切換時(shí)候不閃?

與最上面的相比,有沒有發(fā)現(xiàn)每次切換時(shí),都會(huì)閃一下,用戶體驗(yàn)很不好,有沒有辦法可以解決它?

這個(gè)問題就是?loadingDone?的狀態(tài)切換導(dǎo)致的,我們把?loadingDone?干掉是不是就可以了?

如下代碼所示:

// 請(qǐng)求詳情數(shù)據(jù)
getDetail(postId: string) {
  // 注釋掉這一行
	// this.loadingDone = false;
	this.store
      .fetchPost(postId)
      .pipe(
          finalize(() => {
              this.loadingDone = true;
          })
      )
      .subscribe();
}

記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍

好像方案可行?

但是把網(wǎng)絡(luò)調(diào)成低速 3G 后,會(huì)發(fā)現(xiàn),我們的加載效果沒了,頁面像卡住了一樣,這當(dāng)然不行。

記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍

有沒有更好的方案?

??setTimeout 方案

把先前?loadingDone?狀態(tài)不放到?getDetail?方法中,而是單獨(dú)拿出來緊跟?this.getDetail(id)?后面。

代碼如下:

// 定義一個(gè) timer
**private timer = null;**

// 請(qǐng)求下一條 id
fetchPreOrNext(event: ThyArrowSwitcherEvent) {
    ...
    this.goToPreOrNextResolve(event.index, topicId).subscribe(
        (id: string) => {
            this.getDetail(id);

              **this.timer = setTimeout(() => {
               this.loadingDone = false;
              }, 500);**

        }
        ...
    )
}

// 請(qǐng)求詳情數(shù)據(jù)
getDetail(postId: string) {
  // 刪除掉該行l(wèi)oadingDone 代碼
	**// this.loadingDone = false;**
	this.store
      .fetchPost(postId)
      .pipe(
          finalize(() => {
              this.loadingDone = true;
	     // 記得清除
	     **clearTimeout(this.timer);**
          })
      )
      .subscribe();
}

這么做的含義就是,我們給到?loadingDone?500ms 的緩沖時(shí)間,如果 500ms 內(nèi)返回?cái)?shù)據(jù)了,則沒有?loading?的效果,如果沒有加載回來,在會(huì)顯示加載中。

一般情況如下所示:

記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍

?低速網(wǎng)絡(luò)下的效果:

記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍

這確實(shí)是一種方案,但是總感覺哪里怪怪的。

這里是個(gè)定時(shí)任務(wù)并且 500ms 后觸發(fā)。試想一種結(jié)果,當(dāng)我快速點(diǎn)擊下一條并且在 300ms 獲取到了數(shù)據(jù)并把 loadingDone 狀態(tài)置為 true, 但 500ms時(shí),loadingDone 狀態(tài)置為 false,造成假死的情況,顯然這不是我們想要的。

那這該如何解決?

???RxJS 大法

拋去使用 setTimeout 的方案,我們對(duì) getDetail 代碼改成如下的形式。

大致的思路是,將請(qǐng)求的 loading 狀態(tài)與數(shù)據(jù)獲取的狀態(tài)分離,并定義了兩個(gè)流 result$showLoadingIndicator$。

result$ 流請(qǐng)求到數(shù)據(jù)之后,之后之后的一些操作, showLoadingIndicator$ 流則負(fù)責(zé) loading 狀態(tài)的推送。

來看看怎么一步一步實(shí)現(xiàn)的:

首先我們定義一個(gè)請(qǐng)求的流。

const fetchPost$ = () => this.store.fetchPost(postId);

然后分別定義了兩個(gè)流?result$?和?showLoadingIndicator$。這里的?share()?函數(shù)是因?yàn)闀?huì)有兩個(gè)訂閱它的地方。

 const result$ = fetchPost$().pipe(share());

 const showLoadingIndicator$;

然后我們來處理?showLoadingIndicator$?流。

我們期望在 500ms 內(nèi)請(qǐng)求到的數(shù)據(jù),則不應(yīng)該展示 loading,否則,應(yīng)該展示 loading 狀態(tài)。

const showLoadingIndicator$ = timer(500).pipe(mapTo(true), takeUntil(result$))

如果在 500ms 后很快請(qǐng)求到了數(shù)據(jù),為了避免閃屏,我們需要讓?loading?至少顯示 1s。然后使用?merge()?合并這兩種結(jié)果。

const showLoadingIndicator$ = merge(
      timer(500).pipe(mapTo(true), takeUntil(result$)),
      combineLatest(result$, timer(1000)).pipe(mapTo(false))
  ).pipe(startWith(false), distinctUntilChanged());

最后訂閱它們。

result$.subscribe(
      result => {
         // 請(qǐng)求到結(jié)果后的操作
      },
      error => {
         // TODO
      }
  );

  showLoadingIndicator$.subscribe(isLoading => {
      // 更新 loadingDone 狀態(tài)
      this.loadingDone = !isLoading;
  });

完整的代碼如下:

// 請(qǐng)求下一條 id
fetchPreOrNext(event: ThyArrowSwitcherEvent) {
	...
	this.goToPreOrNextResolve(event.index, topicId).subscribe(
		(id: string) => {
		  this.getDetail(id);
		}
		...
	)
}

// 請(qǐng)求詳情數(shù)據(jù)
getDetail(postId: string) {

  const fetchPost$ = () => this.store.fetchPost(postId);

  const result$ = fetchPost$().pipe(share());

  const showLoadingIndicator$ = merge(
      timer(500).pipe(mapTo(true), takeUntil(result$)),
      combineLatest(result$, timer(1000)).pipe(mapTo(false))
  ).pipe(startWith(false), distinctUntilChanged());

  result$.subscribe(
      result => {
         // TODO
      },
      error => {
         // TODO
      }
  );

  showLoadingIndicator$.subscribe(isLoading => {
      this.loadingDone = !isLoading;
  });
}

如果想更細(xì)致知道如何實(shí)現(xiàn)的,參考下面這篇文檔:

Loading indication with a delay and anti-flickering in RxJS

記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍

本文轉(zhuǎn)載于:

https://juejin.cn/post/7176943529057321017

如果對(duì)您有所幫助,歡迎您點(diǎn)個(gè)關(guān)注,我會(huì)定時(shí)更新技術(shù)文檔,大家一起討論學(xué)習(xí),一起進(jìn)步。

?記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍文章來源地址http://www.zghlxwxcb.cn/news/detail-642837.html

到了這里,關(guān)于記錄--Loading 用戶體驗(yàn) - 加載時(shí)避免閃爍的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 為你的網(wǎng)站加上Loading等待加載效果吧 | Loading頁面加載添加教程

    為你的網(wǎng)站加上Loading等待加載效果吧 | Loading頁面加載添加教程

    為你的網(wǎng)站加上Loading等待加載效果吧 | Loading頁面加載添加教程 效果圖 : 教程開始 新建一個(gè)loading樣式css 將以下代碼放進(jìn)去 然后引用這個(gè)文件 code #Loadanimation{ ? ?background-color:#fff; ? ?height:100%; ? ?width:100%; ? ?position:fixed; ? ?z-index:1; ? ?margin-top:0px;top:0px; ? ? } #Loadanimation

    2024年02月09日
    瀏覽(19)
  • 【實(shí)戰(zhàn)】 六、用戶體驗(yàn)優(yōu)化 - 加載中和錯(cuò)誤狀態(tài)處理(中) —— React17+React Hook+TS4 最佳實(shí)踐,仿 Jira 企業(yè)級(jí)項(xiàng)目(九)

    學(xué)習(xí)內(nèi)容來源:React + React Hook + TS 最佳實(shí)踐-慕課網(wǎng) 相對(duì)原教程,我在學(xué)習(xí)開始時(shí)(2023.03)采用的是當(dāng)前最新版本: 項(xiàng) 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月13日
    瀏覽(19)
  • 【實(shí)戰(zhàn)】 六、用戶體驗(yàn)優(yōu)化 - 加載中和錯(cuò)誤狀態(tài)處理(上) —— React17+React Hook+TS4 最佳實(shí)踐,仿 Jira 企業(yè)級(jí)項(xiàng)目(八)

    【實(shí)戰(zhàn)】 六、用戶體驗(yàn)優(yōu)化 - 加載中和錯(cuò)誤狀態(tài)處理(上) —— React17+React Hook+TS4 最佳實(shí)踐,仿 Jira 企業(yè)級(jí)項(xiàng)目(八)

    學(xué)習(xí)內(nèi)容來源:React + React Hook + TS 最佳實(shí)踐-慕課網(wǎng) 相對(duì)原教程,我在學(xué)習(xí)開始時(shí)(2023.03)采用的是當(dāng)前最新版本: 項(xiàng) 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月12日
    瀏覽(29)
  • 【實(shí)戰(zhàn)】 六、用戶體驗(yàn)優(yōu)化 - 加載中和錯(cuò)誤狀態(tài)處理(下) —— React17+React Hook+TS4 最佳實(shí)踐,仿 Jira 企業(yè)級(jí)項(xiàng)目(十)

    【實(shí)戰(zhàn)】 六、用戶體驗(yàn)優(yōu)化 - 加載中和錯(cuò)誤狀態(tài)處理(下) —— React17+React Hook+TS4 最佳實(shí)踐,仿 Jira 企業(yè)級(jí)項(xiàng)目(十)

    學(xué)習(xí)內(nèi)容來源:React + React Hook + TS 最佳實(shí)踐-慕課網(wǎng) 相對(duì)原教程,我在學(xué)習(xí)開始時(shí)(2023.03)采用的是當(dāng)前最新版本: 項(xiàng) 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月15日
    瀏覽(27)
  • vue element-ui Loading加載事件的使用以及自定義Loading加載動(dòng)畫

    ?elemen-ui官方使用 loading加載事件屬性解釋 element-loading-text 在綁定了 v-loading 指令的元素上添加 element-loading-text 屬性,其值會(huì)被渲染為加載文案,并顯示在加載圖標(biāo)的下方 element-loading-spinner 和 element-loading-background 屬性分別用來設(shè)定圖標(biāo)類名和背景色值。 作為小白,這次主要

    2024年02月11日
    瀏覽(26)
  • vue頁面加載閃爍問題

    頁面加載時(shí),進(jìn)入頁面會(huì)閃爍顯示變量名。 給關(guān)聯(lián)的dom添加 v-cloak 增加css樣式

    2024年02月11日
    瀏覽(16)
  • elementui 自定義loading動(dòng)畫加載層

    elementui 自定義loading動(dòng)畫加載層

    elementui 自定義loading動(dòng)畫加載層。 main.js中添加 使用: element官網(wǎng): Loading 還可以以服務(wù)的方式調(diào)用。引入 Loading 服務(wù): import { Loading } from ‘element-ui’ 在需要調(diào)用時(shí): Loading.service(options); 其中 options 參數(shù)為 Loading 的配置項(xiàng),具體見下表。LoadingService 會(huì)返回一個(gè) Loading 實(shí)例,可通

    2024年02月09日
    瀏覽(23)
  • ElementUI淺嘗輒止23:Loading 加載

    Loading加載組件:加載數(shù)據(jù)時(shí)顯示動(dòng)效。 常見于加載數(shù)據(jù)量大的業(yè)務(wù)操作,附帶動(dòng)態(tài)效果。 在表格等容器中加載數(shù)據(jù)時(shí)顯示。 可自定義加載文案、圖標(biāo)和背景色。 頁面數(shù)據(jù)加載時(shí)顯示。 Loading 還可以以服務(wù)的方式調(diào)用。引入 Loading 服務(wù): 在需要調(diào)用時(shí): 其中? options ?參數(shù)

    2024年02月10日
    瀏覽(19)
  • 關(guān)于vue首屏加載loading問題

    注意:網(wǎng)上搜索出來的都是教你在index.html里面div id=\\\"app\\\"div class=\\\"loading\\\"/div或者在app.vue Mounte生命周期函數(shù)控制app和loading的顯示和隱藏,這里會(huì)有一個(gè)問題,就是js渲染頁面需要時(shí)間,一樣會(huì)出現(xiàn)幾秒鐘白屏。mounted(包裹使用nextTick)執(zhí)行回調(diào)div app的內(nèi)容依然沒有開始渲染。 正

    2024年02月09日
    瀏覽(19)
  • Flutter:EasyLoading(loading加載、消息提示)

    Flutter:EasyLoading(loading加載、消息提示)

    官方雖然提供了內(nèi)置的加載指示器和提示信息,但是功能比較簡陋,這里推薦: flutter_easyloading CircularProgressIndicator 加粗樣式 官方地址 https://pub-web.flutter-io.cn/packages/flutter_easyloading 安裝 官方在線示例 https://nslogx.github.io/flutter_easyloading/#/ 初始化 首先需要在 MaterialApp/CupertinoAp

    2024年02月16日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包