问题描述

先看看Select组件的意思:

简单来说,就是下拉选择,可以多选可以单选。如果是多选,绑定的数据就是数组,否则就是单个数据。

有个需求,在Vue中使用Select组件,支持多选,选择某一项,使它与其他项互斥。也就是说,假设这一项叫A,选择A时就必须移除选择的其他选项,而选择其他选项时可以多选不受限制。

本文将使用简单的伪代码描述逻辑,并不是直接就能用的代码。

代码实现

先给出一部分JS代码:

data(){return {// Select绑定的数组select_list: [],// 选项数组options_list: ['A', '选项2', '选项3', '选项4', '选项5']}
}

使用Select组件:

<Select v-model="select_list" multiple><Option v-for="item in options_list" :value="item" :key="item"></Option>
</Select>

逻辑就是这样,现在来实现需求。当选择A的时候,需要移除其他选项,只保留A。

很容易想到使用watch实现这个逻辑,即用watch监视select_list,当选择了A时就移除其他选项,只保留A。

不妨试试,逻辑如下:

watch: {select_list: {handler(newVal) {console.log('执行');if (newVal.indexOf("A") > -1) {this.select_list = newVal.filter((item) => item == "A");}},deep: true,},},

看上去很完美。注意,这里并没有判断oldVal中是否含有A,需要另外处理,但由于这不是这里的重点所以不多说。

执行起来发现,虽然在点击A的时候,似乎可以正常把其他数据移走,但会出现这么个情况:

这仅仅是点击了一次A!

原因很简单,watch每次监视到select_list的变化就会执行,执行handler的时候修改了select_list,于是再次监视到selct_list的变化,再次触发执行,如此周而复始。虽然在UI上似乎看不出问题,但进行了大量的运算,消耗了性能。

说到底,在监视中修改被监视的数据,会导致无限地触发下去。不过,当然可以使用其他办法阻止下一次触发,但我觉得这样并不好。

不如这样,直接在Option上添加click事件监听函数:

<Select v-model="select_list" multiple><Option v-for="item in options_list" :value="item" :key="item" @click="add(item)"></Option>
</Select>

这样,在add中判断item的值是不是A。如果是A,则修改select_list,再做其他的工作,就更容易了。注意,这里需要在click后面添加.native,因为Option是一个组件,不是普通标签。

iView框架Select组件相关推荐

  1. iview 下拉select样式_iview的select组件的列表样式和点击都无效

    iview的select组件用按需引入的方式加载这个组件之后列表样式和点击都无效,但是在main.js全局引入iview之后再用这个select组件又没有这个问题,main.js里面只引入了样式文件, ...

  2. iview select 组件控制下拉隐藏或显示

    iview 的select主键只提供了下拉框展开或收起时触发事件,没法手动控制下拉隐藏或显示,查看源码后发现内部是用visible变量控制是否显示下拉,通过改变子组件visible变量就可以了,例:t ...

  3. iview select选中值取值_完美解决iview 的select下拉框选项错位的问题

    在使用iview的过程中,我遇到这样一个问题,在Model中使用select下拉框组件.但是当弹出框超过一屏需要滚动时,select的下拉选项会出现错位(下图1为正常,图2为滚动后,下拉选项错位.) ...

  4. iview select 怎么清空_如何解决iview 的select下拉框选项错位的问题,具体操作如下...

    下面我就为大家分享一篇完美解决iview 的select下拉框选项错位的问题,具有很好的参考价值,希望对大家有所帮助. 在使用iview的过程中,我遇到这样一个问题,在Model中使用select下拉 ...

  5. iview 输入框_使用iview框架,如何进行输入框或者按钮的关联验证

    iview框架的Form 组件基于 async-validator 实现数据验证,给 Form 设置属性 rules,同时给需要验证的 FormItem 设置属性 prop 指向对应字段即可. 简单的 ...

  6. html 方式使用iview,VUE之iview框架使用教程

    iview框架内含很多预定义的组件,可以直接拿来使用,非常方便. 但iview有一个非常大的问题,就是教程实在非常少,尤其是不懂vue的童鞋更是无从下手. 项目创建过程:首先下载一个官方的demo工程 ...

  7. iview自定义Tree组件内容

    介绍 Vue完整前后台项目介绍 使用iview框架进行开发的话,一般都有展示树形结构数据的需求.那么就用的到其中的Tree组件了.但是其基本架构是满足不了我们的需求的,基本架构如下: 一般来说一条数据 ...

  8. iView UI Select 选择器 下拉列表跟随滚动条移动

    iView UI Select 选择器 下拉列表跟随滚动条移动 这里记录一个BUG,关于iView UI Select 选择器 下拉列表跟随滚动条移动. 此文章是本人记录BUG以及BUG的解决方法,希 ...

  9. elementui select组件选中后无法自动刷新更新值渲染到页面中

    2019独角兽企业重金招聘Python工程师标准>>> elementui select更改选中值后,无法渲染到页面中? 在select组件中添加了@visible-change=& ...

最新文章

  1. Python3并发检验代理池地址
  2. 【计算机网络】数据链路层 : 信道划分 介质访问控制 ( 数据链路 | 介质访问控制分类 | 频分多路复用 FDM | 时分多路复用 TDM | 波分复用 WDM | 码分多路复用 CDM 计算 )★
  3. CTFshow 命令执行 web76
  4. html基础电子文档,html基础
  5. pytorch---之cudnn.benchmark和cudnn.deterministic
  6. VM虚拟机Bridge模式VMnet0网卡无法启动问题的解决
  7. MSP430系列教程(一) 开发环境搭建(IAR for MSP430 v7.10.1)
  8. 平均绝对值误差(L1_Loss)和 均方误差(L2_Loss)
  9. Japanese Student Championship 2019 Qualification
  10. joomla网页加速插件
  11. jenkins自动打包报错:cannot find symbol
  12. ps photoshop 2023 新功能 简介
  13. ATFX:小非农不及预期,今晚大非农表现如何?
  14. rancher2.6部署k8s集群示例
  15. Django 之ORM(一)
  16. 个人文件转移工具 v1.9.0.2107 系统目录迁移工具
  17. 2019年,转行到互联网行业,还有必要么?
  18. 哈佛《幸福课》 第1课 什么是积极心理学
  19. lindo与lingo软件有什么区别?
  20. 微软考试号码与名称对照表

热门文章

  1. 我们身边的计算机网络作文,关于网络的作文三篇
  2. Xshell的舒服配色方案,否则蓝色看不清
  3. 一部值得收藏的PDA进化史
  4. 易基因 | 文献解读:单细胞RRBS+RNA测序揭示黄曲霉毒素B1诱导S期阻滞L02细胞肝毒性新机制
  5. chromosome conformation capture:染色质构象捕获技术
  6. hive moving data报错,unable to move source...,yarn显示任务执行成功
  7. pretty-errors:美化python异常输出以使其清晰易读
  8. Keras LSTM对20 Newsgroups数据集进行分类
  9. Dependency check配置Mysql数据库存储nvd数据
  10. Web前端学习笔记(十五)---四色花瓣