vue通过better-scroll 封装自定义的下拉刷新组件

一、需求问题

在vue的项目中,我们可能也经常会遇到这样的需求。当在页面当中,对页面进行下拉刷新,重新请求数据,加载新的内容。针对这个,我们可以使用better-scroll,在此基础上进行封装下拉刷新组件,实现多个页面都可以使用这个组件,下拉刷新,得到复用。

二、需求分析

  1. 在components文件夹中,建立Scroller文件夹,里面建立index.vue文件,作为Scroller组件。这个下拉刷新组件在页面的多个位置中都可能会用的到,可以全局注册组件。在项目的main.js文件中写以下的代码配置,进行全局注册
import Scroller from '@/components/Scroller'
//  全局注册 Scroller 组件
Vue.component('Scroller', Scroller);
  1. Scroller组件中,引入better-scroll,在props中,写handleToScrollhandleToTouchEnd这两个属性,在后面组件传值的时候需要使用。在mounted()钩子函数中,通过 new BScroll创建对象,传入DOM对象和配置参数项。通过scroll.on进行绑定scrolltouchEnd事件,在后面通过pos参数写回调函数,分别调用handleToScrollhandleToTouchEnd

  2. 在需要用到的页面中,就可以直接写Scroller组件,在组件内部进行绑定属性,handleToScrollhandleToTouchEnd这两个属性,它们也是函数。在methods中,写handleToScrollhandleToTouchEnd 这两个函数,参数为pos,通过pos.y进行判断位置,然后执行相应的操作。同时在data中,写pullDownMsg参数为空,这个会进行动态的显示提示消息,赋予不同的值。

<Scroller  :handleToScroll="handleToScroll" :handleToTouchEnd="handleToTouchEnd">

三、需求实现

  1. main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

import axios from 'axios'
Vue.prototype.axios = axios;

Vue.filter('setWH', (url, arg) => {
  return url.replace(/w\.h/, arg);
});

Vue.config.productionTip = false;

import Scroller from '@/components/Scroller'
//  全局注册 Scroller 组件
Vue.component('Scroller', Scroller);


new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
  1. Scroll文件夹下的index.vue,封装组件
<template>
    <div class="wrapper" ref="wrapper">
        <!-- solt 插槽实现内容分发 -->
        <slot></slot>
    </div>
</template>

<script>
import BScroll from 'better-scroll';

export default {
    name: 'Scroller',
    props: {
        handleToScroll: {
            type: Function,
            default: function() {}
        },
        handleToTouchEnd: {
            type: Function,
            default: function() {}
        }
    },
    mounted() {
        var scroll = new BScroll( this.$refs.wrapper, {
            tap: true,
            probeType: 1
        });

        this.scroll = scroll;

        scroll.on('scroll', (pos) => {
            this.handleToScroll(pos);
        });

        scroll.on('touchEnd', (pos) => {
            this.handleToTouchEnd(pos);
        });
    },
    methods: {
        toScrollTop(y) {
            this.scroll.scrollTo(0,y);
        }
    }
    
}
</script>

<style scoped>
.wrapper { height: 100%; }
</style>
  1. movie下的index.vue, 路由页面使用组件
<template>
    <div class="movie_body" ref="movie_body">
        <Scroller  :handleToScroll="handleToScroll" :handleToTouchEnd="handleToTouchEnd">
            <ul>
                <li class="pullDown">{{ pullDownMsg }}</li>
                <li v-for="item in movieList" :key="item.id">
                    <div class="pic_show" @tap="handleToDetail"><img :src="item.img | setWH('128.180')"></div>
                    <div class="info_list">
                        <h2>{{ item.nm }} <img v-if="item.version" src="@/assets/maxs.png"></h2>
                        <p>观众评 <span class="grade">{{ item.sc }}</span></p>
                        <p>主演: {{ item.star }}</p>
                        <p>{{ item.showInfo }}</p>
                    </div>
                    <div class="btn_mall">
                        购票
                    </div>
                </li>
            </ul>
        </Scroller>
    </div>
</template>
    
<script>

export default {
    name: 'NowPlaying',
    data() {
        return {
            movieList: [],
            pullDownMsg: '',
        }
    },
    mounted() {
        this.axios.get('/api/movieOnInfoList?cityId=10').then((res) => {
            var msg = res.data.msg;
            if( msg === 'ok') {
                this.movieList = res.data.data.movieList;
            }
        })
    },
    methods: {
        handleToDetail () {
            console.log('handleToDetail');
        },
        handleToScroll (pos) {
            if ( pos.y > 30 ) {
                this.pullDownMsg = '正在更新中...';
            }
        },
        handleToTouchEnd (pos) {
            if ( pos.y > 30 ) {
                this.axios.get('/api/movieOnInfoList?cityId=10').then( (res) => {
                    var msg = res.data.msg;
                    if ( msg === 'ok') {
                        this.pullDownMsg = '更新完成';
                        setTimeout(() => {
                            this.movieList = res.data.data.movieList;
                            this.pullDownMsg = ''
                        }, 1000);
                    }
                });
            }
        }
    }
}
</script>

<style scoped>
#content .movie_body{ flex:1; overflow:auto;}
.movie_body ul{ margin:0 12px; overflow: hidden;}
.movie_body ul li{ margin-top:12px; display: flex; align-items:center; border-bottom: 1px #e6e6e6 solid; padding-bottom: 10px;}
.movie_body .pic_show{ width:64px; height: 90px;}
.movie_body .pic_show img{ width:100%;}
.movie_body .info_list { margin-left: 10px; flex:1; position: relative;}
.movie_body .info_list h2{ font-size: 17px; line-height: 24px; width:150px; overflow: hidden; white-space: nowrap; text-overflow:ellipsis;}
.movie_body .info_list p{ font-size: 13px; color:#666; line-height: 22px; width:200px; overflow: hidden; white-space: nowrap; text-overflow:ellipsis;}
.movie_body .info_list .grade{ font-weight: 700; color: #faaf00; font-size: 15px;}
.movie_body .info_list img{ width:50px; position: absolute; right:10px; top: 5px;}
.movie_body .btn_mall , .movie_body .btn_pre{ width:47px; height:27px; line-height: 28px; text-align: center; background-color: #f03d37; color: #fff; border-radius: 4px; font-size: 12px; cursor: pointer;}
.movie_body .btn_pre{ background-color: #3c9fe6;}
.movie_body .pullDown{ margin: 0; padding: 0; border: none;}
</style>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue是一种用于构建用户界面的渐进式JavaScript框架,它可以帮助开发者更高效地构建单页面应用程序。而vue-better-scroll是基于Vue的一款优秀的滚动插件,它能够实现更流畅的滚动效果,并且支持上下左右的滚动和联动效果。 如果需要实现左右侧菜单的联动效果,我们可以通过使用vue-better-scroll的scrollToElement方法来实现。首先,我们需要在Vue中引入vue-better-scroll插件并进行配置。 在Vue实例的data中,我们可以定义左右两个菜单的数据,例如leftMenu和rightMenu,并在created生命周期中初始化数据。然后,在mounted生命周期中,我们可以通过refs属性获取到两个菜单容器的DOM元素。 接下来,我们需要监听左边菜单的点击事件,当点击左边菜单的某个选项时,我们可以通过调用vue-better-scroll的scrollToElement方法,将右边菜单滚动到对应的位置。通过传递目标元素的选择器或具体的DOM元素,我们可以实现左右菜单的联动效果。 具体实现时,我们可以在左边菜单的点击事件中,使用this.$refs来访问右边菜单容器,并调用scrollToElement方法,将目标元素滚动到可视区域。通过传递选择器或具体DOM元素作为参数,我们可以精确控制滚动的位置。 同时,为了视觉上更好的效果,我们还可以给目标元素添加样式,如高亮当前选中项,以提升用户体验。 最后,通过一系列的事件处理和样式设置,我们就可以实现左右侧菜单的联动demo了。 以上就是使用Vuevue-better-scroll实现左右侧菜单联动demo的大致思路和步骤。通过合理运用这两个工具,我们可以轻松地实现出一个流畅、友好的用户界面效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值