我封装了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>
的代码只写一遍?
还有就是,组件这样写有没有不合理的地方。
欢迎指正,谢谢。
el-form-item
没有必要放到封装好的 tag-select
组件中。
做好功能单一,你的 tag-select
是标签选择器,不是标签选择器表单项。
哪个地方用到了表单再在标签器外面用 el-form-item
包裹。
观察form-item
的渲染方式,发现加了label
会渲染出label dom
label
值为空则不会渲染,但是出多出margin-left
的多余样式
所以针对你的需求可以这样修改:
<el-form-item :label="showLabel ? '标签' : '' " :prop="prop"><!-- 不使用showLabel&&'标签' 是因为label接受的是string类型,showLabel为false的时候值会变为Boolean类型 -->
然后再加点样式处理下,这里注意不要污染全局,加个父级或者scoped
。其他的样式可能需要再调试处理下
.el-form-item__content {margin-left: 0}
组件的设计需要保持单一原则,如果为了展示2个样式,可以在调用的地方去处理,而不是在组件内部去处理业务
是不是把这一块单独封装成组件 tag-select
然后这块封装成另一个组件
<el-form-item label="标签" :prop="prop">
<tag-select v-model="tag_ids" />
</el-form-item>
---> <tag-select-item/>
两个组件的使用场景不一致 tag-select-item 只会在el-form表单下才用 tag-select则可以在不同地方用 在不同场景用不同组件。
个人看法 楼主根据实际情况考虑
1.html 2.main.js 3.axios.js
我封装了element-plus中的datepicker的组件,代码如下: 使用组件: 现在的结果是点击后没反应,change事件没有触发
使用 vite 打包组件库,在新的项目中使用时报错 下面是打包后的产物 pe 和 dn 找不到导致项目启动时就报错, 手动再新起一个别名时会结局此问题 vite.config.ts 配置如下 请问这个问题该怎么解决
我在objectSpanMethod中写逻辑,写了半天写不成,最关键的是需要合并的行个数不定,1,2,3,4,。。行合并都有可能。
我有一个来自服务器的响应,我想把它放到列表中。但是当列表为空时,我需要隐藏这个div容器。例如,如果不在数组中-我想隐藏div。但是我想在ng之后使用bird重复,所以我不能使在上。我可以检查li是否为空,然后隐藏div吗? 普朗克例子 AngularJS ng-重复处理空列表大小写-这是不一样的。如果li是空的,我不想隐藏li,我想在li是空的时候隐藏父元素h1。
我用的vue3 elment plus框架,有没有方便的方法做到下面的效果,就是高度显示2个数据的不同?