el select 清空_解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题

本文探讨了Element UI中el-select组件实现特定选项不可删除的方法。通过四种不同方案的比较,最终采用自定义指令方式,巧妙地隐藏了不可删除项的关闭图标。

这是一个项目中常见的需求,el-select 为下拉多选,默认值不可删除,或者指定值不可删除。

实现效果:

el-select 如下源码中 tag closable 属性为 el-select 的 disabled 属性,所有明显不支持。

解决思路(从el-select 的角度来考虑,其他组件组合的情况暂不考虑)

想要实现某些选项是不删除,1、需要tag 不可删除,2、options 不可选择

options 不可选择很好实现,只需要给一个disabled属性。tag 不可删除才是关键。下面是我几种解决思路。

1、 watch 进行监听,当操作不可删除的选项时,el-select 绑定的值中 将之前删除的选项重新添加到原来的位置。达到不可删除的效果。(这种方法虽然可以实现,但是tag上还是会有 “x” 会给用户一种误导)

2、使用样式,定位到 tag中,将icon “x” 设置 display:none; 将关闭 按钮隐藏,达到不可删除的效果。

3、复制一份 element-ui 中 el-select 源码 进行少量的修改,给 tag 添加一个 closagle 的属性。达到可控的效果。(这种方式增加了开发维护成本,当项目中 element-ui 升级版本的时候,需要重新对源码赋值一份进行修改)

4、使用 derictive 给 element-ui 中 tag 添加样式,实际上是对思路二的一种实现。

思路是这么一个思路,也对思路1和4进行了实现。但是综合考虑下,还是针对思路4做下记录,感觉有一点点复用意义。其它的参考价值不大。代码如下定义了一个全局的指令,也可以定义在组件里面。

// index.vue

v-for="(item, index) in abilityOptions"

:key="index"

:label="`${item.abilityNameZh}(${item.abilityId})`"

:disabled="item.required === 1"

:value="item.abilityId">

// main.js

Vue.directive('defaultSelect', {

componentUpdated (el, bindings, vnode) {

// values v-model 绑定值

// options 下拉选项

// prop 对应 options 中 的 value 属性

// defaultProp 默认值判断属性

// defaultValue 默认值判断值

const [values, options, prop, defaultProp, defaultValue] = bindings.value

// 需要隐藏的标签索引

const indexs = []

const tempData = values.map(a => options.find(op => op[prop] === a))

tempData.forEach((a, index) => {

if (a[defaultProp] === defaultValue) indexs.push(index)

})

const dealStyle = function (tags) {

tags.forEach((el, index) => {

if (indexs.includes(index) && ![...el.classList].includes('select-tag-close-none')) {

el.classList.add('none')

}

})

}

// 设置样式 隐藏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)

}

}

})

// style.css

.none { display: none; }

补充知识:vue+elementUI+select 选中多个值,我要删除其中的一两个 方法如下

我就废话不多说了,大家还是直接看代码吧~

multiple filterable

allow-create default-first-option

@remove-tag='removeTag'

v-model="ruleForm.module3" placeholder="请选择权限分类" style="width: 240px">

methods:{

removeTag(key){

console.log(key);//获取option中item

}

}

以上这篇解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

<think>我们面对的问题是:在Element UI(或Element Plus)的el-dialog对话框中的form表单,必选的select组件(el-select)在初次打开对话框会显示红色验证提示框(可能由于required属性触发的浏览器验证或Element的表单验证)。我们希望初次打开不显示这个红色提示。 根据Element UI的表单验证机制,表单在打开可能会立即触发验证(因为required为true且初始值可能为空)。解决思路是: 1. 避免在打开对话框立即触发表单验证(即延迟验证机)。 2. 重置表单的验证状态(清除错误提示)。 具体步骤(结合Element UI): 步骤1:在el-form上设置`:model`和`rules`(规则),并为el-select设置`prop`和`required`规则(或直接在规则中定义required)。 步骤2:在打开对话框,重置表单的验证状态(使用this.$refs.form.resetFields()?注意:resetFields会将表单字段重置为初始值,并移除验证结果。但初始值可能为空,所以重置后可能还是会显示错误?) 然而,我们并不希望在打开对话框就触发验证,所以需要控制验证的触发机。 方法1:利用Element UI的validate-on-rule-change属性 可以在el-form上设置`:validate-on-rule-change="false"`,这样在规则改变不会触发表单验证。 方法2:在打开对话框,先重置表单(包括清除验证状态),然后设置表单数据(比如select的初始值)为空,但注意这样可能会触发验证。因此,我们需要在设置完数据后再清除验证状态。 方法3(推荐):在对话框打开事件中,先重置表单(清除验证状态),然后通过设置表单数据(如果有初始数据则设置,没有则保持空)后,再调用清除验证的方法。 具体操作: 1. 在el-dialog上监听`open`事件(或`opened`事件)。 2. 在open事件处理函数中,使用this.$refs.form.clearValidate()来清除验证结果(这样就不会显示红色提示)。 注意:clearValidate方法可以清除所有表单项的验证结果,也可以清除单个表单项(传入prop名)。 示例代码: ```vue <template> <el-dialog :visible.sync="dialogVisible" @open="handleDialogOpen"> <el-form :model="form" ref="form" :rules="rules"> <el-form-item label="必选字段" prop="requiredSelect"> <el-select v-model="form.requiredSelect" placeholder="请选择" required> <el-option label="选项1" value="1"></el-option> <el-option label="选项2" value="2"></el-option> </el-select> </el-form-item> </el-form> </el-dialog> </template> <script> export default { data() { return { dialogVisible: false, form: { requiredSelect: '' // 初始为空 }, rules: { requiredSelect: [ { required: true, message: '请选择', trigger: 'change' } ] } }; }, methods: { handleDialogOpen() { // 打开对话框,清除表单验证 this.$nextTick(() => { this.$refs.form.clearValidate(); // 清除整个表单的验证 // 或者清除单个字段:this.$refs.form.clearValidate('requiredSelect'); }); } } }; </script> ``` 这样,在对话框初次打开,即使表单字段是空的,也不会显示红色错误提示。等到用户交互(如选择后触发change事件)或提交表单再进行验证。 补充说明: 1. 使用`this.$nextTick`是为了确保在DOM更新后再执行清除验证,因为对话框的打开是异步的,表单元素可能还未完全渲染。 2. 如果需要在提交表单验证,可以在提交按钮的点击事件中调用validate方法。 其他注意事项: - 如果使用resetFields方法,它会将表单字段重置为初始值(即打开对话框的值),并且清除验证状态。但如果在打开对话框我们设置表单的初始值为空,那么resetFields之后字段还是空,但验证状态被清除了,所以也不会显示错误。不过,我们通常会在打开对话框设置表单数据(编辑)或清空表单(新增),所以可以在设置完数据后调用clearValidate。 因此,在打开对话框的方法中,如果是新增,我们可以这样: ```javascript openDialog() { this.dialogVisible = true; // 重置表单,这样会将表单字段重置为初始值(初始值需要在打开前设置) // 但是注意:如果我们在打开对话框前没有重置form对象,那么resetFields会重置到上一次打开的初始值?所以建议在打开对话框前先重置form对象(比如设置为空对象或初始值) this.form = { requiredSelect: '' }; // 重置表单数据(新增) this.$nextTick(() => { if (this.$refs.form) { // 先重置表单(这样会清除验证状态,并将字段值重置为当前form的值) this.$refs.form.resetFields(); // resetFields会清除验证状态,所以不需要再调用clearValidate } }); } ``` 但是,如果我们在打开对话框前已经给form设置了初始值(比如编辑从后台获取数据),那么resetFields会将表单重置为初始值(即编辑的值),这如果这个值是有效的,就不会显示错误;如果是无效的(比如空),那么resetFields会清除验证状态(所以也不会显示错误)。不过,在编辑,我们设置的值通常都是有效的,所以不会触发错误提示。 所以,总结两种方式: 方式一(推荐): 在对话框的open事件中,调用clearValidate方法清除验证状态。 方式二: 在打开对话框前重置表单数据,然后调用resetFields方法(它会清除验证状态)。 这两种方式都可以避免初次打开显示红色提示。 另外,关于引用中提到的z-index问题下拉框被遮盖),虽然不在本次问题范围内,但也是常见问题解决方法通常是调整el-select下拉菜单的z-index,或者设置dialog的append-to-body属性为true(Element UI)[^2]。 因此,针对用户的问题,我们给出上述解决方案。 相关问题: 1. 如何清除Element UI表单中特定字段的验证状态? 2. 在el-dialog中,如何避免下拉框(el-select)被遮盖? 3. Element UI表单验证规则有哪些配置项? 注意:上述解决方案适用于Element UI,对于Element Plus同样适用,因为两者API设计基本一致。 </think>### Element UI Dialog 中必选 Select 初次打开不显示红色提示的解决方案 在 Element UI 的 `el-dialog` 中使用表单,必选 `el-select` 初次打开会显示红色验证提示,这是因为 Element UI 的表单验证机制会在组件渲染立即触发。以下是三种有效解决方案: --- #### 方法一:使用 `clearValidate` 清除初始验证(推荐) 在对话框打开清除所有表单验证状态: ```vue <template> <el-dialog :visible.sync="dialogVisible" @open="handleDialogOpen"> <el-form :model="form" ref="formRef" :rules="rules"> <el-form-item label="必选项" prop="requiredSelect"> <el-select v-model="form.requiredSelect" placeholder="请选择" :required="true"> <el-option label="选项1" value="1" /> <el-option label="选项2" value="2" /> </el-select> </el-form-item> </el-form> </el-dialog> </template> <script> export default { methods: { handleDialogOpen() { this.$nextTick(() => { this.$refs.formRef.clearValidate(); // 关键代码:清除初始验证 }); } } } </script> ``` **原理**: 通过 `@open` 事件钩子在对话框打开调用 `clearValidate()`,清除所有表单项的验证状态[^4] --- #### 方法二:延迟设置 `required` 属性 在用户交互后才启用必选验证: ```vue <template> <el-select :required="isSelectTouched" @focus="isSelectTouched = true"> ... </el-select> </template> <script> export default { data() { return { isSelectTouched: false // 初始未交互 } } } </script> ``` --- #### 方法三:自定义验证规则 通过动态控制验证规则触发机: ```vue <script> export default { data() { return { rules: { requiredSelect: [{ validator: (rule, value, callback) => { if (this.isFormSubmitted && !value) { callback(new Error('请选择')); // 提交才验证 } else { callback(); } }, trigger: 'change' }] } } }, methods: { submitForm() { this.isFormSubmitted = true; this.$refs.formRef.validate(valid => { if (valid) { // 提交逻辑 } }) } } } </script> ``` --- ### ⚠️ 注意事项 1. **z-index 层级问题** 如果下拉框被遮挡,需调整下拉菜单的 z-index: ```css .el-select-dropdown { z-index: 9999 !important; /* 高于 dialog 的 2000 */ } ``` [^1][^2] 2. **表单重置逻辑** 关闭对话框重置表单状态: ```javascript handleClose() { this.dialogVisible = false; this.$refs.formRef.resetFields(); this.isFormSubmitted = false; } ``` 3. **默认值优化** 设置默认选项避免空值: ```vue <el-option label="请选择" value="" disabled /> ``` --- ### 三种方法对比 | 方法 | 优点 | 适用场景 | |------|------|----------| | `clearValidate` | 实现简单,官方推荐 | 通用场景 | | 延迟设置 required | 精准控制触发机 | 复杂交互表单 | | 自定义验证规则 | 完全控制验证逻辑 | 需要条件验证 | 根据 Element UI 的官方实践,**方法一(clearValidate)是最推荐的处理方式**,既符合框架设计,又能有效解决问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值