跳到主要内容

表单元素

@blocklet/payment-react 库提供了一系列精细的输入组件,旨在简化自定义支付和联系信息表单的创建。这些元素在构建时充分考虑了验证和用户体验,能够与 react-hook-form 顺畅集成,为数据收集提供了一个强大而灵活的解决方案。

每个组件都被设计为一个独立的单元,让你可以将它们组合成满足你特定需求的复杂表单。以下是可用的表单元素概览。

通用使用模式

这些表单元素旨在与 react-hook-formFormProvider 一起使用。你可以组合它们来构建全面的表单,以捕获交易所需的所有必要信息。虽然每个组件都有其自己的一套属性,但它们共享一个通用的集成模式。

下面是一个基本示例,展示了如何组合多个表单元素来创建一个用户信息表单:

MyCustomForm.tsx

jsx
import { FormProvider, useForm } from 'react-hook-form';
import { AddressForm, PhoneInput, CurrencySelector } from '@blocklet/payment-react';
import { Button, Stack } from '@mui/material';

// 假设 `availableCurrencies` 是从你的后端获取的
const availableCurrencies = [
  {
    id: 'usd_xxx',
    name: 'USD',
    symbol: 'USD',
    logo: 'url/to/usd_logo.png',
    method: { id: 'stripe', name: 'Stripe' },
  },
  // ... 其他货币
];

function MyCustomForm() {
  const methods = useForm({
    defaultValues: {
      currency: 'usd_xxx',
      phone_number: '',
      billing_address: {
        line1: '',
        city: '',
        state: '',
        postal_code: '',
        country: 'US', // 使用 ISO2 代码
      },
    },
  });

  const onSubmit = (data) => {
    console.log('表单数据已提交:', data);
  };

  return (
    <FormProvider {...methods}>
      <form onSubmit={methods.handleSubmit(onSubmit)}>
        <Stack spacing={2}>
          <CurrencySelector
            value={methods.watch('currency')}
            currencies={availableCurrencies}
            onChange={(currencyId) => methods.setValue('currency', currencyId)}
          />
          <PhoneInput name="phone_number" label="Phone Number" required />
          <AddressForm mode="required" stripe={false} />
          <Button type="submit" variant="contained">
            Submit
          </Button>
        </Stack>
      </form>
    </FormProvider>
  );
}

在此示例中,CurrencySelectorPhoneInputAddressForm 组合在同一个表单中。CurrencySelector 用作与表单状态绑定的受控组件,而 PhoneInputAddressForm 是非受控组件,它们会自动将其字段和验证规则注册到 react-hook-form 的上下文中。

后续步骤

要了解每个组件的具体属性和实现细节,请浏览它们各自的文档页面。

AddressForm 开始,了解如何收集账单信息。