当前位置:   article > 正文

vue el-select 实现邮件系统收件人效果_vue elementplus 实现收件人多人邮箱

vue elementplus 实现收件人多人邮箱

简介

开发邮箱项目时,需要实现类似qq邮箱收件人的效果,其中包含:可添加多个收件人,输入时匹配通讯录,输入框失去焦点时自动添加输入的内容等功能。

根据需求项目,使用element的el-select插件,该插件已包含多选,输入匹配功能,但默认功能输入数据后,只有按Enter键时,才会自动添加,不符合需求,所以,本文完善下相关功能。

vue版本:2.6.12

不是专业前端的,如果有些描述存在问题,自行理解哈

代码及解析

先贴下完整代码,该代码作为components使用的,示例:

<email-select :address-list="addressBookList" @changeValue="changeRecipientsTos" :email="recipientsTos" placeholder="请添加收件人"></email-select>

 参数解析

  1. address-list 通讯录列表,格式:[{name: "昵称", email: "xxx@xx.xx"}]
  2. @changeValue 同步输入框收件人列表信息的方法,注意哦,这个方法更新的list,不能是参数email的值哦
  3. email 初始显示的收件人列表
  4. placeholder 输入框输入提示

全部代码 

  1. <template>
  2. <div style="width: 100%">
  3. <el-select @blur.native.capture="selectBlur" style="width: 100%" v-model="list"
  4. filterable
  5. multiple
  6. allow-create
  7. remote
  8. :remote-method="remoteMethod"
  9. default-first-option
  10. :placeholder="placeholder">
  11. <el-option
  12. v-for="item in options"
  13. :key="item.email"
  14. :label="isNotNull(item.name) ? item.name + '<' + item.email + '>' : item.email"
  15. :value="item.email">
  16. </el-option>
  17. </el-select>
  18. </div>
  19. </template>
  20. <script>
  21. import {isNotNull} from "@/api/default";
  22. export default {
  23. name: "email-select",
  24. props:{
  25. email: {
  26. type: Array,
  27. },
  28. placeholder: {
  29. type: String
  30. },
  31. addressList: {
  32. type: Array
  33. }
  34. },
  35. data(){
  36. return {
  37. list: [],
  38. options: [],
  39. addressBookList: [],
  40. }
  41. },
  42. watch: {
  43. "addressList": {
  44. handler(newvalue, oldValue){
  45. this.addressBookList = newvalue;
  46. }
  47. },
  48. "list": {
  49. handler(newvalue, oldValue){
  50. this.$emit("changeValue", newvalue);
  51. }
  52. },
  53. },
  54. created() {
  55. this.list = this.email;
  56. this.addressBookList = this.addressList;
  57. },
  58. methods: {
  59. remoteMethod(query) {
  60. if (query !== '') {
  61. setTimeout(() => {
  62. this.options = this.addressBookList.filter(item => {
  63. return item.email.toLowerCase()
  64. .indexOf(query.toLowerCase()) > -1;
  65. });
  66. }, 200);
  67. } else {
  68. this.options = [];
  69. }
  70. },
  71. selectBlur(e){
  72. let val = e.target.value;
  73. console.info("selectBlur:" + val);
  74. let that = this;
  75. let length = this.list.length;
  76. setTimeout(function (){
  77. let timeLength = that.list.length;
  78. if (length < timeLength){
  79. return;
  80. }
  81. if (isNotNull(val) && !that.list.includes(val)){
  82. that.list.push(val)
  83. }
  84. }, 200);
  85. }
  86. }
  87. }
  88. </script>

 方法:isNotNull,只是判断是否为空的方法而已。

  1. /**
  2. ** 判断是否为空
  3. * @param val
  4. * @returns {boolean}
  5. */
  6. export function isNotNull(val){
  7. if (val == undefined || val == "" || val == null){
  8. return false;
  9. } else {
  10. return true;
  11. }
  12. }

相关问题解析:

 el-select触发失去焦点事件,需要使用@blur.native.capture触发,只有@blur不行,非搞前端的,其中的原因没去详细了解。

selectBlur方法中,使用了setTimeout,是因为匹配到通讯录中的地址时,如果点击通讯录的地址,依然会触发失去焦点的事件,而获取到的值是输入的地址,而不是点击的通讯录地址。

所以,等待0.2秒,判断下list的值是否增加:

如果点击通讯录中的地址,list会增加一条记录,点击其他地方,list值不会增加。

如果list的值增加了,就忽略掉输入框中的值,

如果list没有增加,就添加输入框中的值。

其他的,应该是vue比较基础的,或者element有文档的,就不过多解释了

经过测试,符合项目需求,感觉还行,就记录一下,顺便分享一下

 


                
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/437809
推荐阅读
相关标签
  

闽ICP备14008679号