Skip to content

Commit 59e0985

Browse files
committed
doc: add Customized Form Controls demo
1 parent b22c654 commit 59e0985

File tree

3 files changed

+112
-0
lines changed

3 files changed

+112
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<docs>
2+
---
3+
order: 6.1
4+
title:
5+
zh-CN: 自定义表单控件
6+
en-US: Customized Form Controls
7+
---
8+
9+
## zh-CN
10+
11+
自定义或第三方的表单控件,也可以与 Form 组件一起使用。只要该组件注入 `useInjectFormItemContext` 并调用相应方法。
12+
13+
## en-US
14+
15+
Customized or third-party form controls can be used in Form, too.
16+
17+
Controls must injects `useInjectFormItemContext` and calls the corresponding method.
18+
</docs>
19+
<template>
20+
<a-form name="customized_form_controls" layout="inline" :model="formState" @finish="onFinish">
21+
<a-form-item name="price" label="Price" :rules="[{ validator: checkPrice }]">
22+
<PriceInput v-model:value="formState.price" />
23+
</a-form-item>
24+
<a-form-item>
25+
<a-button type="primary" html-type="submit">Submit</a-button>
26+
</a-form-item>
27+
</a-form>
28+
</template>
29+
<script lang="ts">
30+
import { defineComponent, reactive } from 'vue';
31+
import PriceInput from './price-input.vue';
32+
import type { Currency } from './price-input.vue';
33+
34+
export default defineComponent({
35+
components: {
36+
PriceInput,
37+
},
38+
setup() {
39+
const formState = reactive({
40+
price: {
41+
number: 0,
42+
currency: 'rmb' as Currency,
43+
},
44+
});
45+
const onFinish = (values: any) => {
46+
console.log('Received values from form: ', values);
47+
};
48+
const checkPrice = (_: any, value: { number: number }) => {
49+
if (value.number > 0) {
50+
return Promise.resolve();
51+
}
52+
return Promise.reject(new Error('Price must be greater than zero!'));
53+
};
54+
return { onFinish, formState, checkPrice };
55+
},
56+
});
57+
</script>

components/form/demo/index.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<CustomValidation />
99
<DynamicFormItem />
1010
<NestedForm />
11+
<CustomizedFormControls />
1112
<UseFormBasic />
1213
<UseFormNested />
1314
<UseFormTrigger />
@@ -28,6 +29,7 @@ import UseFormNested from './useForm-nested.vue';
2829
import UseFormTrigger from './useForm-trigger.vue';
2930
import UseFormMerge from './useForm-merge.vue';
3031
import LableWidth from './lable-width.vue';
32+
import CustomizedFormControls from './customized-form-controls.vue';
3133
import CN from '../index.zh-CN.md';
3234
import US from '../index.en-US.md';
3335
@@ -47,6 +49,7 @@ export default defineComponent({
4749
UseFormTrigger,
4850
UseFormMerge,
4951
LableWidth,
52+
CustomizedFormControls,
5053
},
5154
});
5255
</script>

components/form/demo/price-input.vue

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<template>
2+
<span>
3+
<a-input type="text" :value="value.number" style="width: 100px" @change="onNumberChange" />
4+
<a-select
5+
:value="value.currency"
6+
style="width: 80px; margin: 0 8px"
7+
:options="[
8+
{ value: 'rmb', label: 'RMB' },
9+
{ value: 'dollar', label: 'Dollar' },
10+
]"
11+
@change="onCurrencyChange"
12+
></a-select>
13+
</span>
14+
</template>
15+
16+
<script lang="ts">
17+
import { defineComponent } from 'vue';
18+
import type { PropType } from 'vue';
19+
import { Form } from 'ant-design-vue';
20+
21+
export type Currency = 'rmb' | 'dollar';
22+
23+
interface PriceValue {
24+
number: number;
25+
currency: Currency;
26+
}
27+
export default defineComponent({
28+
props: {
29+
value: { type: Object as PropType<PriceValue>, isRequired: true },
30+
},
31+
emits: ['update:value'],
32+
setup(props, { emit }) {
33+
const formItemContext = Form.useInjectFormItemContext();
34+
const triggerChange = (changedValue: { number?: number; currency?: Currency }) => {
35+
emit('update:value', { ...props.value, ...changedValue });
36+
formItemContext.onFieldChange();
37+
};
38+
const onNumberChange = (e: InputEvent) => {
39+
const newNumber = parseInt((e.target as any).value || '0', 10);
40+
triggerChange({ number: newNumber });
41+
};
42+
const onCurrencyChange = (newCurrency: Currency) => {
43+
triggerChange({ currency: newCurrency });
44+
};
45+
46+
return {
47+
onNumberChange,
48+
onCurrencyChange,
49+
};
50+
},
51+
});
52+
</script>

0 commit comments

Comments
 (0)