doc: add Customized Form Controls demo
parent
b22c654bae
commit
59e0985f5d
|
@ -0,0 +1,57 @@
|
||||||
|
<docs>
|
||||||
|
---
|
||||||
|
order: 6.1
|
||||||
|
title:
|
||||||
|
zh-CN: 自定义表单控件
|
||||||
|
en-US: Customized Form Controls
|
||||||
|
---
|
||||||
|
|
||||||
|
## zh-CN
|
||||||
|
|
||||||
|
自定义或第三方的表单控件,也可以与 Form 组件一起使用。只要该组件注入 `useInjectFormItemContext` 并调用相应方法。
|
||||||
|
|
||||||
|
## en-US
|
||||||
|
|
||||||
|
Customized or third-party form controls can be used in Form, too.
|
||||||
|
|
||||||
|
Controls must injects `useInjectFormItemContext` and calls the corresponding method.
|
||||||
|
</docs>
|
||||||
|
<template>
|
||||||
|
<a-form name="customized_form_controls" layout="inline" :model="formState" @finish="onFinish">
|
||||||
|
<a-form-item name="price" label="Price" :rules="[{ validator: checkPrice }]">
|
||||||
|
<PriceInput v-model:value="formState.price" />
|
||||||
|
</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 { defineComponent, reactive } from 'vue';
|
||||||
|
import PriceInput from './price-input.vue';
|
||||||
|
import type { Currency } from './price-input.vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
PriceInput,
|
||||||
|
},
|
||||||
|
setup() {
|
||||||
|
const formState = reactive({
|
||||||
|
price: {
|
||||||
|
number: 0,
|
||||||
|
currency: 'rmb' as Currency,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const onFinish = (values: any) => {
|
||||||
|
console.log('Received values from form: ', values);
|
||||||
|
};
|
||||||
|
const checkPrice = (_: any, value: { number: number }) => {
|
||||||
|
if (value.number > 0) {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
return Promise.reject(new Error('Price must be greater than zero!'));
|
||||||
|
};
|
||||||
|
return { onFinish, formState, checkPrice };
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -8,6 +8,7 @@
|
||||||
<CustomValidation />
|
<CustomValidation />
|
||||||
<DynamicFormItem />
|
<DynamicFormItem />
|
||||||
<NestedForm />
|
<NestedForm />
|
||||||
|
<CustomizedFormControls />
|
||||||
<UseFormBasic />
|
<UseFormBasic />
|
||||||
<UseFormNested />
|
<UseFormNested />
|
||||||
<UseFormTrigger />
|
<UseFormTrigger />
|
||||||
|
@ -28,6 +29,7 @@ import UseFormNested from './useForm-nested.vue';
|
||||||
import UseFormTrigger from './useForm-trigger.vue';
|
import UseFormTrigger from './useForm-trigger.vue';
|
||||||
import UseFormMerge from './useForm-merge.vue';
|
import UseFormMerge from './useForm-merge.vue';
|
||||||
import LableWidth from './lable-width.vue';
|
import LableWidth from './lable-width.vue';
|
||||||
|
import CustomizedFormControls from './customized-form-controls.vue';
|
||||||
import CN from '../index.zh-CN.md';
|
import CN from '../index.zh-CN.md';
|
||||||
import US from '../index.en-US.md';
|
import US from '../index.en-US.md';
|
||||||
|
|
||||||
|
@ -47,6 +49,7 @@ export default defineComponent({
|
||||||
UseFormTrigger,
|
UseFormTrigger,
|
||||||
UseFormMerge,
|
UseFormMerge,
|
||||||
LableWidth,
|
LableWidth,
|
||||||
|
CustomizedFormControls,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
<template>
|
||||||
|
<span>
|
||||||
|
<a-input type="text" :value="value.number" style="width: 100px" @change="onNumberChange" />
|
||||||
|
<a-select
|
||||||
|
:value="value.currency"
|
||||||
|
style="width: 80px; margin: 0 8px"
|
||||||
|
:options="[
|
||||||
|
{ value: 'rmb', label: 'RMB' },
|
||||||
|
{ value: 'dollar', label: 'Dollar' },
|
||||||
|
]"
|
||||||
|
@change="onCurrencyChange"
|
||||||
|
></a-select>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import type { PropType } from 'vue';
|
||||||
|
import { Form } from 'ant-design-vue';
|
||||||
|
|
||||||
|
export type Currency = 'rmb' | 'dollar';
|
||||||
|
|
||||||
|
interface PriceValue {
|
||||||
|
number: number;
|
||||||
|
currency: Currency;
|
||||||
|
}
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
value: { type: Object as PropType<PriceValue>, isRequired: true },
|
||||||
|
},
|
||||||
|
emits: ['update:value'],
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const formItemContext = Form.useInjectFormItemContext();
|
||||||
|
const triggerChange = (changedValue: { number?: number; currency?: Currency }) => {
|
||||||
|
emit('update:value', { ...props.value, ...changedValue });
|
||||||
|
formItemContext.onFieldChange();
|
||||||
|
};
|
||||||
|
const onNumberChange = (e: InputEvent) => {
|
||||||
|
const newNumber = parseInt((e.target as any).value || '0', 10);
|
||||||
|
triggerChange({ number: newNumber });
|
||||||
|
};
|
||||||
|
const onCurrencyChange = (newCurrency: Currency) => {
|
||||||
|
triggerChange({ currency: newCurrency });
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
onNumberChange,
|
||||||
|
onCurrencyChange,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
Loading…
Reference in New Issue