详解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 相关文章推荐
vs2003 js文件编码问题的解决方法
Mar 20 Javascript
javascript生成随机颜色示例代码
May 05 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
Aug 27 Javascript
JavaScript 节流函数 Throttle 详解
Jul 04 Javascript
Node.js中用D3.js的方法示例
Jan 16 Javascript
javascript中json基础知识详解
Jan 19 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
浅谈Webpack多页应用HMR卡住问题
Apr 24 Javascript
VsCode与Node.js知识点详解
Sep 05 Javascript
优雅的使用javascript递归画一棵结构树示例代码
Sep 22 Javascript
微信小程序如何实现五星评价功能
Oct 15 Javascript
Vue路由管理器Vue-router的使用方法详解
Feb 05 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
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
php在apache环境下实现gzip配置方法
2015/04/02 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
2013/08/07 Javascript
iframe实用操作锦集
2014/04/22 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
vue路由中前进后退的一些事儿
2019/05/18 Javascript
JS实现给数组对象排序的方法分析
2019/06/24 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
python字符串排序方法
2014/08/29 Python
详解Python中的四种队列
2018/05/21 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
爱耳日活动总结
2014/04/30 职场文书
一帮一活动总结
2014/05/08 职场文书
销售求职信范文
2014/05/26 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
Python基础 括号()[]{}的详解
2021/11/07 Python