vue  自定义组件实现通讯录功能


Posted in Javascript onSeptember 30, 2018

在线demo:http://tangyupeng.top/dist/index.html#/phone

vue  自定义组件实现通讯录功能

vue  自定义组件实现通讯录功能

<template>
 <div>
  <my-header custom-title="通讯录" custom-fixed >
   <button @touchstart="backBtn" slot="left">首页</button>
   <button @touchstart="homeBtn" slot="right">+</button>
  </my-header>
  <my-list :user-data="userData"></my-list> <!-- 传递数据 -->
  <my-alert custom-title="呼叫">
   <div class="alert_btn">
     <button class="aler_tbn" @touchstart="confirmBtn">确认</button>
     <button class="aler_tbn" @touchstart="cancelBtn">取消</button>
    </div>
  </my-alert>
 </div>
</template>
<script>
import Vue from 'vue'; 
import Vuex from 'vuex'; 
var userData=[
  {"index":"A","users":[
   {"name":"a1","tel":"13333333331"},
   {"name":"a2","tel":"13333333332"},
   {"name":"a3","tel":"13333333333"},
  ]},
  {"index":"B","users":[
   {"name":"b1","tel":"13333333331"},
   {"name":"b2","tel":"13333333332"},
   {"name":"b3","tel":"13333333333"},
  ]},
  {"index":"C","users":[
   {"name":"c1","tel":"13333333331"},
   {"name":"c2","tel":"13333333332"},
   {"name":"c3","tel":"13333333333"},
  ]},
  {"index":"D","users":[
   {"name":"d1","tel":"13333333331"},
   {"name":"d2","tel":"13333333332"},
   {"name":"d3","tel":"13333333333"},
  ]},
  {"index":"E","users":[
   {"name":"e1","tel":"13333333331"},
   {"name":"e2","tel":"13333333332"},
   {"name":"e3","tel":"13333333333"},
  ]},
  {"index":"F","users":[
   {"name":"f1","tel":"13333333331"},
   {"name":"f2","tel":"13333333332"},
   {"name":"f3","tel":"13333333333"},
  ]},
  {"index":"F1","users":[
   {"name":"f1","tel":"13333333331"},
   {"name":"f2","tel":"13333333332"},
   {"name":"f3","tel":"13333333333"},
  ]},
  {"index":"F2","users":[
   {"name":"f1","tel":"13333333331"},
   {"name":"f2","tel":"13333333332"},
   {"name":"f3","tel":"13333333333"},
  ]},
  {"index":"F3","users":[
   {"name":"f1","tel":"13333333331"},
   {"name":"f2","tel":"13333333332"},
   {"name":"f3","tel":"13333333333"},
  ]},
  {"index":"F4","users":[
   {"name":"f1","tel":"13333333331"},
   {"name":"f2","tel":"13333333332"},
   {"name":"f3","tel":"13333333333"},
  ]},
  {"index":"F5","users":[
   {"name":"f1","tel":"13333333331"},
   {"name":"f2","tel":"13333333332"},
   {"name":"f3","tel":"13333333333"},
  ]},
];
var busVm=new Vue(); //空实例 非父子传递值
Vue.component('my-header',{
 template:`<div id="header" :style="{'position':customFixed ? 'fixed':'static'}">
   <slot name="left"></slot>
   {{customTitle}}
   <slot name="right"></slot>
 </div>`,
 props:{
  'customTitle':{
   type:String,
   default:"标题"
  },
  'customFixed':{
   type:Boolean,
   default:false
  }
 }
})
Vue.component('my-alert',{
 template:`<div id="alert" ref="alert">
    <div class="alert_content">
     <div class="alert_title">
      {{customTitle}}
     </div>
     <div class="alert_body">{{customBody}}</div>
     <slot></slot>
    </div>
  </div>`,
 props:{
  'customTitle':{
   type:String,
   default:"弹窗"
  },
 },
 data:function(){
   return{
    'customBody':''
   }
 },
 mounted:function(){
  busVm.$on('changeEvents',function(ev){
   console.log(ev);
   this.customBody=ev;
   this.$refs.alert.style.display="flex"
  }.bind(this));
 }
})
Vue.component('my-list',{
 template:`<div id="list">
      <ul class="list_user" ref="listuser" @touchmove="bMove=true">
       <li v-for="item in userData">
        <p>{{item.index}}</p>
        <ul>
         <li @touchend="showtel(user.tel)" v-for="user in item.users">{{user.name}}</li>
        </ul>
       </li>
      </ul>
      <ul class="list_index" ref="listIndex">
       <li @touchstart="setScroll" v-for="item in userIndex">{{item}}</li>
      </ul>
     </div>`,
 props:{
  'user-data':{
   type:Array,
   default:function(){
    return [];
   }
  }
 },
 data:function(){
  return {
   bMove:false
  }
 },
 computed:{
  userIndex:function(){
   console.log(this.userData)
   console.log(this.filterIndex(this.userData))
   return this.filterIndex(this.userData);
  }
 },
 methods:{
  filterIndex:function(data){
    var result=[];
    for(var i=0; i<data.length;i++){
     if(data[i].index){
      result.push(data[i].index);
     }
    }
    return result;
  },
  setlistIndexPos:function(){
   //   1、ref 加在普通的元素上,用this.ref.name 获取到的是dom元素
   // 2、ref 加在子组件上,用this.ref.name 获取到的是组件实例,可以使用组件的所有方法。
   // 
3、如何利用 v-for 和 ref 获取一组数组或者dom 节点
    var iH= this.$refs.listIndex.offsetHeight;
    this.$refs.listIndex.style.marginTop=-iH/2 +'px';
  },
  showtel:function(ev){
   if(!this.bMove){
     busVm.$emit("changeEvents",ev)
   }else{
    this.bMove=false;
   }
  },
  setScroll:function(ev){
   console.log(ev.target.innerHTML);
   var ap=this.$refs.listuser.getElementsByTagName('p');
   for(var i=0;i<ap.length;i++){
    if(ap[i].innerHTML==ev.target.innerHTML){
     document.body.scrollTop=ap[i].offsetTop;
     document.documentElement.scrollTop=ap[i].offsetTop;
     window.scrollTop=ap[i].offsetTop;
      console.log(ap[i].offsetTop);
    }
   }
  }
 },
 mounted:function(){
  this.setlistIndexPos();
 }
})
export default {
 name: "HelloWorld",
 data() {
  return {
   userData:userData //挂载数据
   }
  },
  methods:{
   backBtn:function(){
    alert("123")
   },
   homeBtn:function(){
    alert("123")
   },
   confirmBtn:function(){
    alert("a");
   },
   cancelBtn:function(){
     console.log(this);
     this.$children[2].$el.style.display="none"; //此处需要从外级找到
   }
  },
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style>
.page-container {
 position: absolute;
 left: 0;
 top: 0;
 width: 100%;
 height: 100%;
}
#alert{width: 100%; height: 100%; background: rgba(0,0,0,0.5); position: fixed; top: 0; top: 0; z-index: 20px; display: none;}
#alert .alert_content{width: 200px;position: relative; height: 150px; background: #fff;border-radius: 10px; margin: auto;}
.alert_body{height: 50px; line-height: 50px; text-align: center;}
.alert_btn{position: absolute;right: 0 ;bottom:0;}
.list_index{  position: fixed;list-style: none; padding-right: 10px; font-size: 20px; font-weight: 700;
  top: 50%;
  right: 0;}
  .alert_title{padding-top: 20px;}
#list .list_user p{background: #ccc; padding-left: 10px}
#list .list_user ul li{ padding-left: 10px;border-bottom: 1px solid #ccc; line-height:30px;}
#list{
   width: 100%;
  text-align: left;
   float: left;
 position: relative; top: 40px; overflow: hidden;
}
.aler_tbn{padding: 5px; margin-bottom: 5px; border-radius: 5px;}
button{background: #f60; color: #fff;}
#header{width: 100%;height:40px; background: #666; z-index:9999;color: #fff;text-align: center;line-height: 40px;font-size: 20px;}
#header button{height: 100%;padding: 0 5px}
#header button:nth-of-type(1){float: left}
#header button:nth-of-type(2){float: right}
</style>

总结

以上所述是小编给大家介绍的vue 通讯录 自定义组件功能的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 判断判断某个对象是Object还是一个Array
Jan 28 Javascript
javascript设计模式 封装和信息隐藏(上)
Jul 24 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
Feb 05 Javascript
JS操作iframe里的dom(实例讲解)
Jan 29 Javascript
javascript中不提供sleep功能如何实现这个功能
May 27 Javascript
JS定义类的六种方式详解
May 12 Javascript
js选项卡的制作方法
Jan 23 Javascript
javascript实现复选框全选或反选
Feb 04 Javascript
Vue.js实现实例搜索应用功能详细代码
Aug 24 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
Feb 28 Javascript
详解vue表单——小白速看
Apr 08 Javascript
vue中子组件的methods中获取到props中的值方法
Aug 27 Javascript
对angularJs中2种自定义服务的实例讲解
Sep 30 #Javascript
angularJs在多个控制器中共享服务数据的方法
Sep 30 #Javascript
iview Upload组件多个文件上传的示例代码
Sep 30 #Javascript
VUE 配置vue-devtools调试工具及安装方法
Sep 30 #Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
Sep 30 #Javascript
jQuery实现点击图标div循环放大缩小功能
Sep 30 #jQuery
angularJs使用ng-repeat遍历后选中某一个的方法
Sep 30 #Javascript
You might like
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
php实现插入排序
2015/03/29 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
prototype 学习笔记整理
2009/07/17 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
vue实现分页栏效果
2019/06/28 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
Python实现从订阅源下载图片的方法
2015/03/11 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
Python双链表原理与实现方法详解
2020/02/22 Python
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
3.12植树节活动总结2014
2014/03/13 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
首席执行官观后感
2015/06/03 职场文书
区域销售大会开幕词
2016/03/04 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
2022年显卡天梯图(6月更新)
2022/06/17 数码科技