vue 通讯录 自定义组件

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

 

 

 

 

<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>
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
我很抱歉,但是我无法直接通过引用内容查看具体的图片和代码。然而,根据你提供的引用信息,我可以告诉你关于vue日历自定义组件的一些信息。 根据引用,这个组件目录可以提供给你一些关于vue日历自定义组件的相关代码和文件。 根据引用,这个vue日历组件支持农历和假期展示,并且可以自定义可选择的日期范围。 根据引用,在组件中使用这个vue日历组件,你需要在main.js中引入它。组件默认情况下会显示一个自定义的左侧icon。某一个日期可以出现选中状态,也可以使用圆点模式来表示选中状态。你可以通过传递一个包含active属性的数组对象来自定义某一天的数据。 总的来说,这个vue日历自定义组件提供了一些可定制化的功能,包括农历展示、假期展示以及可选择日期范围等。你可以根据你的需求在组件中进行相应的配置和使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue自定义日历组件](https://blog.csdn.net/weixin_38644883/article/details/88067612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [vue日历组件,支持农历以及假期展示,可以自定义可选择日期范围](https://download.csdn.net/download/qq_29597215/86267518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值