146 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Vue
		
	
	
| <docs>
 | |
| ---
 | |
| order: 3
 | |
| title:
 | |
|   zh-CN: ๅจๆๅขๅ่กจๅ้กน
 | |
|   en-US: Dynamic Form Item
 | |
| ---
 | |
| 
 | |
| ## zh-CN
 | |
| 
 | |
| ๅจๆๅขๅ ใๅๅฐ่กจๅ้กนใ
 | |
| 
 | |
| ## en-US
 | |
| 
 | |
| Add or remove form items dynamically.
 | |
| </docs>
 | |
| <template>
 | |
|   <a-form ref="formRef" :model="dynamicValidateForm" v-bind="formItemLayoutWithOutLabel">
 | |
|     <a-form-item
 | |
|       v-for="(domain, index) in dynamicValidateForm.domains"
 | |
|       :key="domain.key"
 | |
|       v-bind="index === 0 ? formItemLayout : {}"
 | |
|       :label="index === 0 ? 'Domains' : ''"
 | |
|       :name="['domains', index, 'value']"
 | |
|       :rules="{
 | |
|         required: true,
 | |
|         message: 'domain can not be null',
 | |
|         trigger: 'change',
 | |
|       }"
 | |
|     >
 | |
|       <a-input
 | |
|         v-model:value="domain.value"
 | |
|         placeholder="please input domain"
 | |
|         style="width: 60%; margin-right: 8px"
 | |
|       />
 | |
|       <MinusCircleOutlined
 | |
|         v-if="dynamicValidateForm.domains.length > 1"
 | |
|         class="dynamic-delete-button"
 | |
|         :disabled="dynamicValidateForm.domains.length === 1"
 | |
|         @click="removeDomain(domain)"
 | |
|       />
 | |
|     </a-form-item>
 | |
|     <a-form-item v-bind="formItemLayoutWithOutLabel">
 | |
|       <a-button type="dashed" style="width: 60%" @click="addDomain">
 | |
|         <PlusOutlined />
 | |
|         Add field
 | |
|       </a-button>
 | |
|     </a-form-item>
 | |
|     <a-form-item v-bind="formItemLayoutWithOutLabel">
 | |
|       <a-button type="primary" html-type="submit" @click="submitForm">Submit</a-button>
 | |
|       <a-button style="margin-left: 10px" @click="resetForm">Reset</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 { UnwrapRef } from 'vue';
 | |
| 
 | |
| interface Domain {
 | |
|   value: string;
 | |
|   key: number;
 | |
| }
 | |
| export default defineComponent({
 | |
|   components: {
 | |
|     MinusCircleOutlined,
 | |
|     PlusOutlined,
 | |
|   },
 | |
|   setup() {
 | |
|     const formRef = ref();
 | |
|     const formItemLayout = {
 | |
|       labelCol: {
 | |
|         xs: { span: 24 },
 | |
|         sm: { span: 4 },
 | |
|       },
 | |
|       wrapperCol: {
 | |
|         xs: { span: 24 },
 | |
|         sm: { span: 20 },
 | |
|       },
 | |
|     };
 | |
|     const formItemLayoutWithOutLabel = {
 | |
|       wrapperCol: {
 | |
|         xs: { span: 24, offset: 0 },
 | |
|         sm: { span: 20, offset: 4 },
 | |
|       },
 | |
|     };
 | |
|     const dynamicValidateForm: UnwrapRef<{ domains: Domain[] }> = reactive({
 | |
|       domains: [],
 | |
|     });
 | |
|     const submitForm = () => {
 | |
|       formRef.value
 | |
|         .validate()
 | |
|         .then(() => {
 | |
|           console.log('values', dynamicValidateForm.domains);
 | |
|         })
 | |
|         .catch(error => {
 | |
|           console.log('error', error);
 | |
|         });
 | |
|     };
 | |
|     const resetForm = () => {
 | |
|       formRef.value.resetFields();
 | |
|     };
 | |
|     const removeDomain = (item: Domain) => {
 | |
|       let index = dynamicValidateForm.domains.indexOf(item);
 | |
|       if (index !== -1) {
 | |
|         dynamicValidateForm.domains.splice(index, 1);
 | |
|       }
 | |
|     };
 | |
|     const addDomain = () => {
 | |
|       dynamicValidateForm.domains.push({
 | |
|         value: '',
 | |
|         key: Date.now(),
 | |
|       });
 | |
|     };
 | |
|     return {
 | |
|       formRef,
 | |
|       formItemLayout,
 | |
|       formItemLayoutWithOutLabel,
 | |
|       dynamicValidateForm,
 | |
|       submitForm,
 | |
|       resetForm,
 | |
|       removeDomain,
 | |
|       addDomain,
 | |
|     };
 | |
|   },
 | |
| });
 | |
| </script>
 | |
| <style>
 | |
| .dynamic-delete-button {
 | |
|   cursor: pointer;
 | |
|   position: relative;
 | |
|   top: 4px;
 | |
|   font-size: 24px;
 | |
|   color: #999;
 | |
|   transition: all 0.3s;
 | |
| }
 | |
| .dynamic-delete-button:hover {
 | |
|   color: #777;
 | |
| }
 | |
| .dynamic-delete-button[disabled] {
 | |
|   cursor: not-allowed;
 | |
|   opacity: 0.5;
 | |
| }
 | |
| </style>
 |