我封装了element-plus中的form的组件,代码如下:
// TagSelectItem.vue
<script setup lang="ts">
import { onMounted, ref } from "vue";
import { TagApi } from "@/api/project";
import { TagGroupApiProps } from "@/types/project";
const props = defineProps({
modelValue: {
required: true,
type: [Number, String, Array<Number>, Array<String>]
},
tagLists: { required: false, type: Array<TagGroupApiProps>, default: [] },
multiple: { required: false, type: Boolean, default: true },
showLabel: { required: false, type: Boolean, default: true },
prop: { required: false, type: String, default: "tag_ids" },
maxCollapseTags: { required: false, type: Number, default: 7 }
});
const emits = defineEmits(["update:modelValue", "click"]);
const select = (value: number[]) => {
emits("update:modelValue", value);
emits("click", value);
};
const lists = ref<TagGroupApiProps[]>([]);
onMounted(async () => {
if (props.tagLists.length !== 0) {
lists.value = props.tagLists;
} else {
lists.value = await TagApi.select();
}
});
</script>
<template>
<el-form-item v-if="showLabel" label="标签" :prop="prop">
<el-select
:model-value="modelValue"
class="w-full"
filterable
:multiple="multiple"
clearable
collapse-tags
collapse-tags-tooltip
:max-collapse-tags="maxCollapseTags"
placeholder="请选择标签,输入内容可筛选"
@change="select"
>
<el-option
v-for="item in lists"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-select
v-else
:model-value="modelValue"
class="w-full"
filterable
:multiple="multiple"
clearable
collapse-tags
collapse-tags-tooltip
:max-collapse-tags="maxCollapseTags"
placeholder="请选择标签,输入内容可筛选"
@change="select"
>
<el-option
v-for="item in lists"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</template>
使用组件:
默认是展示标签
<tag-select-item v-model="tag_ids" />
通过show-label 隐藏 el-form-item
<tag-select-item v-model="tag_ids" :show-label="false" />
为了不显示 el-form-item
,<el-select>
的代码写了一遍,又复制了一遍。
请教下有没有啥好的办法,可以控制 el-form-item
的隐藏与展示,同时让<el-select>
的代码只写一遍?
还有就是,组件这样写有没有不合理的地方。
欢迎指正,谢谢。
是不是把这一块单独封装成组件 tag-select
然后这块封装成另一个组件
<el-form-item label="标签" :prop="prop">
</el-form-item>
---> <tag-select-item/>
两个组件的使用场景不一致 tag-select-item 只会在el-form表单下才用 tag-select则可以在不同地方用 在不同场景用不同组件。
个人看法 楼主根据实际情况考虑