建可視化自動保存狀態(tài))
Refine v5 中的 Ant DesignAutoSaveIndicator /為管理后臺表單構(gòu)建可視化自動保存狀態(tài)【免費下載鏈接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.項目地址: https://gitcode.com/GitHub_Trending/re/refine本指南圍繞 Refine 的Ant Design 集成包refinedev/antd中的AutoSaveIndicator /組件展開講解如何把它接入useForm的自動保存auto-save流程向用戶直觀呈現(xiàn)保存中 / 已保存 / 保存失敗 / 等待修改四種狀態(tài)。讀完本文你將掌握該組件的接入方式、autoSaveProps數(shù)據(jù)契約、內(nèi)置的 Ant Design 樣式實現(xiàn)原理以及如何通過elements屬性深度自定義各狀態(tài)下的展示內(nèi)容。組件定位Ant Design 風(fēng)格的核心組件擴展AutoSaveIndicator /是 Refine 核心包refinedev/core中同名組件的擴展實現(xiàn)專為 Ant Design 生態(tài)打磨它復(fù)用了核心組件的狀態(tài)判斷邏輯但把默認(rèn)展示元素替換為與 Ant Design 組件庫和主題體系一致的元素packages/antd/src/components/autoSaveIndicator/index.tsx。從源碼結(jié)構(gòu)看Ant Design 版本的組件本身不包含任何自動保存觸發(fā)邏輯它接收status、error、data以及可選的elements將其透傳給核心組件完成渲染// packages/antd/src/components/autoSaveIndicator/index.tsx節(jié)選 return ( AutoSaveIndicatorCore status{status} elements{{ success, error, loading, idle, }} / );核心組件則根據(jù)status用switch分發(fā)渲染對應(yīng)的元素packages/core/src/components/autoSaveIndicator/index.tsxswitch (status) { case success: return {success}/; case error: return {error}/; case pending: return {loading}/; case idle: return {idle}/; default: return {idle}/; }注意核心組件內(nèi)部用status pending來匹配保存中狀態(tài)而autoSaveProps對外暴露的狀態(tài)注釋為loading | error | idle | success二者語義對應(yīng)接入時無需關(guān)心這一內(nèi)部細節(jié)??焖俳尤霃膗seForm拿到autoSaveProps接入方式非常簡單從refinedev/antd的useForm返回對象中取出autoSaveProps通過展開運算符spread傳給AutoSaveIndicator /即可import { AutoSaveIndicator, useForm } from refinedev/antd; const MyComponent () { const { autoSaveProps } useForm({ refineCoreProps: { autoSave: { enabled: true, }, }, }); console.log(autoSaveProps); /* { status: success, // loading | error | idle | success error: null, // HttpError | null data: { ... }, // UpdateResponse | undefined, } */ return AutoSaveIndicator {...autoSaveProps} /; };需要特別說明的是refinedev/antd的useForm與核心useForm在參數(shù)結(jié)構(gòu)上的差異Ant Design 版useForm中自動保存配置需要放在refineCoreProps.autoSave下而核心包的useForm直接使用autoSave頂層選項參見 documentation/docs/core/components/auto-save-indicator/index.md。在refinedev/antd的useForm中開啟autoSave.enabled: true后表單值發(fā)生變化時會自動觸發(fā)自動保存而核心包的useForm并不會自動觸發(fā)需要手動調(diào)用onFinishAutoSave。理解autoSaveProps的數(shù)據(jù)契約autoSaveProps的類型定義位于 packages/core/src/hooks/form/types.ts它實際上是對內(nèi)部useUpdate變更mutation返回值的抽取export type AutoSaveReturnType TData extends BaseRecord BaseRecord, TError extends HttpError HttpError, TVariables {}, { autoSaveProps: Pick UseUpdateReturnTypeTData, TError, TVariables[mutation], data | error | status ; onFinishAutoSave: ( values: TVariables, ) PromiseUpdateResponseTData | void; };三個字段的語義如下字段類型含義statusloading \| error \| idle \| success當(dāng)前自動保存請求的狀態(tài)errorHttpError \| null自動保存請求失敗時返回的錯誤對象成功時為nulldataUpdateResponse \| undefined自動保存更新請求成功后的響應(yīng)數(shù)據(jù)未完成時為undefined正因為autoSaveProps是對useUpdatemutation 狀態(tài)的直接映射AutoSaveIndicator /的對應(yīng) propsdata、error、status也復(fù)用了UseUpdateReturnType中的類型保證類型在端到端傳遞時始終一致packages/core/src/components/autoSaveIndicator/index.tsx#L9-L31。內(nèi)置四態(tài)樣式Ant Design 主題與圖標(biāo)體系A(chǔ)nt Design 版本為四種狀態(tài)提供了開箱即用的默認(rèn)元素每個元素都是一個封裝好的Message組件由翻譯文本 圖標(biāo)構(gòu)成packages/antd/src/components/autoSaveIndicator/index.tsx#L15-L46狀態(tài)默認(rèn)文本translationKey / 默認(rèn)值默認(rèn)圖標(biāo)successautoSave.success/ savedCheckCircleOutlined成功對勾errorautoSave.error/ auto save failureExclamationCircleOutlined異常感嘆號loadingautoSave.loading/ saving...SyncOutlined旋轉(zhuǎn)同步圖標(biāo)idleautoSave.idle/ waiting for changesEllipsisOutlined省略號這些默認(rèn)元素在樣式上完全對齊 Ant Design 設(shè)計語言文本使用Typography.Text渲染顏色取自主題 tokencolorTextTertiary即通過theme.useToken()獲取的次要文本色字號為0.8rem圖標(biāo)與文本之間保持0.2rem間距文本右側(cè)保留5px外邊距。// packages/antd/src/components/autoSaveIndicator/index.tsx節(jié)選 const { token } theme.useToken(); return ( Typography.Text style{{ marginRight: 5, color: token.colorTextTertiary, fontSize: .8rem, }} {translate(translationKey, defaultMessage)} span style{{ marginLeft: .2rem }}{icon}/span /Typography.Text );文本通過useTranslate()讀取因此當(dāng)你為應(yīng)用配置了 i18n 資源時默認(rèn)文案會隨語言環(huán)境自動切換未命中翻譯 key 時則回退到上述默認(rèn)英文文案packages/antd/src/components/autoSaveIndicator/index.tsx#L61-L85。自定義各狀態(tài)展示elements屬性默認(rèn)四態(tài)樣式適合多數(shù)場景但如果你希望展示更貼合業(yè)務(wù)語義的文案、插入加載動畫或自定義組件可以通過elements屬性覆蓋任意一個或多個狀態(tài)import { AutoSaveIndicator, useForm } from refinedev/antd; const MyComponent () { const { autoSaveProps } useForm({ refineCoreProps: { autoSave: { enabled: true }, }, }); return ( AutoSaveIndicator {...autoSaveProps} elements{{ loading: span正在保存.../span, error: span自動保存失敗請檢查網(wǎng)絡(luò)。/span, idle: span等待修改.../span, success: span已保存。/span, }} / ); };elements的類型為PartialRecordsuccess | error | loading | idle, ReactNodepackages/core/src/hooks/form/types.ts#L63-L65也就是說你只需覆蓋需要變更的狀態(tài)其余狀態(tài)仍使用 Ant Design 默認(rèn)元素——每個屬性在解構(gòu)時都帶有默認(rèn)值兜底。底層機制auto-save 配置與防抖原理要真正用好AutoSaveIndicator /理解它背后autoSave選項的行為同樣重要。autoSave的配置類型定義在 packages/core/src/hooks/form/types.ts#L39-L47export type AutoSavePropsTVariables { autoSave?: { enabled: boolean; debounce?: number; onFinish?: (values: TVariables) TVariables; invalidateOnUnmount?: boolean; invalidateOnClose?: boolean; }; };配置項類型默認(rèn)值作用enabledboolean—是否啟用自動保存debouncenumber1000毫秒輸入變化后延遲多少毫秒再觸發(fā)保存onFinish(values) values—提交前的值轉(zhuǎn)換/預(yù)處理鉤子invalidateOnUnmountboolean—組件卸載時是否使相關(guān)查詢失效invalidateOnCloseboolean—表單關(guān)閉時是否使相關(guān)查詢失效從 packages/core/src/hooks/form/index.ts#L310-L319 可以看到自動保存觸發(fā)函數(shù)onFinishAutoSave由asyncDebounce包裝默認(rèn)防抖時長為1000msconst onFinishAutoSave React.useMemo( () asyncDebounce( (values: TVariables) onFinishRef.current(values, { isAutosave: true }), props.autoSave?.debounce ?? 1000, Cancelled by debounce, ), [props.autoSave?.debounce], );這解釋了組件展示上的一個體驗細節(jié)當(dāng)用戶連續(xù)快速編輯時status會因防抖與請求周期在loading、success、idle之間切換AutoSaveIndicator /正是負責(zé)把這一過程實時、直觀地呈現(xiàn)給用戶。另外組件卸載時會調(diào)用onFinishAutoSave.cancel()取消尚未執(zhí)行的防抖任務(wù)packages/core/src/hooks/form/index.ts#L321-L325。測試驗證四態(tài)渲染由共享測試套件保障Refine 通過refinedev/ui-tests提供了跨 UI 集成包共享的組件測試AutoSaveIndicator /的四態(tài)渲染均有測試覆蓋packages/ui-tests/src/tests/autoSaveIndicator.tsxstatussuccess時渲染文本 savedstatuserror時渲染文本 auto save failurestatusidle時渲染文本 waiting for changesstatuspending時渲染文本 saving...。Ant Design 版本的測試直接綁定這套共享套件packages/antd/src/components/autoSaveIndicator/index.spec.tsximport { autoSaveIndicatorTests } from refinedev/ui-tests; import { AutoSaveIndicator } from ./; describe(AutoSaveIndicator, () { autoSaveIndicatorTests.bind(this)(AutoSaveIndicator); });這意味著只要傳入合法的status無論你使用的是核心組件還是 Ant Design 擴展組件四態(tài)渲染行為都有一致性保障。使用注意事項autoSave僅支持編輯edit場景核心useForm在非 edit action 下啟用自動保存會輸出警告[useForm]: autoSave is only allowed in edit actionpackages/core/src/hooks/form/index.ts#L364。因此在 create/clone 頁面上不要期望自動保存生效。組件只負責(zé)展示AutoSaveIndicator /本身不包含任何觸發(fā)保存的邏輯它純粹根據(jù)autoSaveProps.status渲染反饋觸發(fā)行為由useForm的 auto-save 機制onFinishAutoSave 防抖完成。需要 i18n 資源時自行補充默認(rèn)文案通過useTranslate讀取autoSave.success/error/loading/idle四個 key未配置對應(yīng)語言包時回退到英文默認(rèn)值。小結(jié)AutoSaveIndicator /Ant Design以極低的接入成本為 Refine 表單的自動保存能力補齊了用戶可感知的最后一塊拼圖useForm負責(zé)在表單值變化后防抖自動保存并產(chǎn)出autoSaveProps組件負責(zé)把loading / success / error / idle四種狀態(tài)映射為符合 Ant Design 設(shè)計語言的圖標(biāo)與文案。若需要進一步了解自動保存機制的完整設(shè)計可繼續(xù)閱讀核心包的 Auto Save 指南 與 核心版AutoSaveIndicator /文檔。【免費下載鏈接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.項目地址: https://gitcode.com/GitHub_Trending/re/refine創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考