Skip to content

Commit ea0d959

Browse files
authored
feat(Form): 集成Checkbox,增加disabled&size&校验 (DevCloudFE#829)
1 parent 7aa3b26 commit ea0d959

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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 {
34
CheckboxProps,
45
UseCheckboxFn,
@@ -9,6 +10,8 @@ import {
910
} from './checkbox-types';
1011

1112
export function useCheckbox(props: CheckboxProps, ctx: SetupContext): UseCheckboxFn {
13+
const formContext = inject(FORM_TOKEN, undefined);
14+
const formItemContext = inject(FORM_ITEM_TOKEN, undefined);
1215
const checkboxGroupConf = inject(checkboxGroupInjectionKey, null);
1316

1417
const isChecked = computed(() => props.checked || props.modelValue);
@@ -20,7 +23,7 @@ export function useCheckbox(props: CheckboxProps, ctx: SetupContext): UseCheckbo
2023
return !!max && checkboxGroupConf?.modelValue.value.length >= max && !mergedChecked.value;
2124
});
2225
const mergedDisabled = computed(() => {
23-
return checkboxGroupConf?.disabled.value || props.disabled || isLimitDisabled.value;
26+
return checkboxGroupConf?.disabled.value || props.disabled || formContext?.disabled || isLimitDisabled.value;
2427
});
2528
const mergedIsShowTitle = computed(() => {
2629
return checkboxGroupConf?.isShowTitle.value ?? props.isShowTitle;
@@ -59,8 +62,14 @@ export function useCheckbox(props: CheckboxProps, ctx: SetupContext): UseCheckbo
5962
const handleClick = () => {
6063
canChange(!isChecked.value, props.label).then((res) => res && toggle());
6164
};
62-
const size = computed(() => checkboxGroupConf?.size.value ?? props.size);
65+
const size = computed(() => formContext?.size || checkboxGroupConf?.size.value || props.size);
6366
const border = computed(() => checkboxGroupConf?.border.value ?? props.border);
67+
watch(
68+
() => props.modelValue,
69+
() => {
70+
formItemContext?.validate('change').catch((err) => console.warn(err));
71+
}
72+
);
6473
return {
6574
mergedChecked,
6675
mergedDisabled,
@@ -76,6 +85,7 @@ export function useCheckbox(props: CheckboxProps, ctx: SetupContext): UseCheckbo
7685
}
7786

7887
export function useCheckboxGroup(props: CheckboxGroupProps, ctx: SetupContext): UseCheckboxGroupFn {
88+
const formItemContext = inject(FORM_ITEM_TOKEN, undefined);
7989
const valList = toRef(props, 'modelValue');
8090

8191
const defaultOpt = {
@@ -117,6 +127,13 @@ export function useCheckboxGroup(props: CheckboxGroupProps, ctx: SetupContext):
117127
return valList.value.some((item) => item.value === itemVal);
118128
}
119129
};
130+
watch(
131+
() => props.modelValue,
132+
() => {
133+
formItemContext?.validate('change').catch((err) => console.warn(err));
134+
},
135+
{ deep: true }
136+
);
120137

121138
provide(checkboxGroupInjectionKey, {
122139
disabled: toRef(props, 'disabled'),

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,17 @@ 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="executionDay" label="Execution day">
452+
<d-checkbox-group v-model="formData.executionDay" label="Execution day" direction="row">
453+
<d-checkbox label="Mon" value="Mon" />
454+
<d-checkbox label="Tue" value="Tue" />
455+
<d-checkbox label="Wed" value="Wed" />
456+
<d-checkbox label="Thur" value="Thur" />
457+
<d-checkbox label="Fri" value="Fri" />
458+
<d-checkbox label="Sat" value="Sat" />
459+
<d-checkbox label="Sun" value="Sun" />
460+
</d-checkbox-group>
461+
</d-form-item>
451462
<d-form-operation class="form-operation-wrap">
452463
<d-button variant="solid" @click="onClick">提交</d-button>
453464
<d-button @click="onClear">清除校验结果</d-button>
@@ -457,7 +468,7 @@ export default defineComponent({
457468
</template>
458469
459470
<script>
460-
import { defineComponent, reactive, ref } from 'vue';
471+
import { defineComponent, reactive, ref, watch } from 'vue';
461472
462473
export default defineComponent({
463474
setup() {
@@ -466,6 +477,7 @@ export default defineComponent({
466477
username: '',
467478
userInfo: '',
468479
age: '',
480+
executionDay: [],
469481
});
470482
const checkAge = (rule, value, callback) => {
471483
if (!value) {
@@ -483,6 +495,7 @@ export default defineComponent({
483495
username: [{ min: 3, max: 6, message: '用户名需不小于3个字符,不大于6个字符', trigger: 'change' }],
484496
userInfo: [{ required: true, message: '用户信息不能为空', trigger: 'blur' }],
485497
age: [{ validator: checkAge }],
498+
executionDay: [{ type: 'array', required: true, message: '请至少选择一个执行时间', trigger: 'change' }],
486499
};
487500
488501
const onClick = () => {

0 commit comments

Comments
 (0)