110 lines
2.5 KiB
Vue
110 lines
2.5 KiB
Vue
|
<docs>
|
||
|
---
|
||
|
order: 4.1
|
||
|
title:
|
||
|
zh-CN: 动态增减嵌套字段
|
||
|
en-US: Dynamic Form nest Items
|
||
|
---
|
||
|
|
||
|
## zh-CN
|
||
|
|
||
|
通过数组 name 绑定嵌套字段
|
||
|
|
||
|
## en-US
|
||
|
|
||
|
Bind nested fields by array name.
|
||
|
|
||
|
</docs>
|
||
|
<template>
|
||
|
<a-form
|
||
|
ref="formRef"
|
||
|
name="dynamic_form_nest_item"
|
||
|
:model="dynamicValidateForm"
|
||
|
@finish="onFinish"
|
||
|
>
|
||
|
<a-space
|
||
|
v-for="(user, index) in dynamicValidateForm.users"
|
||
|
:key="user.id"
|
||
|
style="display: flex; margin-bottom: 8px"
|
||
|
align="baseline"
|
||
|
>
|
||
|
<a-form-item
|
||
|
:name="['users', index, 'first']"
|
||
|
:rules="{
|
||
|
required: true,
|
||
|
message: 'Missing first name',
|
||
|
}"
|
||
|
>
|
||
|
<a-input v-model:value="user.first" placeholder="First Name" />
|
||
|
</a-form-item>
|
||
|
<a-form-item
|
||
|
:name="['users', index, 'last']"
|
||
|
:rules="{
|
||
|
required: true,
|
||
|
message: 'Missing last name',
|
||
|
}"
|
||
|
>
|
||
|
<a-input v-model:value="user.last" placeholder="Last Name" />
|
||
|
</a-form-item>
|
||
|
<MinusCircleOutlined @click="removeUser(user)" />
|
||
|
</a-space>
|
||
|
<a-form-item>
|
||
|
<a-button type="dashed" block @click="addUser">
|
||
|
<PlusOutlined />
|
||
|
Add user
|
||
|
</a-button>
|
||
|
</a-form-item>
|
||
|
<a-form-item>
|
||
|
<a-button type="primary" html-type="submit">Submit</a-button>
|
||
|
</a-form-item>
|
||
|
</a-form>
|
||
|
</template>
|
||
|
|
||
|
<script lang="ts">
|
||
|
import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons-vue';
|
||
|
import { defineComponent, reactive, ref } from 'vue';
|
||
|
import type { FormInstance } from 'ant-design-vue';
|
||
|
|
||
|
interface User {
|
||
|
first: string;
|
||
|
last: string;
|
||
|
id: number;
|
||
|
}
|
||
|
export default defineComponent({
|
||
|
components: {
|
||
|
MinusCircleOutlined,
|
||
|
PlusOutlined,
|
||
|
},
|
||
|
setup() {
|
||
|
const formRef = ref<FormInstance>();
|
||
|
const dynamicValidateForm = reactive<{ users: User[] }>({
|
||
|
users: [],
|
||
|
});
|
||
|
const removeUser = (item: User) => {
|
||
|
let index = dynamicValidateForm.users.indexOf(item);
|
||
|
if (index !== -1) {
|
||
|
dynamicValidateForm.users.splice(index, 1);
|
||
|
}
|
||
|
};
|
||
|
const addUser = () => {
|
||
|
dynamicValidateForm.users.push({
|
||
|
first: '',
|
||
|
last: '',
|
||
|
id: Date.now(),
|
||
|
});
|
||
|
};
|
||
|
const onFinish = values => {
|
||
|
console.log('Received values of form:', values);
|
||
|
console.log('dynamicValidateForm.users:', dynamicValidateForm.users);
|
||
|
};
|
||
|
return {
|
||
|
formRef,
|
||
|
dynamicValidateForm,
|
||
|
onFinish,
|
||
|
removeUser,
|
||
|
addUser,
|
||
|
};
|
||
|
},
|
||
|
});
|
||
|
</script>
|