v-router重写push、replace方法

问题描述:当页面再次进入同一个路由地址时,控制台报错

解决方法:修改vue-router的配置文件,也就是router/index.js文件

//重写VueRouter.prototype身上的push方法了
VueRouter.prototype.push = function(location, resolve, reject) {//第一个形参:路由跳转的配置对象(query|params)//第二个参数:undefined|箭头函数(成功的回调)//第三个参数:undefined|箭头函数(失败的回调)if (resolve && reject) {//push方法传递第二个参数|第三个参数(箭头函数)//originPush:利用call修改上下文,变为(路由组件.$router)这个对象,第二参数:配置对象、第三、第四个参数:成功和失败回调函数originPush.call(this, location, resolve, reject);} else {//push方法没有产地第二个参数|第三个参数originPush.call(this,location,() => {},() => {});}
};
//重写VueRouter.prototype身上的replace方法了
VueRouter.prototype.replace = function(location, resolve, reject) {if (resolve && reject) {originReplace.call(this, location, resolve, reject);} else {originReplace.call(this,location,() => {},() => {});}
};

三级联动路由跳转的优化

三级联动路由如下图所示:

点击’电子书‘后跳转的页面如下:

问题分析:
1、由于三级分类都是<a>标签,所以要实现路由跳转,最简单的方式就是将a标签换成
<router-link to="/search">,但是由于服务器的数据返回,循环语句的执行,可能在一瞬间,要加载几千个router-link,router-link是组件,组件需要创建,所以很耗费内存,最终会出现卡顿现象。
2、所以采用编程式导航来实现,编程式导航需要绑定事件,如果将事件绑定在每个<a>标签上,虽然不会出现卡顿现象了,但是当数据返回时,每次循环会就会导致有几千个回调函数,所以可以利用事件委派解决这个问题。
3、最好的解决方案是编程式导航结合事件委派。但是利用事件委派存在两个问题需要解决:

    3.1、全部的子节点的事件都委派给了父节点,但是我们需要的是点击一定是a标签,如何区别a标签和其它标签?在a标签上定义自定义事件data-categoryName,后面用dataset就能获取自定义属性及属性值;3.2如何获取参数【1、2、3级分类的产品的名字、id】?在1,2,3级分类上定义自定义属性data-category1Id、data-category2Id、data-category3Id,就能区分了

三级联动TypeNav的代码如下:
template内

 <!-- 将点击事件goSearch放在父元素上 --><div class="all-sort-list2" @click="goSearch"><div class="item" v-for="(c1,index) in categoryList" :key = "c1.categoryId"><h3><!-- 为了区别a标签和其它标签,在a标签上定义自定义事件data-categoryName,后面用dataset就能获取;1,2,3级区分同理 --><a :data-categoryName="c1.categoryName" :data-category1Id="c1.categoryId" >{{c1.categoryName}}</a></h3><div class="item-list clearfix"><div class="subitem" v-for="(c2,index) in c1.categoryChild" :key="c2.categoryId"><dl class="fore"><dt><a :data-categoryName="c2.categoryName" :data-category2Id="c2.categoryId" >{{c2.categoryName}}</a><!-- 声明式导航 --!><!-- <router-link to="/search">{{c2.categoryName}}</router-link> --></dt><dd><em v-for="(c3,index) in c2.categoryChild" :key="c3.categoryId"><a :data-categoryName="c3.categoryName" :data-category2Id="c3.categoryId" >{{c3.categoryName}}</a></em></dd></dl></div></div></div></div>

script内

 methods:{goSearch(event){//利用编程式导航和事件委派//事件委派会出现一些问题:1.全部的子节点的事件都委派给了父节点,但是我们需要的是点击一定是a标签let element = event.target;//dataset可以获取自定义属性与属性值(解构赋值)let {categoryname,category1id,category2id,category3id} = element.dataset;console.log(element.dataset)//   如果标签身上有categoryname那一定是a标签if(categoryname){//   alert(123);//整理路由跳转的参数let location = {name:"search"};let query = { categoryName:categoryname }// 2.如何获取参数【1、2、3级分类的产品的名字、id】if(category1id){query.category1Id = category1id}else if(category2id){query.category2Id = category2id}else{query.category3Id = category3id}location.query = query;this.$router.push(location);//   alert(123)}},

跨域问题

/api/request.js
1、对axios进行二次封装

//对axios进行二次封装
import axios from "axios";
//引入进度条
import nprogress from "nprogress";
//引入进度条的样式
import "nprogress/nprogress.css"
console.log(nprogress);
//利用axios对象的方法create,创建一个axios实例
const requests = axios.create({baseURL:"/api",//请求超时时间为5stimeout:5000,
});//请求拦截器:再发请求之前,请求拦截器可以监测到,可以在请求发出之前走一些事情
requests.interceptors.request.use((config)=>{//config:配置对象,对象里面有个属性很重要,headers请求头//进度条开始动nprogress.start();return config;
})
//响应拦截器
requests.interceptors.response.use((res)=>{//成功的回调函数:服务器响应数据回来以后,响应拦截器可以检测到,做一些事情//进度条结束nprogress.done();return res.data;
},(error)=>{//响应失败的回调函数return Promise.reject(new Error('faile'));
})//对外暴露
export default requests;

2、对接口进行统一管理
/api/index.js

//当前这个模块:对API进行统一管理
import requests from "./request";//三级联动接口
// /api/product/getBaseCategoryList    get   无参数
export const reqCategoryList = ()=>{//发请求  axios发请求,返回结果是promise对象//会出现跨域问题:协议、域名、端口号不同就会出现跨域问题//http://39.98.123.211//http://localhost:8080//解决方法:JSONP、CROS、代理(在config.js配置文件修改)return requests({url:'/product/getBaseCategoryList',method:"get"})
}

解决跨域问题方法一:代理跨域
在服务器和浏览器中间设置一个代理服务器,解决跨域问题
vue.config.js

module.exports = {//关闭eslint校验工具lintOnSave:false,//代理跨域devServer:{proxy: {"/api": {target: "http://39.98.123.211",//路径不需要重写,因为所有的接口都有/api//   pathRewrite: {"^/api" : ""}},},},}

轮播图解决浏览器异步数据及swiper问题

问题分析:
swiper插件完成轮播图需要两件事:首先将DOM结构渲染完成,然后再创建一个swiper实例。
但是我们从浏览器获取数据是异步的(获取数据也在mounted中),所以不能保证创建swiper实例时(在mounted生命周期函数内创建这个实例)就将DOM结构完成了,要解决这个问题,有以下三种方法:

  • 1、update
    当有其他数据时,其它数据进行更新,但轮播图的数据不更新时,都会再创建一次swiper实例然后再创建轮播图,所以这个方法不是特别好。

  • 2、延时器
    延时1秒,轮播图的功能才可以实现,此方法可行但也不是很完美。

  • 3、watch+nextTick
    如果只有watch,只能保证bannerList数据已经存入到仓库里了,但是不能确定v-for执行完毕,v-for执行完了才能保证DOM结构完成,所以需要结合nextTick来完成。
    nextTick

尚品汇项目难点及解决相关推荐

  1. 尚硅谷 VUE 尚品汇项目实战问题解决方式整理(Vue3 版)

    教学视频:https://www.bilibili.com/video/BV1Vf4y1T7bw 不回要资料的评论,资料在视频底下评论有些仓库里面有. 试图自行解决问题也是程序员必备技能之一,多做尝试 ...

  2. 尚品汇项目笔记(持续更新中)

    项目网络教学视频链接:尚硅谷VUE项目实战,前端项目-尚品汇(大型\重磅)_哔哩哔哩_bilibili 目录 一. 使用vue-cli脚手架去初始化项目 二.项目的其他配置 三.项目路由分析 四.创建 ...

  3. 尚硅谷 VUE 尚品汇项目实战问题解决方式整理

    最近在自学大型vue项目,选中了尚硅谷的尚品汇,之前也学习过黑马程序员的一个电商后台管理项目,因为项目打包优化时候出了Bug,就闲置了,但是代码是一行一行敲完啦,也放到了码云上!学完这个尚品汇准备下一 ...

  4. 尚硅谷-尚品汇项目开发总结(第十五天)

    27:图片懒加载:vue-lazyload插件实现 27.1 为什么需要图片懒加载? 在图片很多的网站中,如果所有图片全部一次性加载完毕,可能会增加服务器压力.导致页面卡顿.影响用户体验. 为了解决这 ...

  5. 尚硅谷--尚品汇项目笔记

    文章目录 项目核心 一.项目准备 二.脚手架目录作用 三.项目的其他配置 四.路由的分析 1.路由组件的搭建 2.配置路由 3.路由组件和非路由组件区别: 4.路由的跳转 5.路由传参 6.路由传递参 ...

  6. 尚品汇 - 项目个人笔记总汇(更新中...)

    文章目录 路由 路由组件出口 路由元信息 路由重定向 路由传参 收集表单数据 传递params参数 传递params参数 + query参数 尝试接收参数 模板传参 对象传参 路由组件单独传输quer ...

  7. 尚硅谷-尚品汇项目开发总结(第十六天,电商项目完)

    30:项目打包上线 30.1:运行npm run build,生成dist文件夹 30.2:.map文件:在项目打包后,代码都是经过加密的,如果运行时报错,输出的错误信息无法准确定位是哪里的代码出错, ...

  8. vue实战项目-电商商城前台-(学习尚硅谷的)尚品汇

    文章目录 最好使用视频上的账号密码,13700000000 密:111111 最新服务端接口地址:http://gmall-h5-api.atguigu.cn 脚手架使用 1.创建项目 2.脚手架默认 ...

  9. 电商项目尚品汇学习笔记

    本文参考其他文章自己整理补充的,要阅读原文请查看:尚品汇项目笔记_爱哭的毛毛虫的博客-CSDN博客_尚品汇项目 1.vue文件目录 public文件夹:静态资源,webpack进行打包的时候会原封不动 ...

最新文章

  1. Jquery获取了元素
  2. HTML/CSS——float制作页面DEMO
  3. linux 去掉 ^M 的方法
  4. [渝粤教育] 四川大学 药用植物学 参考 资料
  5. c语言在键盘输入abc回车,C语言期末考试试卷子商务1111、21.doc
  6. 美将遣返庇护申请者至墨西哥 弱势人士有望豁免
  7. [转]ASP.NET面试题
  8. iTunes Connect(一) —— iOS应用上架到AppStore
  9. Java常量什么时候被回收,JVM GC调优(2)-GC算法判定对象可以被回收(部分摘自深入理解Java虚拟机) - Java 技术驿站-Java 技术驿站...
  10. hive0.12安装
  11. 正则表达式批量重命名
  12. CSAPP Lab2:Bomb Lab
  13. acwing.95.费解的开关
  14. html 字体样式斜体,CSS font-style斜体字体倾斜体样式
  15. educoder:第3关:嵌套循环 - 跃迁能量表
  16. GNSS抗干扰和GNSS抗欺骗
  17. 被忽视的钣金零件外观设计
  18. 《环球》杂志|“宇宙级”漏洞过后,一个技术总裁的忠告……
  19. JMeter 图片上传接口进行压力测试
  20. Android 头像上传

热门文章

  1. 机器学习中的线性代数
  2. 【第35题】JAVA高级技术-对象克隆4(序列化与对象克隆)
  3. android 支付宝支付
  4. Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除
  5. 无人驾驶飞机系统 (UAS)可为核电站事故等应急救援工作创建范例
  6. ios中的通知和推送
  7. 如何用css动画来画一个多啦A梦
  8. Android-ViewFlipper(图片轮播 和 手势控制 实例)
  9. 头条后台开发面试题分析
  10. 屌丝程序员赚钱之道 之APP