vue——better-scroll(滚动组件以及回到顶部组件)

滚动组件以及回到顶部组件封装

步骤:

  • 安装依赖
cnpm install better-scroll --save
  • 封装Scroller组件
//当变量是对象或者数组的时候,默认值是方法
data() {
 return {
   scroller: {
     type: Object,
     default() {
       return {};
     },
   },
 };
},
 //接收父组件来的值
  props: {
    probeType: {
      type: Number,//probeType值为0,1时,不监听;probeType为2时,手指触摸时监听,惯性滑动不监听;值为3时,都监听
      default: 0,
    },
    pullUpload: {
      type: Boolean,
      default: false,
    },
  },
  • 需要引用Scoller组件的父组件
  1. 先引用
  2. 然后给scroll加样式
  3. ref加标识
  4. :probe-type="3"传值给scroll组件
  5. @scroll监听——来自scroll组件中的this.$emit("scroll", postion);
  6. :pull-upload="true"传值给scroll组件(注意pullUpLoad: this.pullUpload, // 是否加载更多中的pullUpLoad写法)
  7. @pullingUp(上拉加载更多)监听——来自scroll组件中的this.$emit("pullingUp");
1、import Scroller from "@/components/common/scroller/Scroller"; //滚动
2、页面引用
<scroller
      class="home-scroller"
      ref="scroller"
      :probe-type="3"
      @scroll="contentScroll"
      :pull-upload="true"
      @pullingUp="loadMore"
    >
    滑动的内容
    </scroller>
    3、css
    //div样式
  #home {
  padding-top: 44px;
  height: 100vh;
  position: relative;
}
//scroll样式
   .home-scroller {
  /*height:300px;*/
  overflow: hidden;
  position: absolute;
  top: 44px;
  bottom: 49px;
  right: 0;
  left: 0;
}
  • 回到顶部组件
  1. 引用组件import BackTop from "@/components/contents/backTop/BackTop"; //回到顶部
  2. 监听点击事件 <back-top @click.native="backClick" v-show="isShowBack"></back-top>
  3. 调用scroll中的scrollTo方法this.$refs.scroller.scrollTo(0, 0);

代码如下:

Scroller组件
<template>
  <div ref="wrapper">
    <div class="content">
      <slot></slot>
    </div>
  </div>
</template>

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

export default {
  name: "scroller",
  data() {
    return {
      scroller: {
        type: Object,
        default() {
          return {};
        },
      },
    };
  },
  //接收父组件来的值
  props: {
    probeType: {
      type: Number,
      default: 0,
    },
    pullUpload: {
      type: Boolean,
      default: false,
    },
  },
  mounted() {
    this.scroller = new BScroll(this.$refs.wrapper, {
      probeType: this.probeType, //是否监听
      pullUpLoad: this.pullUpload, // 是否加载更多
      click:true//不加,不能实现点击事件
    });
    // 监听
    this.scroller.on("scroll", (postion) => {
      this.$emit("scroll", postion);
    });
    // 上拉加载更多
    this.scroller.on("pullingUp", () => {
      this.$emit("pullingUp");
    });
  },
  methods: {
    scrollTo(x, y, time = 300) {
      this.scroller.scrollTo(0, 0, time);
    },
    finishPullUp() {
      this.scroller.finishPullUp();
    },
  },
};
</script>

<style scoped>
</style>

Home组件

<template>
  <div id="home">
    <nav-bar class="home-nav-bar">
      <div slot="center">购物街</div>
    </nav-bar>
    <scroller
      class="home-scroller"
      ref="scroller"
      :probe-type="3"
      @scroll="contentScroll"
      :pull-upload="true"
      @pullingUp="loadMore"
    >
      <home-swiper :cbanners="banner"></home-swiper>
      <home-recommend :cproducts="recommend"></home-recommend>
      <home-feature-view></home-feature-view>
      <tab-control class="tab-control" :ctitles="['流行','新款','精选']" @click="tabClick"></tab-control>
      <div>
        <ul>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
          <li>sasa</li>
        </ul>
      </div>
    </scroller>
    <!-- <goods-list :goodItem="showGoods" /> -->
    <!-- native监听组件 -->
    <back-top @click.native="backClick" v-show="isShowBack"></back-top>
  </div>
</template>

<script>
import HomeSwiper from "./childComps/HomeSwiper"; //轮播图(vueui库,可以搜索到类似插件)
import HomeRecommend from "./childComps/HomeRecommend"; //推荐组件
import HomeFeatureView from "./childComps/HomeFeatureView"; //特点分类组件
// 公共组件
import NavBar from "@/components/common/navbar/NavBar"; //头部
import TabControl from "@/components/contents/tabcontrol/TabControl"; //分类商品
import GoodsList from "@/components/contents/good/GoodsList"; //商品列表
import Scroller from "@/components/common/scroller/Scroller"; //滚动
import BackTop from "@/components/contents/backTop/BackTop"; //回到顶部
// 接口
import { getHomeMultiData, getHomeGoods } from "@/network/home"; //调用接口
export default {
  name: "Home",
  components: {
    HomeSwiper,
    HomeRecommend,
    HomeFeatureView,
    NavBar,
    TabControl,
    GoodsList,
    Scroller,
    BackTop,
  },
  data() {
    return {
      banner: [],
      dKeyword: [],
      keywords: [],
      recommend: [],
      goods: {
        pop: { page: 0, list: [] },
        new: { page: 0, list: [] },
        sell: { page: 0, list: [] },
      },
      currentType: "pop",
      isShowBack: false,
    };
  },
  //生命周期函数
  created() {
    this.MgetHomeMultiData();
    this.MgetHomeGoods(
      "pop"
    ); /* 
    this.MgetHomeGoods("new");
    this.MgetHomeGoods("sell"); */
  },
  methods: {
    /*
     * 事件监听相关的方法
     */
    // 分类商品
    tabClick(index) {
      switch (index) {
        case 0:
          this.currentType = "pop";
          break;
        case 1:
          this.currentType = "new";
          break;
        case 2:
          this.currentType = "sell";
          break;
      }
    },
    // 回到顶部
    backClick() {
      this.$refs.scroller.scrollTo(0, 0);
    },
    // 监听滚动
    contentScroll(position) {
      this.isShowBack = -position.y > 0;
    },
    // 加载更多
    loadMore() {
      this.getHomeGoods(this.currentType)
    },
    /*
     *网络请求相关方法
     */
    // 请求多个数据
    MgetHomeMultiData() {
      getHomeMultiData().then((res) => {
        this.banner = res.data.banner.list;
        this.dKeyword = res.data.dKeyword.list;
        this.keywords = res.data.keywords.list;
        this.recommend = res.data.recommend.list;
      });
    },
    //商品数据
    MgetHomeGoods(type) {
      const page = this.goods[type].page + 1;
      getHomeGoods(type, page).then((res) => {
        this.goods[type].list.push(...res);
         this.$refs.scroller.finishPullUp();
      });
    },
  },
  computed: {
    showGoods() {
      return this.goods[this.currentType].list;
    },
  },
};
</script>
<style scoped>
/* scoped 域 */
#home {
  padding-top: 44px;
  height: 100vh;
  position: relative;
}

.home-nav-bar {
  background-color: var(--color-tint);
  color: #fff;

  position: fixed;
  left: 0;
  right: 0;
  top: 0;
  z-index: 9;
}

.home-tab-control {
  /*两个要混合使用*/
  position: sticky;
  top: 43px; /*顶部navbar的高度*/
  z-index: 9;
}

.home-scroller {
  /*height:300px;*/
  overflow: hidden;
  position: absolute;
  top: 44px;
  bottom: 49px;
  right: 0;
  left: 0;
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue是一种用于构建用户界面的渐进式JavaScript框架,它可以帮助开发者更高效地构建单页面应用程序。而vue-better-scroll是基于Vue的一款优秀的滚动插件,它能够实现更流畅的滚动效果,并且支持上下左右的滚动和联动效果。 如果需要实现左右侧菜单的联动效果,我们可以通过使用vue-better-scrollscrollToElement方法来实现。首先,我们需要在Vue中引入vue-better-scroll插件并进行配置。 在Vue实例的data中,我们可以定义左右两个菜单的数据,例如leftMenu和rightMenu,并在created生命周期中初始化数据。然后,在mounted生命周期中,我们可以通过refs属性获取到两个菜单容器的DOM元素。 接下来,我们需要监听左边菜单的点击事件,当点击左边菜单的某个选项时,我们可以通过调用vue-better-scrollscrollToElement方法,将右边菜单滚动到对应的位置。通过传递目标元素的选择器或具体的DOM元素,我们可以实现左右菜单的联动效果。 具体实现时,我们可以在左边菜单的点击事件中,使用this.$refs来访问右边菜单容器,并调用scrollToElement方法,将目标元素滚动到可视区域。通过传递选择器或具体DOM元素作为参数,我们可以精确控制滚动的位置。 同时,为了视觉上更好的效果,我们还可以给目标元素添加样式,如高亮当前选中项,以提升用户体验。 最后,通过一系列的事件处理和样式设置,我们就可以实现左右侧菜单的联动demo了。 以上就是使用Vuevue-better-scroll实现左右侧菜单联动demo的大致思路和步骤。通过合理运用这两个工具,我们可以轻松地实现出一个流畅、友好的用户界面效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值