目录

  • 调整Order父组件结构(解决Bug)
  • 订单列表数据渲染
  • Loading 和 NoData优化
  • 订单列表分页 - 分页器
  • 订单列表分页 - 加载更多
  • 订单列表分页 - 滚动加载

(1)调整Order父组件结构(解决Bug)

之前在Vue项目实战:订单确认页面实现中关于订单父组件结构封装里写到:在order.vue中引入<order-header></order-header>,然后通过路由判断当前页面属于哪个,并展示不同内容。但现在发现那样子做存在一个问题:

问题

在使用微信支付完后跳转到订单列表页面,但是订单列表页面中的<order-header></order-header>的内容仍是订单支付页面中<order-header></order-header>的内容,没有变成<order-header></order-header>对应的内容。但是如果跳转完订单列表页面,在重新刷新一下页面,那<order-header></order-header>的内容就会改变。

原因

订单列表的路由是order的子路由,当我们从order路由跳转到它的子路由时,并不会再次执行order.vue中的mounted()函数。此函数只有在页面渲染时才会执行。也就是说,如果想用之前的方法,那只有在第一次从别的路由(比如购物车路由)跳转到订单列表路由时,此前order页面并没有被渲染过,则可以出现相应的<order-header></order-header>组件内容。如果是从订单订单确认跳转到订单列表的话,此时没有重新渲染order页面,那<order-header></order-header>内容不会改变。

解决方法

不用之前的第二种方法,删去之前路由判断的代码,而用第一次,在每个页面中引入<order-header></order-header>

如,在orderConfirm.vue:

    <order-header title="订单确认"><template v-slot:tip><span>请认真填写收货地址</span></template></order-header>
<script>
import OrderHeader from "./../components/OrderHeader";
export default {components: {OrderHeader,}
}

(2)订单列表数据渲染

在orderList.vue中:

<!-- 省略不重要代码,下面是如何判断并展示订单状态 --><div class="good-state fr" v-if="order.status == 20"><a href="javascript:;">{{order.statusDesc}}</a></div><div class="good-state fr" v-else><a href="javascript:;" @click="goPay(order.orderNo)">{{order.statusDesc}}</a></div>
<script>export default{data() {return {list: []}},mounted() {this.getOrderList();},methods: {getOrderList() {this.axios.get('/orders').then((res) => {this.list = res.list;})},goPay(orderNo) {//三种路由跳转方式this.$router.push({path: '/order/pay',query: {orderNo}})/* this.$router.push({name: 'order-pay',query: {orderNo}})*/ //this.$router.push('/order/pay')         }}}
</script>

(3)Loading 和 NoData优化

  • 在orderList.vue中引入并使用之前定义的Loading组件:

    这个优化是针对请求发出来,响应还没回来前做个loading处理。在请求时显示,请求回来后不显示。

<loading v-if="loading"></loading>   //3.使用组件
<script>import Loading from './../components/Loading';  //1.导入组件export default{components:{Loading  //2.注册组件},data() {return {loading: true}},methods: {getOrderList() {this.axios.get('/orders').then((res) => {this.loading = false;this.list = res.list;}).catch(() => {this.loading = false;})} }
  • NoData优化:

    在订单列表无数据时,显示NoData组件,给用户订单列表为空提示。

    在components文件夹中新建NoData.vue:

<template><div class="no-data"><img src="/imgs/icon-no-data.png" alt=""><p>当前暂无提交的订单记录.</p></div>
</template>
<!--此处省略样式等不重要代码-->

​ 在orderList.vue中引入并使用NoData组件:

<no-data v-if="!loading && list.length == 0"></no-data>
<script>import NoData from './../components/NoData';export default{components:{NoData},data() {return {list: [],loading: true}},methods: {getOrderList() {this.axios.get('/orders').then((res) => {this.loading = false;this.list = [] || res.list;}).catch(() => {this.loading = false;})},}}

(4)订单列表分页 - 分页器

​ 在orderList.vue中使用ElementUI中的Pagination组件:

          <el-paginationclass="pagination"backgroundlayout="pre, pager, next":pageSize="pageSize":total="total"@current-change="handleChange"></el-pagination>
<script>import {Pagination} from 'element-ui';export default{components:{[Pagination.name]: Pagination},data() {return {list: [],loading: false,pageSize: 10, //每页几条数据pageNum: 1,  //当前是第几页total: 0   //总条数};},mounted() {this.getOrderList();},methods: {getOrderList() {this.axios.get("/orders", {params: {pageNum: this.pageNum}}).then(res => {this.loading = false;this.list = [] || res.list;this.total = res.total;}).catch(() => {this.loading = false;});},handleChange(pageNum) {this.pageNum = pageNum;this.getOrderList();}}
};
</script>

(5)订单列表分页 - 加载更多

​ 在orderList.vue中使用ElementUI中的Button组件:

<div class="load-more" v-if="showNextPage"><el-button type="primary" :loading="loading" @click="loadMore">加载更多</el-button>
</div>
<script>import {Button} from 'element-ui';export default{components:{[Button.name]: Button},data() {return {list: [],loading: false,pageSize: 10,pageNum: 1,showNextPage: true, //是否显示按钮,但数据都加载完了,就不需要显示“加载更多”按钮。};},methods: {getOrderList() {this.axios.get("/orders", {params: {pageNum: 10,pageNum: this.pageNum}}).then(res => {this.loading = false;this.list = res.list.concat(res.list);  //数据累加this.showNextPage = res.hasNext}).catch(() => {this.loading = false;});},loadMore() {this.pageNum++;this.getOrderList();}   }
};
</script>

(6)订单列表分页 - 滚动加载

  • 安装该插件:

    npm install vue-infinite-scroll --save

  • 在orderList.vue中使用Vue中的vue-infinite-scroll插件:

<div class="scroll-more"v-infinite-scroll="scrollMore"infinite-scroll-disabled = "busy"infinite-scroll-distance="410"><img src="/imgs/loading-svg/loading-spinning-bubbles.svg" alt="" v-show="loading">
</div>
<script>
// v-infinite-scroll="scrollMore" :滚动的时候会调用的方法
//infinite-scroll-disabled = "busy" : 控制滚动加载是否有效,在busy为false:滚动才有效,才能触发loadMore函数,为true时,滚动不会触发函数。
//infinite-scroll-distance="410" : 不是距离底部410px时才触发loadMore函数import {Button} from 'element-ui';export default{directives: {infiniteScroll},components:{[Button.name]: Button},data() {return {list: [],loading: false,pageSize: 10,pageNum: 1,busy: false,  //滚动加载,是否触发};},methods: {getOrderList() {this.loading = true; this.busy = true;this.axios.get("/orders", { params: {pageNum: 10,pageNum: this.pageNum}}).then(res => {this.loading = false;this.list = res.list.concat(res.list);  //数据累加this.busy = false;}).catch(() => {this.loading = false;});},getList() {this.loading = true;this.busy = true;this.axios.get("/orders", {params: { pageNum: 10,pageNum: this.pageNum}}).then(res => {this.list = res.list.concat(res.list);  //数据累加this.loading = false;if(res.hasNextPage) {this.busy = false;} else {this.busy = true;}})},scrollMore() { this.busy= true;setTimeout(() => {this.pageNum++;this.getList();}, 500)}   }
};
</script>

Vue项目实战:订单列表页面实现相关推荐

  1. Vue项目实战:购物车页面实现与ElementUI集成

    目录 1. 购物车页面 Order-Header组件 购物车列表渲染 购物车全选和非全选 购物车商品更新和删除 购物车结算 2. ElementUI集成 3. Babel介绍 购物车页面 (1)Ord ...

  2. 【VUE项目实战】32、权限管理-实现角色列表

    接上篇<31.权限管理-实现权限列表> 上个阶段我们完成了权限管理模块,本篇我们来介绍用户.角色和权限三者的关系,并完成角色管理列表模块. 一.权限管理业务分析 通过权限管理模块,控制不同 ...

  3. 【VUE项目实战】59、订单的物流信息查询功能

    接上篇<58.订单修改收货地址的功能> 上一篇我们完成了订单列表的修改收货地址功能,本篇我们来实现订单的物流信息查询功能. 一.要实现的效果 我们要实现点击操作列的"物流进度&q ...

  4. 【VUE项目实战】56、商品添加功能(六)-提交添加的商品

    接上篇<55.商品添加功能(五)-商品内容模块> 上一篇我们完成了商品内容编辑模块的开发,也即是完成了商品所有的信息编辑,本篇我们就来开发提交商品所有信息到后台的功能. 一.要实现的效果 ...

  5. 【VUE项目实战】1、学习目标以及概述

    之前我们分别学习了ES6和Vue的基础,下面新开启的系列,是从0开始通过Vue搭建一个电商管理系统,从而学习Vue的具体实战. 以下博文记录,均参考黑马程序员(www.itheima.com)Vue项 ...

  6. Vue项目实战-vue2(移动端)

    Vue项目实战(移动端)# 相关资料 (一) 创建项目 (二) 禁用Eslint (三) devtool (四) 添加less支持 (五) vue路由配置(背诵) (六) 父子组件通信(背诵) (七) ...

  7. 1.vue项目实战笔记(已完结)

    vue项目实战笔记 目标 目录 1.项目概述 1.1电商项目基本业务概述 1.2电商后台管理系统的功能 1.3电商后台管理系统的开发模式(前后端分离) 1.4电商后台管理系统的技术选型 1.前端项目技 ...

  8. vue 动态添加class_前端开发:Vue项目实战-Music

    大家好,我来了,本期为大家带来的前端开发知识是"前端开发:Vue项目实战-Music",有兴趣做前端的朋友,和我一起来看看吧! 主要内容 项目环境搭建 路由导航实现 ListVie ...

  9. vue 将字符串最后一个字符给替换_前端开发:Vue项目实战-Music

    大家好,我来了,本期为大家带来的前端开发知识是"前端开发:Vue项目实战-Music",有兴趣做前端的朋友,和我一起来看看吧! 主要内容 项目环境搭建 路由导航实现 ListVie ...

  10. 【VUE项目实战】37、商品分类功能介绍和基本结构搭建

    接上篇<36.用户分配角色功能> 上一篇我们完成了为用户分配角色的功能,结束了权限管理模块.本篇我们开启新模块"分类管理"的开发,先进行模块的介绍和基本结构的搭建. 一 ...

最新文章

  1. python【蓝桥杯vip练习题库】ALGO-75筛选号码(约瑟夫环)
  2. Chapter 3 Phenomenon——23
  3. Python学习手册(套装上下册)(原书第5版)
  4. 北京、广东重名数量查询工具,给孩子起名重名查询
  5. HTML span标签学习笔记
  6. @程序员,沟通这项核心技能你掌握了多少?
  7. kubernetes存储详解
  8. appium+python 【Mac】Android夜神模拟器
  9. h3c服务器设置u盘引导,H3C FlexServer R390服务器装系统前的准备工作
  10. 有什么推荐的软件工程本科的毕业设计题目嘛?
  11. mysql-世界-全球数据
  12. 免校准的电量计量芯片_免校准的高精度计量芯片HLW8032
  13. 解决 用VirtualBox安装Windows95后启动乱码
  14. log4j 日志输出级别
  15. python3中单引号,双引号,三个单引号 ,三个双引号的差别,以及反斜杠的用法
  16. 2022春季数据结构期中考试总结
  17. 多期DID和事件研究法含文献和do代码
  18. win7系统打开截图工具显示“截图工具当前未在计算机上运行” 如何解决
  19. 分支合并-rebase
  20. 在SSD268G上运行第一个demo

热门文章

  1. 微信小程序图片加载太慢;uni-app微信小程序加载图片优化;微信小程序图片image加载成功事件@load;图片加载成功触发@load事件
  2. 84 岁 iOS 女程序员,不得不服!
  3. 创办6年未盈利,半年亏损40亿裁员25%,狂奔的滴滴怎么了?
  4. 如何让机器产生意识之意识具象化
  5. 梅特勒托利多xk3124电子秤说明书_梅特勒-托利多电子称设置方法
  6. matlab常用逻辑运算
  7. 世界上最伟大的推销员
  8. 佛祖释迦牟尼说的最经典的一句话
  9. 详解p=q->next和p->next=q的区别,附代码
  10. unity 查找所以物体_unity 查找物体的方法(包括隐藏物体)