背景:最近遇到⼀个需求,页⾯有新增和编辑两个功能,但是编辑的时候只能添加新的选项,不可删除已有的选项。
效果图如下:
分析:
禁止删除无非就是要做到两个点:
- el-tag 已选择的不可删除
- el-option 已选择的不可操作
解决:
第一步:全局自定义一个指令
// directive.js (和main.js同级)
import Vue from 'vue'
Vue.directive('defaultSelect', {
componentUpdated(el, bindings) {
const [defaultValues] = bindings.value
const dealStyle = function (tags) {
// 因为不可删除原有值,所以原有值的index是不会变的,也就是将前n个tag的close隐藏掉即可。n即已有值的长度defaultValues.length
tags.forEach((el, index) => {
if (
index <= defaultValues.length - 1 &&
![...el.classList].includes('select-tag-close-none')
) {
el.style.display = 'none' // close 图标隐藏掉
}
})
}
// 设置样式隐藏close icon
const tags = el.querySelectorAll('.el-tag__close')
if (tags.length === 0) {
// 初始化tags为空处理
setTimeout(() => {
const tagTemp = el.querySelectorAll('.el-tag__close')
dealStyle(tagTemp)
})
} else {
dealStyle(tags)
}
}
})
第二步:在main.js导入
import './directives'
第三步:使用
v-default-select=“[enterpriseIds]” 设置已选择的不可删除
:disabled=“enterpriseIds.includes(item.id)” 设置已选择的不可操作
<el-select
style="width: 100%"
multiple
:disabled="$route.query.enterpriseId"
v-model='form.enterpriseIds'
placeholder='请选择'
v-default-select="[enterpriseIds]"
>
<el-option
v-for='item in enterpriseList'
:disabled="enterpriseIds.includes(item.id)"
:label='item.name'
:value='item.id'
:key='item.id'
/>
</el-select>
data(){
return {
form:{},
enterpriseList:[],
enterpriseIds:[] // 已选择的值,打开进入编辑页面时赋值即可
}
}
el-cascader
已选项禁止删除只需要在选择的最后一项加上disabled:true就能实现了。在options数据源上符合条件的项加disabled:true
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/64738.html