美文网首页
怎么实现通讯录字母表

怎么实现通讯录字母表

作者: 阳光之城alt | 来源:发表于2018-07-05 18:41 被阅读0次
    image.png

    参考网站: https://github.com/ustbhuangyi/better-scroll

            npm install better-scroll --save  
            import BScroll from 'better-scroll'
    
    <template>
        <div>
            <cityheader></cityheader> 
            <seader></seader>
            <list :aases="aases" :bbses="bbses" ></list>  
            <alphabet :bbses="bbses"></alphabet>
        </div>
    </template>
    
    <script>
    // import axios  from 'axios'
    import cityheader from './components/header'
    import seader from './components/seader'
    import list from './components/list'
    import alphabet from './components/alphabet'
    import axios from 'axios'
    
    export default {
        name:'city',
        components: {
            cityheader,
            seader,
            list,
            alphabet
        },
        data(){
            return {
                aases:{}, //热门城市
                bbses:[]  //字母表城市
            }
        },
        methods:{ 
            getcityinfo () {
               axios.get('/static/mock/city.json')
               .then(this.handlecityfo)
            },
            handlecityfo (res) {
                res=res.data
                if(res.ret&&res.data){
                    const data=res.data
                    this.aases=data.hotCities
                    this.bbses=data.cities
                }
            }
        },
        mounted () {
            this.getcityinfo()
        }
    }
    </script>
    
    <style lang="stylus" scoped>
    
    </style>
    
    
    

    主体

    <template>
        <div class="list" ref="wraper">
    
           <div class="">
                <div class="area">
                    <div class="title border-topbottom">当前城市</div>
                    <div class="button-list">
                        <div class="button-wrapper">
                        <div class="button"> 北京</div>  
                        </div>
                    </div>
                </div>
                <div class="area">
                    <div class="title border-topbottom" >热门城市</div>
                    <div class="button-list">
                        <div class="button-wrapper" v-for="item of aases" :key="item.id" >
                           <div class="button"> {{item.name}}</div>  
                        </div>
                    </div>
                </div>
                <div class="area" v-for="(item,key) of bbses" :key="key">
                    <div class="title border-topbottom">{{key}}</div>
                    <div class="item-list" >
                        <div class="item  border-bottom"  
                          v-for="instem of item"
                          :key="instem.id"
                        >
                         {{instem.name}}
                        </div>
                    </div>
                </div>
    
            </div> 
    
        </div>
    </template>
    
    <script>
    import bscroll from 'better-scroll'
    export default {
        name:'citylist',
        props:{
            aases:Array,
            bbses:Object
        },
        mounted() {
            this.scroll=new bscroll(this.$refs.wraper)
        }
    }
    </script>
    
    
    <style lang="stylus" scoped>
           @import '~styles/varibles.styl' 
            .border-topbottom
                &:before
                    border-color #cccccc
                &:after
                    border-color #cccccc
            .border-bottom
                &:before
                    border-color #cccccc
            .list
               overflow hidden
               position absolute
               top 1.58rem
               left 0
               bottom 0 
               right 0 
               .title
                    line-height  .54rem
                    background  #eeeeee
                    padding-left .2rem
                    color #666
                    font-size .26rem
                .button-list
                    padding .1rem 0.6rem .1rem .1rem
                    overflow hidden
                    .button-wrapper
                        float left
                        width 33.33% 
                        padding .1rem 
                        box-sizing border-box
                        .button
                            padding .1rem 0
                            text-align center
                            border 0.02rem solid #cccccc
                            border-radius 0.06rem
                .item-list
                .item
                 line-height .76rem
                 color #666
                 padding-left .2rem
    
    </style>
    

    滑动

    <template>
        <div class="list" >
           <ul>
               <li class="item" 
                    v-for="item of lesttr" 
                    :key="item"
                    :ref="item"
                    @touchstart="handtouchstart"
                    @touchmove="handletouchmove"
                    @touchend="handletouchend"
                    @click="handclick"
                    >{{item}}</li>
           </ul>  
        </div>
    </template>
    
    <script>
    
    export default {
        name:'cityalphabet',
        props:{
            bbses:Object
        },
        data(){
            return{
                touchstart:false,
                starty:0,
                tiemr:null  
            }
        },
        updated() {
            this.starty=this.$refs['A'][0].offsetTop
        },
        computed:{
            lesttr(){
                const lesttr=[]
                for(let i in this.bbses){
                    lesttr.push(i)
                }
                return lesttr
            }
        },
        methods:{
            handclick(e){
               this.$emit('change',e.target.innerText)
            },
            handtouchstart(e){
                this.touchstart=true
            },
            handletouchmove(e){
                if(this.touchstart){
                    if(this.timer){ //move 截流操作
                        clearTimeout(this.tiemr)
                    }else{
                        this.timer=setTimeout(()=>{
                            // const starty= //获取第一个数字的离父元素的高度
                            const touchy=e.touches[0].clientY-79  //获取中间的高度
                            const indexr =Math.floor((touchy-this.starty)/20)//每一个字母的高度
                            if(indexr>=0 && indexr <this.lesttr.length ){ 
                                this.$emit('change',this.lesttr[indexr]) //触发事件
                            }
                        },20)
                    }
                        
                }
            },
            handletouchend(e){
                this.handletouchend=false
            }
        }
        
    }
    </script>
    
    
    <style lang="stylus" scoped>
           @import '~styles/varibles.styl' 
          .list
            display flex
            flex-direction column
            justify-content center
            position absolute
            right 0
            top 1.6rem
            bottom 0
            width .4rem
            .item
                text-align center
                line-height .44rem
                color #000
    </style>
    

    相关文章

      网友评论

          本文标题:怎么实现通讯录字母表

          本文链接:https://www.haomeiwen.com/subject/dwtmuftx.html