Skip to content

Commit 9a9940d

Browse files
authored
feat(Form): 集成Radio,增加disabled&size&校验 (DevCloudFE#831)
1 parent 9eac225 commit 9a9940d

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

packages/devui-vue/devui/radio/src/use-radio.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
import { computed, inject, SetupContext, toRef, provide } from 'vue';
1+
import { computed, inject, SetupContext, toRef, provide, watch } from 'vue';
2+
import { FORM_TOKEN, FORM_ITEM_TOKEN } from '../../form';
23
import { RadioProps, RadioGroupProps, radioGroupInjectionKey, UseRadioFn, valueTypes, UseRadioButtonFn } from './radio-types';
34

45
export function useRadio(props: RadioProps, ctx: SetupContext): UseRadioFn {
6+
const formContext = inject(FORM_TOKEN, undefined);
7+
const formItemContext = inject(FORM_ITEM_TOKEN, undefined);
58
const radioGroupConf = inject(radioGroupInjectionKey, null);
69

710
/** 是否禁用 */
811
const isDisabled = computed(() => {
9-
return props.disabled || radioGroupConf?.disabled.value;
12+
return formContext?.disabled || props.disabled || radioGroupConf?.disabled.value;
1013
});
1114
/** 判断是否勾选 */
1215
const isChecked = computed(() => {
@@ -57,8 +60,14 @@ export function useRadio(props: RadioProps, ctx: SetupContext): UseRadioFn {
5760
});
5861

5962
const size = computed(() => {
60-
return radioGroupConf?.size.value || props.size;
63+
return formContext?.size || radioGroupConf?.size.value || props.size;
6164
});
65+
watch(
66+
() => props.modelValue,
67+
() => {
68+
formItemContext?.validate('change').catch((err) => console.warn(err));
69+
}
70+
);
6271
return {
6372
isChecked,
6473
radioName,
@@ -70,12 +79,20 @@ export function useRadio(props: RadioProps, ctx: SetupContext): UseRadioFn {
7079
}
7180

7281
export function useRadioGroup(props: RadioGroupProps, ctx: SetupContext): void {
82+
const formItemContext = inject(FORM_ITEM_TOKEN, undefined);
7383
/** change 事件 */
7484
const emitChange = (radioValue: valueTypes) => {
7585
ctx.emit('update:modelValue', radioValue);
7686
ctx.emit('change', radioValue);
7787
};
7888

89+
watch(
90+
() => props.modelValue,
91+
() => {
92+
formItemContext?.validate('change').catch((err) => console.warn(err));
93+
}
94+
);
95+
7996
// 注入给子组件
8097
provide(radioGroupInjectionKey, {
8198
modelValue: toRef(props, 'modelValue'),

packages/devui-vue/docs/components/form/index.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ export default defineComponent({
433433

434434
```vue
435435
<template>
436-
<d-form ref="formRef" layout="vertical" :data="formData" :rules="rules" show-feedback>
436+
<d-form ref="formRef" layout="vertical" :data="formData" :rules="rules" show-feedback message-type="text">
437437
<d-form-item
438438
field="username"
439439
:rules="[{ required: true, message: '用户名不能为空', trigger: 'blur' }]"
@@ -448,6 +448,13 @@ export default defineComponent({
448448
<d-form-item field="age" label="年龄">
449449
<d-input v-model="formData.age" />
450450
</d-form-item>
451+
<d-form-item field="radio" label="Radio">
452+
<d-radio-group direction="row" v-model="formData.radio">
453+
<d-radio value="0">Manual execution</d-radio>
454+
<d-radio value="1">Daily execution</d-radio>
455+
<d-radio value="2">Weekly execution</d-radio>
456+
</d-radio-group>
457+
</d-form-item>
451458
<d-form-item field="executionDay" label="Execution day">
452459
<d-checkbox-group v-model="formData.executionDay" label="Execution day" direction="row">
453460
<d-checkbox label="Mon" value="Mon" />
@@ -478,6 +485,7 @@ export default defineComponent({
478485
userInfo: '',
479486
age: '',
480487
executionDay: [],
488+
radio: '',
481489
});
482490
const checkAge = (rule, value, callback) => {
483491
if (!value) {
@@ -496,6 +504,7 @@ export default defineComponent({
496504
userInfo: [{ required: true, message: '用户信息不能为空', trigger: 'blur' }],
497505
age: [{ validator: checkAge }],
498506
executionDay: [{ type: 'array', required: true, message: '请至少选择一个执行时间', trigger: 'change' }],
507+
radio: [{ required: true, message: '请选择', trigger: 'change' }],
499508
};
500509
501510
const onClick = () => {

0 commit comments

Comments
 (0)