用vue实现按字母排序的多选列表功能类似通讯录

这两天做项目,pc端本来是一个简单的select多选功能,做到客户端的时候,产品要求做成按字母排序功能,类似手机通讯录功能,由于我们客户端用的滴滴的cube-ui 组件,我选择了cube-ui IndexList,在它的基础上进行扩展。大致效果如果下图

在这里插入图片描述

其实难点在于如何处理数据,研发返回的数据,返回的格式如:{ "error": 0, "payload": { "count": "16", "list": [{ "userid": 100008, "truename": "Ayoung", "mobile": "13592579211", "firstchar": "A" }, { "userid": 100007, "truename": "安", "mobile": "", "firstchar": "A" }, { "userid": 100006, "truename": "bbs", "mobile": "", "firstchar": "B" }, { "userid": 100011, "truename": "兵馬", "mobile": "", "firstchar": "B" }, { "userid": 100012, "truename": "陈", "mobile": "", "firstchar": "C" }, { "userid": 100000, "truename": "创始人", "mobile": "13503457031", "firstchar": "C" }, { "userid": 100015, "truename": "huang", "mobile": "", "firstchar": "H" }, { "userid": 100009, "truename": "韩", "mobile": "", "firstchar": "H" }, { "userid": 100010, "truename": "黄", "mobile": "", "firstchar": "H" }, { "userid": 100005, "truename": "Jea", "mobile": "", "firstchar": "J" }, { "userid": 100025, "truename": "lzc", "mobile": "15638550436", "firstchar": "L" }, { "userid": 100013, "truename": "栗", "mobile": "", "firstchar": "L" }, { "userid": 100003, "truename": "彭", "mobile": "", "firstchar": "P" }, { "userid": 100002, "truename": "晴天~", "mobile": "", "firstchar": "Q" }, { "userid": 100004, "truename": "强", "mobile": "", "firstchar": "W" }, { "userid": 100001, "truename": "dddd", "mobile": "", "firstchar": "W" }] }, "message": "", "baseinfo": { "userid": 100001, "username": "huang", "truename": "lanfeng", "mobile": "15003844853", "isvalid_mobile": 1, "email": "", "isvalid_email": 0, "bind_gcw": 0, "bind_qiwei": 1, "bind_dingding": 0, "logintime": 1562912343, "cer_status": 1, "is_notice_bind": 0, "base_role": 0 } }

转换数据代码如下

//先转换成对象,根据firstchar字段对应的字母,先循环字母数组,设置字母为k,对应数组为键值
 lists () {
      const { adminListDatas } = this
      let obj = {}
      const arr2 = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]
      for (let i = 0; i < arr2.length; i++) {
        obj[arr2[i]] = []
        adminListDatas.forEach((item, index) => {
          item.value = item.userid
          item.name = item.truename
          this.$set(item, 'checked', false)
          if (arr2[i] === item.firstchar) {
            obj[arr2[i]].push(item)
          }
        })
      }
      return obj
    },
    //把数据转换成cube-ui IndexList 需要的数据
    lastList () {
      let arr = []
      for (let[key, value] of Object.entries(this.lists)) {
        if (value.length) {
          arr.push({
            name: key,
            items: value
          })
        }
      }
      return arr
    }

然后利用组件的slot自定义,把checkbox组件加到相应的里面,不能用cube-ui IndexList的select事件,因为它会触发两次事件,建议用checkbox的input绑定值变化的事件,再对数据进行相应的改变,代码如下

<template>

  <div class="select-list-list">
    <cube-index-list>
      <cube-index-list-group
        v-for="(group, index) in lastList"
        :key="index"
        :group="group"
      >
        <cube-index-list-item
          v-for="(item, index2) in group.items"
          :key="index2"
          :item="item"
          @select="selectItem"
        >
          <div class="custom-item">
            <cube-checkbox
              v-model="item.checked"
              position="left"
              shape="square"
              @input="getval(item,$event)"
            >
              {{ item.name }}
            </cube-checkbox>
          </div>
        </cube-index-list-item>
      </cube-index-list-group>
    </cube-index-list>
  </div>
</template>

利用checkbox的input事件,把选中的数据userid放到checkList里面,取消的从checklist数组中移除,然后触发getaminlist 传给父组件,把选中的值传给父组件

getval (item, $event) {
      const index = this.checkList.indexOf(item.userid)
      if ($event && (index === -1)) {
        this.checkList.push(item.userid)
      } else if (!$event && (index > -1)) {
        this.checkList.splice(index, 1)
      }
      this.$emit('getadminList', this.checkList)
    }

看起来似乎简单,但在处理checkbox上浪费了不少时间,刚开始一直想着从indexlist的select事件方法中处理数据,发现怎么试都容易引起两次触发,后来改成checkbox的input事件问题就解决了,处理数据刚开始不知道怎么下手,因为刚开始研发让前端来实现汉子转换拼音,筛选出首字母,后来研发把每条数据加了一个拼音的首字母,问题自然而然的解决了,

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,483评论 1 11
  • VUE介绍 Vue的特点构建用户界面,只关注View层简单易学,简洁、轻量、快速渐进式框架 框架VS库库,是一封装...
    多多酱_DuoDuo_阅读 2,692评论 1 17
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,465评论 1 45
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,822评论 1 18
  • Unity3D塔防开发流程 配置环境及场景搭建 编程语言:C#,略懂些许设计模式,如果不了解设计模式,BUG Mo...
    Grape_葡萄阅读 2,933评论 1 3