Docs

Documentation versions (currently viewingVaadin 24)
Documentation translations (currently viewingChinese)

此页面为官方文档(http://vaadin.com/docs)的机器翻译版本。页面内容可能存在错误、不准确或误述。Vaadin 不保证翻译的准确性、可靠性或时效性。

绑定数组

使用表单绑定 API 操作数组。

本页面解释了在使用表单绑定构建TypeScript表单视图时如何处理数组。设想有一个具有如下结构的Java Bean的表单:

Source code
Group.java
/**
 * 带有数组字段的示例bean
 */
public class Group {
    ...

    public Person[] getPeople() {
        ...
    }

    public void setPeople(Person[] people) {
        ...
    }
}

重复数组项模板

处理数组时常见的需求是遍历数组项并为每个数组项实例化模板。通过表单绑定,数组模型可以被迭代。您可以使用 useFormArrayPart 钩子来遍历模型,以及获取和设置数组的值。

由于您还需使用 useFormPart 钩子为每个项获取 field 函数,因此您需要创建一个用于数组项模板的组件。

Source code
tsx
import { useForm, useFormArrayPart, useFormPart } from '@vaadin/hilla-react-form';
import { NumberField, TextField } from '@vaadin/react-components';
import GroupModel from '.../GroupModel';
import PersonModel from '.../PersonModel';

function PersonForm({ model }: { model: PersonModel }) {
    const { field } = useFormPart(model);

    return (
        <div>
            <TextField {...field(model.fullName)} />
            <NumberField {...field(model.age)} />
        </div>
    );
}

export default function GroupFormView() {
    const { field, model } = useForm(GroupModel);
    const { items} = useFormArrayPart(model.people);

    return (
        <>
            <TextField {...field(model.name)} />
            {items.map((person, index) => (
                <PersonForm key={index} model={person} />
            ))}
        </>
    );
}

添加和删除数组项

您可以使用 useFormArrayPart 提供的 valuesetValue 函数修改数组值。

Source code
tsx
import { useForm, useFormArrayPart, useFormPart } from '@vaadin/hilla-react-form';
import { Button, NumberField, TextField } from '@vaadin/react-components';
import GroupModel from '.../GroupModel';
import PersonModel from '.../PersonModel';

function PersonForm({ model, remove }: { model: PersonModel, remove: () => void }) {
    const { field } = useFormPart(model);

    return (
        <div>
            <TextField {...field(model.fullName)} />
            <NumberField {...field(model.age)} />
            <Button onClick={remove}>Remove</Button>
        </div>
    );
}

export default function GroupFormView() {
    const { field, model } = useForm(GroupModel);
    const { items, value, setValue } = useFormArrayPart(model.people);

    return (
        <>
            <TextField {...field(model.name)} />
            {items.map((person, index) => (
                <PersonForm key={index} model={person} remove={() => setValue(value!.filter((_, i) => i !== index))} />
            ))}
            <Button onClick={() => setValue([...(value ?? []), PersonModel.createEmptyValue()])}>Add person</Button>
        </>
    );
}