@blocklet/payment-react
Version:
Reusable react components for payment kit v2
121 lines (97 loc) • 5.36 kB
Markdown
# AddressForm
`AddressForm` 组件提供了一个预构建的用户界面,用于收集账单地址信息。它与 `react-hook-form` 无缝集成,并包含针对邮政编码等字段的内置、特定国家/地区的验证。
该组件设计灵活,既支持完整的地址收集,也支持用于 Stripe 邮政编码验证的简化版本。
## Props
| Prop | Type | Description | Default |
| ----------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
| `mode` | `string` | 决定要显示的字段。设置为 `'required'` 以显示完整的地址表单(地址行 1、城市、州/省、邮政编码、国家/地区)。 | `undefined` |
| `stripe` | `boolean` | 如果为 `true`,则显示一个仅包含邮政编码和国家/地区的简化表单,通常用于 Stripe 的银行卡验证。 | `false` |
| `sx` | `SxProps` | MUI 的 `sx` 属性,用于对根 `Stack` 组件进行自定义样式设置。 | `{}` |
| `fieldValidation` | `Record<string, any>` | 一个用于为特定字段提供自定义验证规则(例如正则表达式模式)的对象。有关详细信息,请参见验证部分。 | `{}` |
| `errorPosition` | `'right'` \| `'bottom'` | 指定在输入字段的哪个位置显示验证错误消息。 | `'right'` |
## 用法
`AddressForm` 必须在 `react-hook-form` 的 `FormProvider` 中使用,因为它依赖其上下文来注册字段和管理状态。
### 标准账单地址
要收集完整的账单地址,请将 `mode` 属性设置为 `'required'`。这将渲染所有标准的地址字段,每个字段都带有“必填”验证规则。
```tsx AddressForm with Full Address 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('表单数据:', data);
};
return (
<FormProvider {...methods}>
<form onSubmit={methods.handleSubmit(onSubmit)}>
<Stack spacing={2}>
<AddressForm mode="required" />
<Button type="submit" variant="contained">
Submit
</Button>
</Stack>
</form>
</FormProvider>
);
}
```
此设置会渲染地址行、城市、州/省和邮政编码的输入字段。国家/地区通过集成的 [CountrySelect](./components-ui-form-elements-country-select.md) 组件进行选择。
### Stripe 邮政编码验证
在使用 Stripe 等支付方式时,通常只需要邮政编码和国家/地区进行银行卡验证。将 `stripe` 属性设置为 `true` 以渲染一个仅包含这两个字段的简化表单。
```tsx AddressForm for Stripe 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('表单数据:', data);
};
return (
<FormProvider {...methods}>
<form onSubmit={methods.handleSubmit(onSubmit)}>
<Stack spacing={2}>
<AddressForm stripe={true} />
<Button type="submit" variant="contained">
Submit
</Button>
</Stack>
</form>
</FormProvider>
);
}
```
## 验证
该组件包含对必填字段的自动验证。最显著的特点是动态邮政编码验证,它会根据所选的国家/地区调整其规则。
- **必填字段**:所有可见字段都会自动标记为必填。
- **邮政编码**:验证逻辑使用 `validator/lib/isPostalCode` 库。它会根据所选国家/地区的标准格式(例如,美国的 5 位数字,加拿大的字母数字组合)检查邮政编码格式。如果某个国家/地区的格式未被明确支持,则会应用通用验证。
- **自定义验证**:您可以通过 `fieldValidation` 属性传递额外的验证规则。例如,要对 `state` 字段强制执行特定模式:
```tsx
const customValidation = {
'billing_address.state': {
pattern: '^[A-Z]{2}$',
pattern_message: {
en: '州/省必须是 2 个字母的代码。',
},
},
};
<AddressForm mode="required" fieldValidation={customValidation} />;
```