vant封装城市/联系人等选择器
封装成组件
<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封装城市/联系人等选择器的更多相关文章
- javascript封装id|class|元素选择器
由于各个浏览器都支持的选择方法只有如下三种: 1 document.getElementById() 2 document.getElementsByName() 3 document.getElem ...
- 关于js封装框架类库之选择器引擎(二)
在上篇介绍了选择器的获取标签.id.类名的方法,现在我们在上篇基础上继续升级 1.问题描述:上篇get('选择器')已经实现,如果get方法里是一个选择器的父元素,父元素是DOM对象,那么如何获取元素 ...
- 关于js封装框架类库之选择器引擎(一)
选择器模块之传统做法 var tag = function (tag){ return document.getElementsByTagName(tag); } var id = function ...
- 教你一个vue小技巧,一般人我不说的
本文由云+社区发表 1. 需求 最近的项目中,需要实现在vue框架中动态渲染带提示框的单选/多选文本框,具体的效果如下图所示,在输入框聚焦时,前端组件通过接收的kv参数渲染出选项,用户点击选项,可以将 ...
- 记录 vant Picker 选择器,实现三级联动,传对应省市区code值
最近使用vant UI写移动端,感觉还不错 功能挺全的,带的还有省市区三级联动. 但是 突然遇到一个 产品要传的 省市区的code码,还和vant的 邮编不一样,我*****. 看了一下vant UI ...
- 第一百三十九节,JavaScript,封装库--CSS选择器
JavaScript,封装库--修改元素选择器 就是将构造库函数修改成元素选择器,像css那样,输入#xxx .xxx xxx (获取指定id下的指定class下的指定标签元素) 修改后的基础库 / ...
- JQuery选择器转义说明
JQuery选择器 JQuery选择器规则, 借用了css1-3的规则(css选择器规则), 因为css本身也需要一套规则来索引DOM元素, 进而进行样式渲染,例如div.blue 表示目标DOM为 ...
- selenium数据驱动模式实现163邮箱的登录及添加联系人自动化操作
项目结构如下: 要求python3.0 selenium3.0 下面是代码: appModubles:addContactPersonActtion.py和LoginAction.py addCont ...
- 谜一样的jquery之$选择器
jquery是一个强大的js类库,提供了很多便利的操作方法并兼容不同的浏览器,一旦使用便欲罢不能,根本停不下来,今天我们就来解读一下这个神秘的jquery源代码. 前几天思考再三,自己尝试着封装了一下 ...
- Android 时间范围选择器PickTimeDialog
个人提供了自己封装的第三方时间选择器,能够自定义时间格式,以及设置时间范围. 基础使用 PickTimeDialog pickDilog= new PickTimeDialog(this).setMa ...
随机推荐
- Jmeter参数化总结
参数化步骤: 1.连接数据库 2.获取account表手机号数据 3.获取手机号个数 4.增加For Each控制器 5.将请求添加至循环控制器里面 脚本:循环登录.jmx 页面如下: 下面主要说明F ...
- addAll(Collection<? extends E> c)的方法源码
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess ...
- 如果 MySQL 中没有 MVCC,会有什么影响?
如果 MySQL 中没有 MVCC,会有什么影响? MVCC(Multi-Version Concurrency Control) 是 MySQL(尤其是 InnoDB 存储引擎)中一个至关重要的并发 ...
- Stream流式编程工具类,开发必备
把自己写的流式编程工具分享出来,不涉及公司业务,非常便捷,不用在业务层看到一条龙式的Stream代码了: 大家用的最多的应该是转list,转set,以及setVFromE: 觉得好用点个赞就行 imp ...
- pandas 将excle两行或多行文本合并为一行
原有excle 目的: # j加载另一份数据源 import pandas as pd import xlrd import time from xlutils.copy import copy fr ...
- Web前端入门第 43 问:CSS 动画之过渡属性 transition 改变用户体验
CSS3 规范出现之前,要实现一个动画效果那必须借助 JavaScript 的能力才够得着,所以当时的前端开发但凡听到动画交互,那眉头可就成了一个川字儿了~ transition 的出现,改变了实现动 ...
- 【记录】手机QQ和电脑QQ里的emoji种类有什么差异?
版本 手机 QQ:V 8.9.76.12115 电脑 QQ:QQ9.7.15(29157) 偶然发现,有一种emoji手机上怎么找都找不到,一开始以为自己失忆了,后来发现这种emoji只在电脑上有. ...
- SpringBoot 在IDEA中用MAVEN打包报错
今天在打包的时候遇到一个报错,项目可以正常运行但是就是无法使用MAVEN 的insert和package进行打包 报错如下 [ERROR] Tests run: 1, Failures: 0, Err ...
- Seata源码—2.seata-samples项目介绍
大纲 1.seata-samples的配置文件和启动类 2.seata-samples业务服务启动时的核心工作 3.seata-samples库存服务的连接池配置 4.Seata对数据库连接池代理配置 ...
- Claude 4炸裂发布!凭什么敢称宇宙最强编程 AI?
5 月 23 日,Claude 官方宣布推出下一代 Claude 模型:Claude Sonnet 4 和 Claude Opus 4,直接 在全世界的 AI 圈掀起了新的风暴! 据官方称,Claud ...