iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0
Modern Web

MERN Stack + Tailwind CSS - React 小專案實踐計畫系列 第 27

【Day 27】資料載入前… Loading 畫面

  • 分享至 

  • xImage
  •  

Loading

在資料尚未載入或回傳時,畫面會呈現空白或停止狀態,這樣會造成不好的使用者體驗,所以通常都會加一個 Loading 畫面,告知使用者目前應用程式有在運作,讓使用者願意等待而不是離開頁面

以下介紹兩種常見又簡單的 Loading:

React Loading Skeleton

可以依據要顯示的元件架構製作預覽框架,讓使用者有心理準備(?)接下來會出現的畫面

https://ithelp.ithome.com.tw/upload/images/20221011/20152502ex4ybmXEOo.png

安裝套件

yarn add react-loading-skeleton

App.js 中引入 CSS 樣式

import "react-loading-skeleton/dist/skeleton.css";

Home.js 中宣告一個狀態變數 loading ,初始值為 true ,執行完 getAllPost 後值設定為 false

https://ithelp.ithome.com.tw/upload/images/20221011/20152502DiBP9vrRVO.png

然後將 loading 傳給 <Post />

<Post data={posts} loading={loading} />

components/Post.js 中引入 Skeleton ,然後依照官方文件的說明,搭配 loading 進行條件渲染

<Skeleton /> 直接跟內容放在一起,樣式也可以依照需求微調)

import Skeleton from 'react-loading-skeleton';

<span className="ml-3 opacity-80 text-sm">
    {loading ? <Skeleton width="25%" /> : formatDate(el.createdAt)}
</span>

https://ithelp.ithome.com.tw/upload/images/20221011/20152502Hn3UDmunbz.png

完成後就會呈現這樣~非常乾淨俐落呢!

https://ithelp.ithome.com.tw/upload/images/20221011/20152502Jg0AYgEBTe.png

PostDetail.js 也是相同概念~

https://ithelp.ithome.com.tw/upload/images/20221011/20152502yu009j20eP.png

Lottie for Web

接下來介紹另一種,非常適合放動畫用的工具 - Lottie,主要的兩大用法:

  1. 使用自己做的動畫 - Adobe After Effects + Bodymovin
  2. 使用別人做好的動畫 - 從官網找免費分享的素材

(今天使用較方便的第二個用法!)

尋找想要使用的素材

https://ithelp.ithome.com.tw/upload/images/20221011/20152502iLE26mIrIx.png

找到後點擊「Download」→ 「Lottie JSON」,下載 json 檔(要先登入!)

https://ithelp.ithome.com.tw/upload/images/20221011/20152502zNRxRqH0Vi.png

安裝套件

yarn add lottie-web

然後把動畫的 json 檔放進專案中 → src/animations/

https://ithelp.ithome.com.tw/upload/images/20221011/20152502aWXMmvjFyb.png

接著建立 components/Loading.js ,依照官方文件使用 lottie.loadAnimation() ,並設定需要的資料

return () => instance.destroy(); 是為了避免 useEffect 渲染兩次而出現兩個重複的 Loading 動畫)

import React, { useEffect, useRef } from 'react';
import lottie from 'lottie-web';
import loadingAnimation from '../animations/98742-loading.json';

export default function Loading() {
    const animation = useRef(null);

    useEffect(() => {
        const instance = lottie.loadAnimation({
            container: animation.current,
            renderer: 'svg',
            loop: true,
            autoplay: true,
            animationData: loadingAnimation,
        });
        return () => instance.destroy();
    }, []);

    return (
        <div className="absolute w-full h-full flex items-center justify-center">
            <div className="" ref={animation}></div>
        </div>
    );
}

最後把 <Loading /> 加進 PostDetail.js

https://ithelp.ithome.com.tw/upload/images/20221011/20152502lIv00xPDt7.png

這樣就能顯示 Loading 動畫啦~

https://ithelp.ithome.com.tw/upload/images/20221011/20152502RrEwJPZ4Rs.png


上一篇
【Day 26】搜尋功能 - MongoDB Atlas Search
下一篇
【Day 28】調整專案細節
系列文
MERN Stack + Tailwind CSS - React 小專案實踐計畫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言