Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >vue下拉选i-select无法选取“全部”,无法赋值为空串''的诡异bug

vue下拉选i-select无法选取“全部”,无法赋值为空串''的诡异bug

作者头像
Java深度编程
发布于 2020-06-10 04:20:17
发布于 2020-06-10 04:20:17
1.4K0
举报
文章被收录于专栏:Java深度编程Java深度编程

这是一个让人头皮发麻,全身慎得慌的诡异bug,因为它不符合科学逻辑,违反常理。仿佛有一只黑手在恶意操控着,让前端工程师们觉得不可以思议,也无可奈何。

我们在做前端开发时, 对于下拉选一般都会有一个“全部”选项,value='',用于清空前面选择的值,这是在正常不过了,但这在vue就开始变得奇奇怪怪,逻辑狗屁不通。

下面我开始对这个诡异的bug进行解刨,分析:

我的第一个页面的代码如下:

bug出现过程:

1.点击业务类型下拉选,选择选项一,F12能观察到成功赋值"one"传到后台完成了过滤查询;

2.我现在不想通过“one”来过滤了,我想查询所有的,于是我再次点开下拉选选择全部,奇怪的时候发生了,竟然无法选择“全部”这个选项。如下图所示:

通过上面的两部操作,就可以看到无法选择这个值。并且点击查询后,会发现前端依然将上一次选择的值“one”给传到后台了,而并非空串''。

3.第三步 :第三次点开下拉选,再次选择“全部”,你会发现这时候终于选上了。但是,然并卵,并没有什么卵用。

通过上图你可以看出,就算你选上了“全部”,也是没什么卵用的,依然给你传上次选择的“one”。

以上便是vue的下拉选无法选择“全部”,也无法赋值为空串的bug。而且这个bug并不完全表现在操作下拉选的时候,在进行刷新,清空的时候依然存在这个bug。同样的,重新加载页面后,我们再来进行下面的操作步骤:

1.选择“选项二”,点击搜索,在F12里可以看到businessType成功赋值为“two”,没有任何问题。为了方便对比,同时我还选择了其它的值,如下图:

2.这时候我想刷新页面,清空所有选择的值,重新查询一次,这时候奇怪的事情发生了,下拉选的值无法清除,其它的值都可以清楚,偏偏,唯独就下拉选的不可以。准确点来说,是this.body对象中的属性businessType无法赋值为空'',因为刷新是调用了clear()方法。同在一个对象body里,为什么,为什么除了businessType无法赋值为空串外,其它的属性都可以?“本自同对象,何故你与众不同?”

于是我决定打个断点,一探究竟。结果竟然神奇的发现,点击刷新后,调用clear()方法,this.body.businessType的值确实被赋值为了空串''。但是为什么还是往后台传“two”呢?

3.第三步,再次刷新。会惊奇的发现,所有的值被清空了。这就留下了一个引人深思的问题:“businessType”的值为什么要刷两次才可以清空,其它的值只需要一次?

我开始思考,研究这个问题。通过我的观察,虽然表面上看,我们操作的是一个对象body里的属性,一部分属性无法赋值为空串'',一部分可以。但转换思维,从另一个角度来看,这些对象中无法被赋值为空串''的属性,都有绑定了v-model,并且都在i-select下拉选中绑定的。于是我推测这跟 v-model和i-select混合使用有关系。为了证实这个观点,我又找了其它页面测试,结果发现所有对象中的属性如果在i-select下拉选中双向绑定了v-model,第一次都无法赋值为空串'',都会继续传上一次的值到后台。必须要进行两次赋值为空串,才能真正的赋值为空串。

根据这些研究,推敲出一个逻辑: v-model和i-select混合使用时,每次赋值的时候,其值都被记录,当下次赋值的时候,如果判断为空串'',将取上一次赋值的值,重新赋值给这个属性。

为此我还特意整理了一根演示代码逻辑:

从上面的代码可以看出,每一次调用updateObject()方法进行更新数据的时候,都会先判断传入的值是否为空串'',如果是就取上次的值赋值,如果不是就取传入的值。与此同时,每次都记录调用方法时传入的值。

根据上面的代码逻辑,就能合理的解释当你在 i-select的下拉选选择了一个值“one”后,为什么第一次刷新的时候明明debug看到值已经是空串''了,可还是把“one”传到看后台,第二次刷新的时候才真正的传入了空串''。

虽然以上代码逻辑能解释这种现象,但vue的底层是不是这样的不得而知。由于本人水平有限,无法深入解读其源码,只好将这个bug反馈给vue官方。期待官方能告诉我一个答案。虽然我未能研究出底层原理,但也想出了两种解决方案:

1.使用null替代空串'',用null以后你会发现刷新的时候只需要一次就可以把值清空了,而且下拉选选择“全部”选项的时候,一次就可以选中,而且也能成功赋值传入后台。

2.使用空格' '替换空串'',然后后台进行去空格操作。或者是采取其它标识符,例如“ALL”之类,后台再进行判断后重新赋值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java深度编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
vue-element怎么给select下拉框赋值?
看文档真的是一件非常快乐的事情,看别人写的代码,再跟自己写的代码一对比,立刻会发现有很多不同的地方,也可以学到很多新技能,从最简单的阅读学习起来,今天看的是select下拉框相关的。
王小婷
2020/10/14
5.3K0
vue的select下拉框多选项-multiple属性
最近在使用vue-element-admin这个后台管理框架开源模板在做一个管理后台,使用起来其实还挺方便的,大部分的组件源码里面都已经写好了,用的时候只需要把源码拿出来修改修改,也就成了。
王小婷
2020/09/03
10.7K0
如何实现两个下拉选择框 select选中联动效果?
某一个页面,上面是查询项,下面是列表。查询项中有两个下拉选择框,都是查询条件。这两个选择框是父子级的关系。当我选中第一个选择框某一项时,第二个选择框的下拉项会发生变化;当选择第二个选择框的某一项时,需要回填第一个选择框的值。
喵喵侠
2024/06/12
1.8K1
如何实现两个下拉选择框 select选中联动效果?
vue-element的select下拉框赋值
当我们从后端获取到返回值之后,需要进行一些处理,渲染到前端的界面里面。 但是后端有时候的返回值的数据类型都是不一样的 就那select下拉框赋值来说: 1:当返回值是对象数组的时候 <template> <el-select v-model="value" placeholder="请选择"> <el-option v-for="item in options" :key="item.value" :label="item.label" :va
王小婷
2020/09/27
4.9K0
VUE下拉框双向联动
在开发前端页面的时候,常常需要写下拉框,普通常见的下拉框有在页面写死固定值的下拉框,有通过调用后台接口服务而获取的值列表等。无论是原始的jsp页面html页面等,还是现在流行的vue angluar.js等,逻辑都是一样。但是大多数时候我们只需要开发一个下拉框即可,本文讲解VUE页面中,通过实际案例场景讲解多个下拉框如何实现双向动态联动效果。
程序大视界
2022/09/22
2.2K1
Vue中的表单绑定(全 gif 演示)
但是v-model绝不仅仅只在input上面玩,还可以在别的标签上面玩,这篇就给大家来介绍一下
砖业洋__
2023/05/06
9820
Vue中的表单绑定(全 gif 演示)
vue3 实现 select 下拉选项
本人学生 🐶, 平时在外面没事接点小项目小赚一笔补贴生活费. 之前一直都是使用Vue2.x的版本做项目, 暑假刚刚学习了Vue3想着新项目就直接用Vue3上手. 效果展示 好了, 话不多说先给大佬们看看效果样式: 组件难点 因为下拉框可能会在某些情况下被挡住, 所以这里的下拉框被挂载到了body标签上, 并且下拉框中的选项往往是以<slot>插槽的形式编写, 这里就会困扰到很多小白, 搞不明白怎么样才能在 下拉框 与触发下拉按钮 之间关联响应式事件与数据. 组件的使用 <tk-select selec
玖柒的小窝
2021/10/22
5.2K0
vue3 实现 select 下拉选项
v-model和v-bind绑定数据的区别
这篇文章主要介绍vue中v-model和v-bind绑定数据的区别是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
用户7741497
2022/03/05
1.6K1
使用vantUI下拉框(弹窗)的一些bug
公司这边要写一个温度的下拉框,35-42度,以0.1步进。算下来有好几十个,需求是做成下拉框可以拉动选择温度的形式。尝试了很多UI包括select,其中遇到不同的bug,作个记录。
xyzzz
2020/12/10
3.7K0
Vue 学习笔记 —— 常用特性 (二)
做一名在校大学生,我的梦想是做一名独立的开发者,具备全栈思维额能力的一名开发者,我的技术栈是 SpringBoot + Vue 学习记录来自
Gorit
2021/12/08
5K0
Vue 学习笔记 —— 常用特性 (二)
Vue常用特性
需求:输入框中输入姓名,失去焦点时验证是否存在,如果已 经存在,提示从新输入,如果不存在,提示可以使用。
星辰_大海
2022/05/10
1.7K0
Vue常用特性
Vue 相关学习笔记(一)
可能有安全问题, 一般只在可信任内容上使用 v-html,永不用在用户提交的内容上
用户6808043
2022/02/24
7.7K0
Vue 相关学习笔记(一)
【Vue】day02-Vue基础入门
所谓指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码
陶然同学
2023/10/14
3090
【Vue】day02-Vue基础入门
vue学习笔记-day03
语法:array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
全栈程序员站长
2022/06/30
8830
vue学习笔记-day03
vue实现下拉框二级联动效果
数据格式不一定和上面的一样,我上一篇文章是把这个数据格式用在了树形控件上面,这里放在二级联动上面。
别团等shy哥发育
2023/02/25
4K1
vue实现下拉框二级联动效果
vue中同时获取select下拉框的值和文本
在下是首席架构师
2023/07/04
2.7K0
vue中同时获取select下拉框的值和文本
分享5个关于 Vue 的小知识,希望对你有所帮助
有时候,我们希望在Vue.js中在选项改变时获取所选的选项。在这篇文章中,我们将学习如何在Vue.js中获取选择的选项。
前端达人
2023/08/31
8130
分享5个关于 Vue 的小知识,希望对你有所帮助
下拉菜单11+原生js获取select下拉框的selected的option项
想必大家在开发过程中也遇到类似问题,如果直接将js获取的数组传给后台,后台是无法区分数组的,因为js数组如果是二维的就是这样的:1,张三,23,2,李四,26
用户3519280
2023/07/08
1.8K0
下拉菜单11+原生js获取select下拉框的selected的option项
TDesign 更新周报(2022年11月第2周)
详情见:https://github.com/Tencent/tdesign-vue/releases/tag/0.49.4
TDesign
2022/11/10
1.6K0
vue v-model的详细介绍
FGGIT
2024/10/15
2850
vue v-model的详细介绍
相关推荐
vue-element怎么给select下拉框赋值?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档