UNPKG

@blocklet/payment-react

Version:

Reusable react components for payment kit v2

121 lines (97 loc) 5.32 kB
# AddressForm `AddressForm` 元件提供了一個預先建置的使用者介面,用於收集帳單地址資訊。它與 `react-hook-form` 無縫整合,並包含針對郵遞區號等欄位的內建、特定國家/地區的驗證。 此元件設計靈活,支援完整地址收集和用於 Stripe 郵遞區號驗證的簡化版本。 ## Props | Prop | Type | Description | Default | | ----------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------- | | `mode` | `string` | 決定要顯示的欄位。設定為 `'required'` 以顯示完整的地址表單(地址第一行、城市、州/省、郵遞區號、國家/地區)。 | `undefined` | | `stripe` | `boolean` | 若為 `true`,則顯示一個僅包含郵遞區號和國家/地區的簡化表單,通常用於 Stripe 的卡片驗證。 | `false` | | `sx` | `SxProps` | MUI 的 `sx` prop,用於對根 `Stack` 元件進行自訂樣式設定。 | `{}` | | `fieldValidation` | `Record<string, any>` | 一個用於為特定欄位提供自訂驗證規則的物件,例如正規表示式模式。詳情請參閱驗證部分。 | `{}` | | `errorPosition` | `'right'` \| `'bottom'` | 指定相對於輸入欄位的驗證錯誤訊息顯示位置。 | `'right'` | ## Usage `AddressForm` 必須在 `react-hook-form` 的 `FormProvider` 內使用,因為它依賴其上下文來註冊欄位和管理狀態。 ### 標準帳單地址 若要收集完整的帳單地址,請將 `mode` prop 設定為 `'required'`。這將呈現所有標準地址欄位,每個欄位都帶有「必填」驗證規則。 ```tsx 包含完整地址的 AddressForm icon=material-symbols:location-on-outline import { FormProvider, useForm } from 'react-hook-form'; import { Button, Stack } from '@mui/material'; import AddressForm from './AddressForm'; // 調整匯入路徑 export default function FullAddressExample() { const methods = useForm({ defaultValues: { billing_address: { line1: '', city: '', state: '', postal_code: '', country: 'US', // 預設國家/地區 }, }, }); const onSubmit = (data) => { console.log('Form data:', data); }; return ( <FormProvider {...methods}> <form onSubmit={methods.handleSubmit(onSubmit)}> <Stack spacing={2}> <AddressForm mode="required" /> <Button type="submit" variant="contained"> 提交 </Button> </Stack> </form> </FormProvider> ); } ``` 此設定會呈現地址、城市、州/省和郵遞區號的輸入欄位。國家/地區是透過整合的 [CountrySelect](./components-ui-form-elements-country-select.md) 元件來選擇。 ### Stripe 郵遞區號驗證 當使用像 Stripe 這樣的支付方式時,通常只需要郵遞區號和國家/地區進行卡片驗證。將 `stripe` prop 設定為 `true`,以呈現僅包含這兩個欄位的簡化表單。 ```tsx 用於 Stripe 的 AddressForm icon=logos:stripe import { FormProvider, useForm } from 'react-hook-form'; import { Button, Stack } from '@mui/material'; import AddressForm from './AddressForm'; // 調整匯入路徑 export default function StripeAddressExample() { const methods = useForm({ defaultValues: { billing_address: { postal_code: '', country: 'US', // 預設國家/地區 }, }, }); const onSubmit = (data) => { console.log('Form data:', data); }; return ( <FormProvider {...methods}> <form onSubmit={methods.handleSubmit(onSubmit)}> <Stack spacing={2}> <AddressForm stripe={true} /> <Button type="submit" variant="contained"> 提交 </Button> </Stack> </form> </FormProvider> ); } ``` ## 驗證 該元件包含對必填欄位的自動驗證。最顯著的特點是動態郵遞區號驗證,它會根據所選國家/地區調整其規則。 - **必填欄位**:所有可見欄位都會自動標記為必填。 - **郵遞區號**:驗證邏輯使用 `validator/lib/isPostalCode` 函式庫。它會根據所選國家/地區的標準格式(例如,美國為 5 位數字,加拿大為字母數字)來檢查郵遞區號格式。如果某個國家/地區的格式未被明確支援,則會套用通用驗證。 - **自訂驗證**:您可以透過 `fieldValidation` prop 傳遞額外的驗證規則。例如,若要對 `state` 欄位強制執行特定模式: ```tsx const customValidation = { 'billing_address.state': { pattern: '^[A-Z]{2}$', pattern_message: { en: '州/省必須是 2 個字母的代碼。', }, }, }; <AddressForm mode="required" fieldValidation={customValidation} />; ```