vue兄弟组件联动之app点击字母展示地区列表

图上这种地区搜索方式在很多app中都很常见,今天就使用vue框架中的 better-scroll 第三方包来实现页面滚动和点击侧边栏字母该字母开头的地区列表置顶功能。

better-scroll链接:https://github.com/ustbhuangyi/better-scroll

 

1、A子组件通过使用 this.$emit(事件名字,事件携带内容) 向外触发事件

首先,在<city-alphabet>组件每个字母元素上绑定事件,在该事件中向外触发事件,并将值传递出去:

<template>
    <ul class="list">
        <li class="item" 
        v-for="(item,key) in city" 
        :key="key"
        @click="handleLetterClick"
        >
        {{ key }}
        </li>
    </ul>
</template>
methods:{
    handleLetterClick(e){
        this.$emit('change',e.target.innerText)
    }
}

2、父组件接收A组件传过来的事件,并通过属性来向B组件传值

因为<city-alphabet>组件传递过来的是单个字符串,所以,先在data中定义一个属性letter来接收这个值;

并在父组件模板中的<city-alphabet>组件中定义传递的方法@change="handleLetterChange"用来获取传递的值;

将letter属性传递给另一个子组件<city-list>;

<template>
    <div>
        <city-list 
        :city="cities" 
        :hot="hotCities"
        :letter="letter"
        ></city-list>
        <city-alphabet 
        :city="cities"
        @change="handleLetterChange"
        ></city-alphabet>
    </div>
</template>
data(){
    return{
        letter:''
    }
},
methods:{
    handleLetterChange(letter){
        this.letter = letter
    }
},

3、B组件接收父组件传递过来的属性,并通过watch监听参数的变化,然后执行页面的滚动显示

首先,给每个地址列表区域元素加 ref ,better-scroll会根据ref给指定区域进行操作;

然后使用watch监听letter变化,并使用better-scroll中的scrollToElement接口执行页面滚动;

<div class="area" 
v-for="(item,key) in city" 
:key="key"
:ref="key"
>
    ...
</div>

props:{
    letter:String
},
watch:{
    letter(){
        if(this.letter){
            // scrollToElement里只接受单个DOM元素,不接收数组
            //因为上面的div元素是数组渲染出来的,所以这里this.$refs得到的是数组
            const element = this.$refs[this.letter][0]
            this.scroll.scrollToElement(element)
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值