@blocklet/ui-react
Version:
Some useful front-end web components that can be used in Blocklets.
214 lines (165 loc) • 8.08 kB
Markdown
# Hooks API
本節提供該函式庫中可用的自訂 React Hooks 的詳細參考。這些 Hooks 旨在封裝和重用有狀態的邏輯,簡化 Blocklet 環境中的常見任務和互動。
## useComponentInstalled
此 Hook 檢查一個或多個指定的選擇性元件(透過其 DID 識別)是否已安裝。對於實作依賴其他 Blocklet 作為相依項的功能至關重要。此 Hook 提供安裝狀態和必要的 URL,以便在需要時提示使用者進行安裝。
### 參數
此 Hook 接受一個包含以下屬性的物件:
<x-field-group>
<x-field data-name="did" data-type="string | string[]" data-required="true">
<x-field-desc markdown>要檢查的元件的去中心化識別碼(DID)或 DID 陣列。單一字串可以包含多個以 `;;` 分隔的 DID。</x-field-desc>
</x-field>
<x-field data-name="onInstalled" data-type="function" data-required="false">
<x-field-desc markdown>一個選擇性的回呼函式,當所有指定的元件都已安裝時觸發。</x-field-desc>
</x-field>
<x-field data-name="onError" data-type="function" data-required="false">
<x-field-desc markdown>一個選擇性的回呼函式,當一個或多個指定的元件未安裝時觸發。</x-field-desc>
</x-field>
</x-field-group>
### 回傳值
它回傳一個包含安裝狀態和相關資料的物件:
<x-field-group>
<x-field data-name="optComponents" data-type="array">
<x-field-desc markdown>一個未安裝的元件物件陣列。每個物件包含元資料,如 `meta.did`、`storeUrl` 和 `installUrl`。</x-field-desc>
</x-field>
<x-field data-name="installed" data-type="boolean">
<x-field-desc markdown>一個布林值,如果所有指定的元件都已安裝且在 `blocklet.yml` 中定義,則為 `true`,否則為 `false`。</x-field-desc>
</x-field>
<x-field data-name="installStatus" data-type="object">
<x-field-desc markdown>一個物件,其中鍵是元件的 DID,值是其目前的安裝狀態(例如「waiting」、「installing」)。此狀態透過 `window.postMessage` 事件更新。</x-field-desc>
</x-field>
<x-field data-name="setInstallStatus" data-type="function">
<x-field-desc markdown>用於手動更新 `installStatus` 物件的狀態設定函式。</x-field-desc>
</x-field>
<x-field data-name="definedInBlockletYML" data-type="boolean">
<x-field-desc markdown>一個布林值,表示該元件是否在 blocklet 的設定檔(`blocklet.yml`)中定義。</x-field-desc>
</x-field>
</x-field-group>
### 使用範例
以下範例示範如何使用 `useComponentInstalled` 來條件性地渲染一個功能,或在缺少相依項時渲染一個 `ComponentInstaller` 元件。
```javascript "ComponentFeature.js" icon=logos:javascript
import React from 'react';
import { useComponentInstalled, ComponentInstaller } from '@blocklet/ui-react';
const REQUIRED_DID = 'z8ia24z55nve2TSF5m1aZ5322d9f48a43D4a'; // 範例 DID
function ComponentFeature() {
const { installed, optComponents } = useComponentInstalled({ did: REQUIRED_DID });
if (!installed) {
// 如果元件不存在,則渲染安裝程式 UI
return <ComponentInstaller components={optComponents} />;
}
// 渲染依賴於已安裝元件的功能
return (
<div>
<h2>My Feature</h2>
<p>This feature requires the component with DID: {REQUIRED_DID}</p>
{/* ... 功能實作 ... */}
</div>
);
}
export default ComponentFeature;
```
## useFollow
此 Hook 管理目前已驗證的使用者與另一位由其 DID 指定的使用者之間的追蹤關係。它處理追蹤和取消追蹤的 API 呼叫,並提供目前的追蹤狀態。
### 參數
<x-field-group>
<x-field data-name="userDid" data-type="string" data-required="true">
<x-field-desc markdown>要檢查追蹤狀態的使用者設定檔的 DID。</x-field-desc>
</x-field>
<x-field data-name="t" data-type="function" data-required="true">
<x-field-desc markdown>用於顯示成功或錯誤訊息的翻譯函式(例如,來自 `react-i18next`)。</x-field-desc>
</x-field>
<x-field data-name="isMySelf" data-type="boolean" data-required="true">
<x-field-desc markdown>如果 `userDid` 屬於目前登入的使用者,則應設定為 `true` 的布林值。</x-field-desc>
</x-field>
</x-field-group>
### 回傳值
回傳一個包含以下屬性的物件:
<x-field-group>
<x-field data-name="followed" data-type="boolean">
<x-field-desc markdown>表示目前使用者是否正在追蹤由 `userDid` 指定的使用者。如果正在追蹤則為 `true`,否則為 `false`。</x-field-desc>
</x-field>
<x-field data-name="followUser" data-type="function">
<x-field-desc markdown>一個穩定的函式,用於呼叫以追蹤使用者。它處理 API 請求並在成功時更新 `followed` 狀態。</x-field-desc>
</x-field>
<x-field data-name="unfollowUser" data-type="function">
<x-field-desc markdown>一個穩定的函式,用於呼叫以取消追蹤使用者。它處理 API 請求並在成功時更新 `followed` 狀態。</x-field-desc>
</x-field>
</x-field-group>
### 使用範例
此範例展示如何建立一個 `FollowButton` 元件,根據關係狀態顯示「追蹤」或「取消追蹤」操作。
```javascript "FollowButton.js" icon=logos:javascript
import React from 'react';
import Button from '@mui/material/Button';
import { useTranslation } from 'react-i18next';
import { useFollow } from '@blocklet/ui-react/hooks';
import { useSession } from '@blocklet/did-connect-react';
function FollowButton({ profileDid }) {
const { session } = useSession();
const { t } = useTranslation();
const isMySelf = session?.user?.did === profileDid;
const { followed, followUser, unfollowUser } = useFollow({
userDid: profileDid,
t,
isMySelf,
});
if (isMySelf) {
return null; // 不在自己的個人資料頁面上顯示按鈕
}
const handleClick = () => {
if (followed) {
unfollowUser();
} else {
followUser();
}
};
return (
<Button variant="contained" onClick={handleClick}>
{followed ? t('profile.unfollow') : t('profile.follow')}
</Button>
);
}
export default FollowButton;
```
## useMobile
一個用於建立響應式元件的簡單工具 Hook。它利用 Material-UI 的 `useMediaQuery` 來判斷目前的視窗寬度是否低於指定的斷點。
### 參數
<x-field-group>
<x-field data-name="key" data-type="number | Breakpoint" data-default="'sm'" data-required="false">
<x-field-desc markdown>Material-UI 的斷點鍵(例如 `'xs'`、`'sm'`、`'md'`)或一個像素值用於檢查。如果螢幕寬度小於此值,此 Hook 回傳 `true`。</x-field-desc>
</x-field>
</x-field-group>
### 回傳值
回傳一個 `boolean` 值:如果視窗小於指定的斷點,則為 `true`,否則為 `false`。
### 使用範例
此 Hook 必須在被 Material-UI `ThemeProvider` 包裹的元件樹中使用。
```javascript "ResponsiveComponent.js" icon=logos:javascript
import React from 'react';
import Typography from '@mui/material/Typography';
import { ThemeProvider, createTheme } from '@mui/material/styles';
import { useMobile } from '@blocklet/ui-react/hooks';
// 一個使用此 Hook 的元件
function ResponsiveComponent() {
const isMobile = useMobile({ key: 'md' }); // 根據 'md' 斷點進行檢查
return (
<div>
{isMobile ? (
<Typography variant="h6">Mobile View</Typography>
) : (
<Typography variant="h4">Desktop View</Typography>
)}
<p>Resize your browser window to see the content change.</p>
</div>
);
}
// 該元件必須被 ThemeProvider 包裹
const theme = createTheme();
function App() {
return (
<ThemeProvider theme={theme}>
<ResponsiveComponent />
</ThemeProvider>
);
}
export default App;
```
---
透過使用這些 Hooks,您可以用最少的樣板程式碼高效地實作複雜的功能。有關可能使用這些 Hooks 的元件的更多資訊,請參閱[元件](./components.md)文件。