(最後在分享個小東西:useSound 🎺)
// In a function component:
useEffect(() => {
fetchSomething();
}, []);
read() → 拉完之後才會去讀資料
前兩種的資料都會有為 null 的狀態
// Start fetching early!
const resource = fetchProfileData();
// ...
function ProfileDetails() {
// Try to read user info
const user = resource.user.read();
return <h1>{user.name}</h1>;
}
Transition 就是指切換頁面的那個 Transition。
以官方提供的範例來說
Home Page 切到 Profile Page 時,
原本的畫面就不見了,只剩下一個大大的 Loading 😢。
在跳頁時,讓原本的畫面暫留一下子來跳過Loading State!
Origin
startTransition
Origin
🚨 isPending
Finished
NEW
startTransition
Function,可以用來告訴 React 哪些 State Update 可以延後生效
isPending
Boolean ,代表 Transition 是否正在進行。
讓原先的頁面能顯示 Loading 提示,不然停在原本的頁面也會讓使用者以為網頁失去回應。
timeoutMs
Number,設定一個 Pending 的時間上限,超過了時間無論畫面有多糟都是直接進行 State Update ( Loading )。
const [
startTransition,
isPending
] = useTransition({
timeoutMs: 10000
});
function handleClick() {
startTransition(() => {
onClick();
});
}
<>
<button
onClick={handleClick}
disabled={isPending}
>
{children}
</button>
{isPending ? spinner : null}
</>
function handleChange(e) {
const value = e.target.value;
// Outside the transition (urgent)
setQuery(value);
startTransition(() => {
// Inside the transition (may be delayed)
setResource(fetchTranslation(value));
});
}
直接包成hook
import { useDeferredValue } from 'react';
const deferredValue = useDeferredValue(
value, { timeoutMs: 5000 // 延遲的毫秒數 });
function handleChange(e) {
const value = e.target.value;
// Outside the transition (urgent)
setQuery(value);
startTransition(() => {
// Inside the transition (may be delayed)
setResource(fetchTranslation(value));
});
}
Summary
改變前端讀取資料的方式
不只更改狀態,能更進一步去安排「更新的優先順序」
去除過多、冗長的 Loading 狀態
透過上述方式來 優化資料載入 和 頁面切換的體驗
(現在的版本已經變 Legacy Mode 了🥺)
npm install use-sound
const [play, exposedData] = useSound('xxx.mp3', HookOptions);
exposedData
HookOptions