使用vben admin,再次封装里面的element控件时出现了一些问题。
这是原本的代码:
<ElRadioGroup
key="BarCodeTypeId"
v-model="productInfoState.productInfo.BarCodeTypeId"
@change="
(value) => {
const selected = fieldOptions.BarCodeTypeId!.find(
(item) => item.value === value,
);
productInfoState.productInfo.BarCodeTypeValue =
selected?.label || '';
}
"
>
<ElRadio
v-for="option in fieldOptions.BarCodeTypeId"
:key="option.value"
:label="option.value"
>
{{ option.label }}
</ElRadio>
</ElRadioGroup>
代码没有发生任何报错,单选框能正常使用。我将两个组件各自封装成了:
<script setup lang="ts">
import { ref, useSlots } from 'vue';
import { ElRadioGroup } from 'element-plus';
const slots = useSlots();
const elRadioGroupRef = ref<InstanceType<typeof ElRadioGroup>>();
defineExpose({
elRadioGroupRef,
});
</script>
<template>
<ElRadioGroup ref="elRadioGroupRef" v-bind="$attrs">
<template v-for="(_value, name) in slots" #[name]="scope">
<slot :name="name" v-bind="scope || {}"></slot>
</template>
</ElRadioGroup>
</template>
这时候原本代码的@change中出现报错参数“value”隐式具有“any”类型。单选框能够正常使用。怎么解决这个报错?
二编:
修改封装代码为
<script setup lang="ts">
import { ref, useSlots } from 'vue';
import { ElRadioGroup } from 'element-plus';
const emit = defineEmits<{
(e: 'change', value: boolean | number | string | undefined): void;
(e: 'update:modelValue', value: boolean | number | string | undefined): void;
}>();
const slots = useSlots();
const elRadioGroupRef = ref<InstanceType<typeof ElRadioGroup>>();
defineExpose({
elRadioGroupRef,
});
</script>
<template>
<ElRadioGroup
ref="elRadioGroupRef"
v-bind="$attrs"
@change="
(val: string | number | boolean | undefined) => emit('change', val)
"
@update:model-value="
(val: string | number | boolean | undefined) =>
emit('update:modelValue', val)
"
>
<template v-for="(_value, name) in slots" #[name]="scope">
<slot :name="name" v-bind="scope || {}"></slot>
</template>
</ElRadioGroup>
</template>
后,不再报错。我想知道为什么要转发两个事件而不是只转发change才能实现不报错