封装成组件

<template>
<div class="common-ibar">
<van-search
class="search"
v-model="searchWord"
show-action
placeholder="请输入搜索关键词"
@search="getFriend"
@cancel="onCancel"
/>
<div class="content">
<van-index-bar :index-list="indexList">
<van-index-anchor :index="friendGroup.index" :key="friendGroup.index" v-for="friendGroup in handelList">
<span class="indexWord" :key="friendGroup.index">{{friendGroup.index}}</span>
<van-cell :title="item.name" v-for="item in friendGroup.item" :key="item.id" @click="clickItem(item)"/>
</van-index-anchor>
</van-index-bar>
</div>
</div>
</template> <script>
// https://segmentfault.com/a/1190000021057413
import pinyin from "js-pinyin";
import _ from "loadsh";
export default {
name: "CommonIbar",
props:{
list: {
type: Array,
required: true,
default(){
return []
}
}
},
data() {
return {
searchWord:'',
indexList:[],
handelList:[]
};
},
methods: {
transData(resource) {
// 给每个元素添加first标识,用于分组
const copySc = _.cloneDeep(resource);
copySc.map(
item => (item.first = pinyin.getCamelChars(item.name).substring(0, 1))
); //根据首字母分组和排序
const groupObj = _.groupBy(copySc, "first");
const groupArr = Object.keys(groupObj).map(key => ({
index: key,
item: groupObj[key]
}));
const orderArr = _.orderBy(groupArr, "index");
return orderArr;
},
getFriend(){
this.$emit('search', this.searchWord);
},
onCancel(){
this.$emit('update:isOpen', false)
},
clickItem(item){
this.$emit('update:isOpen', false);
this.$emit('clickItem', item);
}
},
watch:{
list:{
handler(newVal) {
this.handelList = this.transData(newVal);
this.indexList = this.handelList.map(item=>item.index)
},
deep: true,
immediate: true
}
}
};
</script>
<style scoped>
.common-ibar{
height: 100vh;
}
.content{
padding-top: 60px;
}
.search {
position: fixed;
z-index: 2;
width: 100vw;
box-shadow: 1px 1px 1px #eeeeee;
}
</style>

页面使用

<template>
<div id="app">
<CommonIbar
:list="friends"
@search="friendSearch"
v-if="show"
:isOpen.sync="show"
@clickItem="clickItem"
/>
<div class="main" v-else>
请选择: <div @click="pleaseCheck" class="check">{{current?current:'尚未选择'}}</div> </div>
</div>
</template> <script>
import CommonIbar from "./components/common-ibar.vue"; export default {
name: "App",
components: {
CommonIbar
},
data() {
return {
show: false,
friends: [],
current: ""
};
},
methods: {
async getFriend() {
// const {
// data: { data }
// } = await this.$axios.post("/getFriend");
// this.friends = data;
this.friends = [
{
id: "3f11aF98-b74e-B5fe-EeDE-4c6e53eb65fb",
name: "陈秀英"
},
{
id: "DdaFf43F-d522-1A3e-Cd9C-DF8CCec8A7Fc",
name: "贾丽"
},
{
id: "89Bac92E-B47C-Aa1A-693F-5F45b27CC75F",
name: "郑艳"
},
{
id: "57865Ea9-7cAb-dCAA-4F3c-9B09fFCEF00e",
name: "蒋霞"
},
{
id: "8A5a1EdF-7B0C-21ce-f58D-Af4Cb9F7defB",
name: "谢静"
},
{
id: "2e6934ca-e75B-8829-8F33-5C13F0E907B9",
name: "程丽"
},
{
id: "208E3565-fdeb-1Df5-eCAB-e6FCBDA379dF",
name: "龚娟"
},
{
id: "3D37F5Fe-8B3E-44dF-E1E3-65eD3f9fDDeB",
name: "姜涛"
},
{
id: "1c6aB133-bAA3-E3fA-6BC5-3986A1fd9d0D",
name: "易秀兰"
},
{
id: "DbbCCB22-C536-beCB-6c6E-3550FE48DBcb",
name: "陆娜"
},
{
id: "eB3CeCCa-7D69-E3cE-bC9e-B69b09Acce9A",
name: "孔丽"
},
{
id: "9fBca359-BEcF-AeF6-9d28-6787bdEb299B",
name: "周娟"
},
{
id: "fEbB8eFB-98EA-E2F4-96Ea-6FB9F4fE1bCd",
name: "宋秀英"
},
{
id: "Fabd5A46-a6e9-B4E6-Abfd-6E926CE8b3BF",
name: "余桂英"
},
{
id: "81CcbCdc-64bf-f95C-8582-3668B8fD8Ece",
name: "戴秀英"
},
{
id: "DBD27e5A-CFD5-c69A-9823-5C2af59fdb5b",
name: "叶秀兰"
},
{
id: "BeAb3dA2-DEAC-19C4-eA8D-Db0cdDC0960F",
name: "贾敏"
},
{
id: "dE53eD1E-Ddd2-945C-Dc2D-B1Ef8DE32Ebe",
name: "锺敏"
},
{
id: "2Eed58b6-01e3-CaCf-BEEF-40BFf89FDFDA",
name: "徐芳"
},
{
id: "387dfdAe-81B1-6CBE-aBE6-bbc88186EeCb",
name: "苏丽"
},
{
id: "1dD6d169-1A03-C2Fd-b2C9-CaCC21cA7FdD",
name: "易艳"
},
{
id: "c9801191-5EeD-bcbA-ec92-Ee13Ae9Ecc2B",
name: "傅杰"
},
{
id: "EDe98edd-6Cb1-DB38-B5bB-486bDB64F2eB",
name: "乔强"
},
{
id: "CA437477-51fA-Fdd8-Be3A-0e59cDF60B3C",
name: "于杰"
},
{
id: "5cdDB69B-1ec8-d4Bf-AeBb-Fe1Aa4De2Bf2",
name: "汪磊"
}
];
},
friendSearch() {
this.getFriend();
},
pleaseCheck() {
this.show = true;
},
clickItem(item) {
this.current = item.name;
}
},
created() {
this.getFriend();
}
};
</script> <style>
html,
body {
margin: 0;
padding: 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
.main {
height: 100vh;
background: pink;
padding-top: 60px;
padding-left: 40px;
}
.check{
display: inline-block;
border: red solid 1px;
width: 100px;
}
</style>

mock的假数据
这个不重要,可以没有

import Mock from 'mockjs'

Mock.mock('/getFriend', 'post', {
code: 200,
'data|20-30': [{
"id": "@guid",
"name": "@cname",
}]
});
export default Mock;

演示效果

vant封装城市/联系人等选择器的更多相关文章

  1. javascript封装id|class|元素选择器

    由于各个浏览器都支持的选择方法只有如下三种: 1 document.getElementById() 2 document.getElementsByName() 3 document.getElem ...

  2. 关于js封装框架类库之选择器引擎(二)

    在上篇介绍了选择器的获取标签.id.类名的方法,现在我们在上篇基础上继续升级 1.问题描述:上篇get('选择器')已经实现,如果get方法里是一个选择器的父元素,父元素是DOM对象,那么如何获取元素 ...

  3. 关于js封装框架类库之选择器引擎(一)

    选择器模块之传统做法 var tag = function (tag){ return document.getElementsByTagName(tag); } var id = function ...

  4. 教你一个vue小技巧,一般人我不说的

    本文由云+社区发表 1. 需求 最近的项目中,需要实现在vue框架中动态渲染带提示框的单选/多选文本框,具体的效果如下图所示,在输入框聚焦时,前端组件通过接收的kv参数渲染出选项,用户点击选项,可以将 ...

  5. 记录 vant Picker 选择器,实现三级联动,传对应省市区code值

    最近使用vant UI写移动端,感觉还不错 功能挺全的,带的还有省市区三级联动. 但是 突然遇到一个 产品要传的 省市区的code码,还和vant的 邮编不一样,我*****. 看了一下vant UI ...

  6. 第一百三十九节,JavaScript,封装库--CSS选择器

    JavaScript,封装库--修改元素选择器 就是将构造库函数修改成元素选择器,像css那样,输入#xxx .xxx xxx  (获取指定id下的指定class下的指定标签元素) 修改后的基础库 / ...

  7. JQuery选择器转义说明

    JQuery选择器 JQuery选择器规则, 借用了css1-3的规则(css选择器规则), 因为css本身也需要一套规则来索引DOM元素, 进而进行样式渲染,例如div.blue 表示目标DOM为 ...

  8. selenium数据驱动模式实现163邮箱的登录及添加联系人自动化操作

    项目结构如下: 要求python3.0 selenium3.0 下面是代码: appModubles:addContactPersonActtion.py和LoginAction.py addCont ...

  9. 谜一样的jquery之$选择器

    jquery是一个强大的js类库,提供了很多便利的操作方法并兼容不同的浏览器,一旦使用便欲罢不能,根本停不下来,今天我们就来解读一下这个神秘的jquery源代码. 前几天思考再三,自己尝试着封装了一下 ...

  10. Android 时间范围选择器PickTimeDialog

    个人提供了自己封装的第三方时间选择器,能够自定义时间格式,以及设置时间范围. 基础使用 PickTimeDialog pickDilog= new PickTimeDialog(this).setMa ...

随机推荐

  1. Springboot+MongoDB添加数据时会自带_class字段

    _class字段作用 帮助映射子类,为了方便处理Pojo中存在继承的情况,增加系统的扩展性 去除_class字段 新增mongodb的配置类,配置mappingMongoConverter,配置类网上 ...

  2. 🎀Charles激活

    简介 Charles激活码计算 激活 Help -> Register Charles 添加 Registered Name 和计算出的 License key 点击 Register Java ...

  3. web自动化的三大切换

    元素有时在另一个页面里查找元素却报错找不到元素,可能是因为要查找的元素不在原来所在的页面. 一.iframe切换 有些定位元素定位不到,是因为元素在新的iframe页面里,但是driver还停留在原来 ...

  4. 基于Surprise和Flask构建个性化电影推荐系统:从算法到全栈实现

    一.引言:推荐系统的魔法与现实意义 在Netflix每年节省10亿美元内容采购成本的背后,在YouTube占据用户80%观看时长的推荐算法中,推荐系统正悄然改变内容消费模式.本文将带您从零开始构建一个 ...

  5. K8s新手系列之Pod容器中的command和args指令

    概述 command和args是containers下的两个指令,类似Dockerfile中的ENTRYPONIT和CMD指令. 官方文档地址:https://kubernetes.io/zh-cn/ ...

  6. 【记录】PR使用技巧记录

    @ 目录 [PR最重要的两个操作] 一.关键帧 1. 如何设置关键帧? 2. 应用实例 1)1s内视频从明变暗 2)1s内视频画面由大到小 二.入点.出点 [其他] PR批量调整视频效果 PR剪视频片 ...

  7. Vue3 学习-初识体验-helloworld

    在数据分析中有一个最重要的一环就是数据可视化, 数据报表的开发. 从我从业这几年的经历上看, 经历了从业务系统导表格数据, 到Excel+PPT, 再是开源报表工具, 再是主流商业BI产品(低/零代码 ...

  8. System.Runtime.Serialization.SerializationException:“二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。

    var buffer = new byte[1024]; using (var ms = new MemoryStream(buffer)) { //xxx } 原因是buffer的长度过短,当接受到 ...

  9. Flume+Kafka获取MySQL数据

    摘要 MySQL被广泛用于海量业务的存储数据库,在大数据时代,我们亟需对其中的海量数据进行分析,但在MySQL之上进行大数据分析显然是不现实的,这会影响业务系统的运行稳定.如果我们要实时地分析这些数据 ...

  10. K&R 语法 vs. ANSI C 语法

    由于项目中使用了Bison,看到有个奇怪的C语言的语法,查了一下居然是要兼容早期的C标准 Bison 是什么? Bison 是一个 语法分析器生成器(parser generator),它用于根据 上 ...