详解Vue Elementui中的Tag与页面其它元素相互交互的两三事


Posted in Javascript onSeptember 25, 2018

前言

公司系统在用elementui做后台开发,不免遇到一些需要自己去根据原有的功能上,加一些交互的功能。
今天来介绍下我在用elementUi里的Tag标签与多选框交互的过程,东西听上去很简单,但就是越简单的东西越容易出一些问题。官方tag文档:elementUi-tag标签

效果图:

详解Vue Elementui中的Tag与页面其它元素相互交互的两三事

思路

一、多选框勾选,出现对应的tag:

1.利用watch监听多选框绑定的值A(数组)的变化;
2.根据A的变化,循环拿到勾选多选框的id对应的name,将id以及对应的name组成新的对象数组;
3.将上一步得到的对象数组,去重(产品要求,出现的tag里不能有重复的)得到结果B;
4.将B赋值给tags,循环展示出来;

二、点击tag上的删除按钮,删除当前的tag,并将对应勾选的多选框取消勾选:

1.点击tag删除的按钮的时候,拿到当前tag的id C;
2.执行方法,去除掉A里的C;
3.watch事件重新进入到第一步的方法;

总结:监听多选框对应的model A,根据A的变化,取到对应的id与name,赋值给tag作展示,tag的删除事件反过来在去控制A的变化,重新进入watch事件里的方法

听起来挺简单,思路大概也明确,先讲上述思路对应的代码,后边再讲遇到的问题、坑

代码

复制整一块代码到你的elementUi项目里就能看到效果
<template>
 <div>
 <el-row type="flex" justify="bettwen">
  <el-col :span="15">
  <!-- 表单 -->
  <el-form :model="tempForm" ref="tempForms">
   <el-form-item label="请选择人员">
   <!-- 多选人员 -->
   <el-checkbox-group v-model="tempForm.checkboxGroup5" size="small">
    <el-checkbox border v-for="(item,index) in checkBox" @change="perChange(item)" :label="item.id" :key="index">{{item.name}}</el-checkbox>
   </el-checkbox-group>
   <!-- 多选人员 end-->
   </el-form-item>
  </el-form>
  <!-- 表单 end-->
  <!-- tag展示区 -->
  <el-row>
   <el-tag class="tagClass" v-for="(tag,index) in tags" :key="index" closable @close="handleClose(tag)" :type="tag.id">
   {{tag.name}}
   </el-tag>
   <el-button v-if="tags.length>0" @click="clearAll" plain>全部删除</el-button>
  </el-row>
  <!-- tag展示区 end-->
  </el-col>
  
 </el-row>
 </div>
</template>
<script>
export default {
 name: 'kk',
 mounted() {},
 data() {
 return {
  msg: 'Welcome to Your Vue.js App',
  tags: [],
  tempForm: {
  checkboxGroup5: [], //选择的人员
  },
  detailData: [],
  checkBox: [{
   name: '小红',
   id: '101'
  },
  {
   name: '小黄',
   id: '100'

  }, {
   name: '小明',
   id: '102'

  }, {
   name: '小明',
   id: '102'

  }
  ],
  
 }
 },
 methods: {
 clearAll() { //全部清空数据
  this.tags = []
  this.tempForm.checkboxGroup5 = []
 },
 perChange(item) {
  this.detailData.push(item)
 },
 handleClose(tag) { //标签的删除事件
  // 去掉当前删除的tag
  let yourChoseTags = this.tempForm.checkboxGroup5

  this.tempForm.checkboxGroup5 = yourChoseTags.filter(item => {
  if (tag.id !== item) {
   return true
  }
  })

  
 },
 delRepeat(arr) { //数组对象去重
  return Object.values(
  arr.reduce((obj, next) => {
   var key = JSON.stringify(next);
   return (obj[key] = next), obj;
  }, {}),
  );
 },
 moreArr() {
  let yourChose = this.tempForm.checkboxGroup5
  let tempTags = []

  tempTags = this.baseDataDetail(yourChose, this.checkBox, tempTags)
  this.detailData = tempTags
 },
 baseDataDetail(yourChose, baseData, callBack) { //封装的数组方法
  let temp = callBack
  // 循环两个数据拿到选择的checkbox的id对应的初始数据
  yourChose.forEach(item => {
  baseData.forEach(itemSecond => {
   if (item === itemSecond.id) {
   temp.push(itemSecond)
   }
  })
  })
  return temp
 },

 },
 watch: {
 detailData() {
  let tempArr = Object.assign([], this.detailData)
  tempArr = this.delRepeat(tempArr)
  // console.log(tempArr)
  this.tags = tempArr
 },
 "tempForm.checkboxGroup5" () {
  this.moreArr()
 },
 }
}

</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.tempArea {
 /*width: 100%;*/
}
.tagClass{
 margin-right: 10px;
}

</style>

值得注意的点:

1.我在多选框绑定值tempForm.checkboxGroup5的监听事件里的方法的最后,得到了一个可能会有重复数据(重复id跟name),再将这个含有重复数据数组对象赋值给另一个数组detailData,在watch监听这个数组,去完重后,赋值给tags做展示。
为什么这样做,是因为,我们的需求里,除了在当前页面多选框选择人员,还有一个选择全公司员工的组件,这样不管从哪个渠道选择的人员都能最后将结果指向detailData,保证渲染正确

2.数组对象去重,初始数据里可能会有重id、重名的对象(小明),即便绑定多选框的model值里不会有重复的id,但在 利用id取对应name的时候,还是会检测出多条,这样tag就可能会显示重复的
所以利用这个方法,就能保证最后处理好的数据没有重复的,tag不会显示多个一样的,
但这个方法有点不灵活的地方就是,你要处理的数据({id:1,name:'小明',type:now})必须id、name,type都重复的时候,才会被去重,
拓展:可根据你设置的数组对象里的某个属性动态去重

3.我一开始是在多选框的change事件上来做tag的展示逻辑,因为change事件里可以同时拿到当前选择的name和id,但是,change的时候,你不知道这是在勾选还是在取消勾选,这样tags的展示就会出问题;

这个逻辑可能不太完美,因为有可能你的人员是从其他组件里选来的,所以当你删除tag的时候,会可能出问题(暂时先不讨论这种情况)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
window.name代替cookie的实现代码
Nov 28 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
Jul 09 Javascript
JS实现向表格行添加新单元格的方法
Mar 30 Javascript
javascript实现查找数组中最大值方法汇总
Feb 13 Javascript
js滚动条平滑移动示例代码
Mar 29 Javascript
基于input框覆盖掉数字英文的实例讲解
Jul 21 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
Oct 20 Javascript
JS实现HTML页面中动态显示当前时间完整示例
Jul 30 Javascript
vue操作下拉选择器获取选择的数据的id方法
Aug 24 Javascript
php结合js实现多条件组合查询
May 28 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
Sep 16 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
Apr 27 Javascript
axios对请求各种异常情况处理的封装方法
Sep 25 #Javascript
解决vue axios的封装 请求状态的错误提示问题
Sep 25 #Javascript
angular 数据绑定之[]和{{}}的区别
Sep 25 #Javascript
Vue高版本中一些新特性的使用详解
Sep 25 #Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
Sep 25 #Javascript
vue实现多个元素或多个组件之间动画效果
Sep 25 #Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
Sep 25 #Javascript
You might like
各种战术和打法的原创者
2020/03/04 星际争霸
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
2016/05/16 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
​如何愉快地迁移到 Python 3
2019/04/28 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
互动出版网:专业书籍
2017/03/21 全球购物
一级方程式赛车官方网上商店:F1 Store(支持中文)
2018/01/12 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
应用服务器有那些
2012/01/19 面试题
分布式数据库需要考虑哪些问题
2013/12/08 面试题
工业设计专业个人求职信范文
2013/12/28 职场文书
法律专业应届生自荐信范文
2014/01/06 职场文书
辞职信格式模板
2015/02/27 职场文书
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL
Python绘制散乱的点构成的图的方法
2022/04/21 Python
delete in子查询不走索引问题分析
2022/07/07 MySQL