基于vue的tab-list类目切换商品列表组件的示例代码


Posted in Javascript onFebruary 14, 2020

在大多数电商场景中,页面都会有类目切换加上商品列表的部分,页面大概会长这样

基于vue的tab-list类目切换商品列表组件的示例代码

基于vue的tab-list类目切换商品列表组件的示例代码

每次写类似场景的时候,都需要去为类目商品列表写很多逻辑,为了提高开发效率我决定将这一部分抽离成组件。

实现

1.样式

所有tab栏的样式和商品列表的样式都提供插槽,供业务自己定制

2.变量

isTabFixed: false,//是否吸顶
tab: 1,//当前tab
page: 1,//当前页数
listStatus: {
 finished: false,//是否已是最后一页
 loading: false,//是否加载中
},
items: [],//商品数组
tabMap: [],//tab列表数组
cache:{},//缓存
listName: '',//商品列表名称
tabName: '',//tab列表名称
apiName: '',//api方法名称
queryName: '',//api请求参数名称

3.缓存设计

为了减少消耗,已经请求过的商品列表我都将他们缓存下来

_addCache(proList) {
 cache[this.tab] = {
 finished: this.listStatus.finished,
 page: this.page,
 list: proList,
 };
},

4.请求数据

_getList(type) {
 let data = {};
 data[this.queryName] = this.tab;
 data.page = this.page;
 this.$http[this.apiName](data)
 .then((res) => {
 this.listStatus.finished = !res.has_more;//更新是否是最后一页的状态
 this._handleData(res.items);//处理得到的商品列表
 })
 .catch((err) => {
 note(err.message || '出错啦');
 });
},
_handleData(proList) {
 if (this.page === 1) {//表示是tab切换时请求的数据,所以直接将items的指向切换
 this.items = proList;
 } else {//因为是翻页,所以需要把数据拼接
 this.items = this.items.concat(proList);
 }
 this.$store.setData(this.listName, this.items);//把数据更新给父组件
 this._addCache(this.items);//把数据加入缓存
},

5.操作

逻辑部分主要分两块:一是列表翻页,二是tab相关

列表翻页

这部分的逻辑比较简单,主要分两点

  1. 将page加一
  2. 请求数据
_loadmore() {
 this.page = this.page + 1;
 this._getList();
},

其实对于手机列表的上拉翻页操作,还有很多的点要去注意,比如如何去避免连续请求等,由于我将这些交给了另一个专注列表渲染的组件,这里就不需要再去考虑这些操作。

tab相关

tab切换

tab切换的时候主要是两点

  1. 切换tab的指向
  2. 切换items的指向
  • 已经加载过的列表从缓存中取
  • 没有加载过的请求数据 然后还有两个体验上的点
  1. 视图应该回到顶部
  2. 切换的时候应该获取切换列表的第一页数据
changeTab(id) {
 this.tab = id;
 this.$store.setData(this.tabName, this.tab);//将tab的指向同步给父组件
 this._scrollToTab();//视图回到顶部
 if (cache[this.tab]) {
 const target = cache[this.tab];
 this.listStatus.finished = target.finished;
 this.page = target.page;
 this.items = target.list;
 this.$store.setData(this.listName, this.items);//将商品列表同步给父组件
 } else {
 this.page = 1;
 this._getList();
 }
},
//视图回到顶部
_scrollToTab() {
 let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
 let productsTop = this.$refs.products.$el.offsetTop;//商品列表距离顶部的距离
 let topHeight = this.$refs.tabNav.offsetHeight;//tab栏的高度
 if (scrollTop > productsTop) {
 window.scrollTo(0, productsTop - topHeight);
 }
},

吸顶

在吸顶的时候,需要对tab栏的样式做一些小小的变动,所以需要一个变量来知道是否吸顶了

handleNavFixed() {
 this.stickyTop = this.$store.getData('stickyTop') || 0;//吸顶的高度
 window.onscroll = (e) => {
 let top = document.documentElement.scrollTop || document.body.scrollTop;
 let tabHeight = this.$refs.tabNav.offsetTop - top - 1;
 if (tabHeight <= this.stickyTop && !this.isTabFixed) {//结合判断为了避免重复计算
 this.isTabFixed = true;
 }
 if (tabHeight >= this.stickyTop && this.isTabFixed) {
 this.isTabFixed = false;
 }
 };
},

6.组件相关

作为一个组件,不同点在于需要做到的是可用性和通用性。 对于组件如何更好的得到父组件的值并把更新的值传回父组件方面,是我在开发过程中的一个卡点,最后我用了一套基于vue的组件通行机制。这种通行机制的实现网上很多,这里就不详细说了。通行机制主要有两个功能

  • 各组件间可以互相调用方法
  • 各个组件都可以得到和更新父组件的数据

由于将tab列表都作为插槽传入,所以初始数据并不需要关心,需要关心的只是更新数据。

对于不同的页面,tab列表的名称,tab定位的名称,商品列表的名称,接口的名称,请求接口的参数都可以会不一样,所以我在这里将这些项作为参数,在初始化这个组件的时候需要传入

//组件部分
init(data = {}) {
 this.listStatus.finished = !data.hasMore;
 this.tabName = data.tabName;
 this.listName = data.listName;
 this.apiName = data.apiName;
 this.queryName = data.queryName;
 this.handleNavFixed();//判断是否吸顶
},
//调用组件
this.$bus.emit('tab-list.init', {
 tabName: 'tab',
 listName: 'items',
 apiName: 'homeList',
 queryName: 'tab_id',
 hasMore: this.hasMore,
});

总结

以上所述是小编给大家介绍的基于vue的tab-list类目切换商品列表组件的示例代码,希望对大家有所帮助!

Javascript 相关文章推荐
侧栏跟随滚动的简单实现代码
Mar 18 Javascript
Javascript保存网页为图片借助于html2canvas库实现
Sep 05 Javascript
jQuery异步获取json数据方法汇总
Dec 22 Javascript
js实现拖拽效果
Feb 12 Javascript
JS截取与分割字符串常用技巧总结
Nov 10 Javascript
详解js中class的多种函数封装方法
Jan 03 Javascript
JavaScript控制浏览器全屏显示简单示例
Jul 05 Javascript
微信小程序实现授权登录
May 15 Javascript
es6 for循环中let和var区别详解
Jan 12 Javascript
解决antd Form 表单校验方法无响应的问题
Oct 27 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
Dec 16 Javascript
利用JS判断元素是否为数组的方法示例
Jan 08 Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 #Javascript
JavaScript实现Tab选项卡切换
Feb 13 #Javascript
Angular 多模块项目构建过程
Feb 13 #Javascript
小程序卡片切换效果组件wxCardSwiper的实现
Feb 13 #Javascript
JavaScript实现省市区三级联动
Feb 13 #Javascript
jquery传参及获取方式(两种方式)
Feb 13 #jQuery
JS实现页面数据懒加载
Feb 13 #Javascript
You might like
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
Prototype Number对象 学习
2009/07/19 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
javascript每日必学之循环
2016/02/19 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
在angular 6中使用 less 的实例代码
2018/05/13 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
python实现RSA加密(解密)算法
2016/02/17 Python
Python 面试中 8 个必考问题
2018/11/16 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
Python编写打字训练小程序
2019/09/26 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
Python 存取npy格式数据实例
2020/07/01 Python
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
工程造价自荐信
2013/10/09 职场文书
酒吧副总经理岗位职责
2013/12/10 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
财产公证书格式
2014/04/10 职场文书
社区志愿者活动总结
2014/06/26 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫
pt-archiver 主键自增
2022/04/26 MySQL