位置: IT常识 - 正文

Vue--Router--解决多路由复用同一组件页面不刷新问题(vue-router query)

编辑:rootadmin
Vue--Router--解决多路由复用同一组件页面不刷新问题

推荐整理分享Vue--Router--解决多路由复用同一组件页面不刷新问题(vue-router query),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue,router,vue-routet,vue.$router,vue.$router,vue中routes,vue-routet,vue.$router,vue $route $router,内容如对您有帮助,希望把文章链接给更多的朋友!

原文网址:Vue--Router--解决多路由复用同一组件页面不刷新问题_IT利刃出鞘的博客-CSDN博客

简介

说明

        本文介绍如何解决Vue的多路由复用同一组件页面不刷新问题。

多路由复用同一组件的场景

多路由使用同一组件比如:添加博客(path为:/addBlog)和编辑博客(path为:/editBlog)都对应同一个组件(EditBlog.vue)动态路由比如:用户详情页采用动态路由,其path为:/user/:id,组件都是UserDetail.vue

原因分析

        Vue中,相同的组件实例将被重复使用。如果两个路由都渲染同个组件,复用比销毁再创建更高效。不过,复用会导致组件的生命周期函数不会被调用。而我们通常会将调后端接口放到created或mounted等生命周期函数中,生命周期函数没被调用,也就无法获取后端数据。

官网网址

https://router.vuejs.org/zh/guide/essentials/dynamic-matching.html#响应路由参数的变化

问题复现

        本处以博客为例。添加博客(path为:/addBlog)和编辑博客(path为:/editBlog)都对应同一个组件(EditBlog.vue)

代码

路由配置(router/index.js)

import Vue from 'vue'import VueRouter from 'vue-router'import BlogEdit from '../components/BlogEdit'Vue.use(VueRouter)const routes = [ { path: '/addBlog', name: 'AddBlog', component: BlogEdit }, { path: '/editBlog', name: 'EditBlog', component: BlogEdit }]const router = new VueRouter({ routes})export default router

主页面(App.vue) 

<template> <div id="app"> <div id="nav"> <!--<router-link to="/">Home</router-link> |--> <!--<router-link to="/about">About</router-link>--> <router-link :to="{name: 'AddBlog'}">创建博客</router-link> | <router-link :to="{name: 'EditBlog'}">修改博客</router-link> </div> <router-view/> </div></template><style><!-- 省略 --></style>

博客编辑页(components/BlogEdit.vue)

<template> <div class="outer"> <div> 这是BlogEdit </div> </div></template><script>import LifeCycle from '../mixins/LifeCycle'export default { name: 'BlogEdit', mixins: [LifeCycle]}</script><style scoped>.outer { margin: 20px; border: 2px solid blue; padding: 20px;}</style>

混入生命周期(mixins/LifeCycle.js) 

我把生命周期的钩子函数单独拿了出来。

export default { computed: { name () { return this.$options.name } }, created () { console.log('created ==> ' + this.name) }, activated () { console.log('activated ==> ' + this.name) }, deactivated () { console.log('deactivated ==> ' + this.name) }, destroyed () { console.log('destroyed ==> ' + this.name) }}测试

访问:http://localhost:8080/#/

可见,除了第1次进入,之后的进入和退出没有触发相关的生命周期函数,比如:created等。 

解决方案方案1:导航守卫Vue--Router--解决多路由复用同一组件页面不刷新问题(vue-router query)

方法:在beforeRouteEnter中请求后端数据。

导航卫士钩子(mixins/NavigationGuard.js)

为便于管理,我把导航卫士单独拿出来,作为mixin给组件使用。

export default { beforeRouteEnter (to, from, next) { // 无法访问this console.log('beforeRouteEnter ==> 来自:' + from.path) console.log('beforeRouteEnter ==> 去往:' + to.path) next(true) }, beforeRouteUpdate (to, from, next) { console.log(this.$options.name + ':beforeRouteUpdate ==> 来自:' + from.path) console.log(this.$options.name + ':beforeRouteUpdate ==> 去往:' + to.path) next(true) }, beforeRouteLeave (to, from, next) { console.log(this.$options.name + ':beforeRouteLeave ==> 来自:' + from.path) console.log(this.$options.name + ':beforeRouteLeave ==> 去往:' + to.path) next(true) }}

博客编辑组件(components/BlogEdit.vue)

<template> <div class="outer"> <div> 这是BlogEdit </div> </div></template><script>import LifeCycle from '../mixins/LifeCycle'import NavigationGuard from '../mixins/NavigationGuard'export default { name: 'BlogEdit', mixins: [LifeCycle, NavigationGuard]}</script><style scoped>.outer { margin: 20px; border: 2px solid blue; padding: 20px;}</style>

测试

访问: http://localhost:8080/#/

可以发现:离开路由时会调用beforeRouteLeave,进入路由时会调用beforeRouteEnter。所以可以将调后端接口的方法放到beforeRouteEnter里边去。

方案2:watch监听$route

方法:使用watch监听$route的变化,变化时根据情况请求后端数据。

修改博客编辑组件(components/BlogEdit.vue)

<template> <div class="outer"> <div> 这是BlogEdit </div> </div></template><script>import LifeCycle from '../mixins/LifeCycle'export default { name: 'BlogEdit', mixins: [LifeCycle], watch: { $route (to, from) { console.log('组件:' + this.$options.name) console.log('来自:' + from.name) console.log('去往:' + to.name) } }}</script><style scoped>.outer { margin: 20px; border: 2px solid blue; padding: 20px;}</style>

测试

访问:http://localhost:8080/#/

可以发现:路由变化时会触发对$route的watch。所以可以将调后端接口的方法放到里边去。

方案3:父组件router-view指定key

        方法:在父组件的router-view中指定key,这个key必须是唯一的,比如:"$route.fullPath"。这样vue就会认为每个内部路由都是不同的,在跳转时便会强制刷新组件。

比如:

<router-view :key="$route.fullPath"></router-view>

修改App.vue

<router-view :key="$route.fullPath"></router-view><template> <div id="app"> <div id="nav"> <!--<router-link to="/">Home</router-link> |--> <!--<router-link to="/about">About</router-link>--> <router-link :to="{name: 'AddBlog'}">创建博客</router-link> | <router-link :to="{name: 'EditBlog'}">修改博客</router-link> </div> <!-- 原来代码 --> <-- <router-view/> --> <router-view :key="$route.fullPath"></router-view> </div></template><style><!-- 省略 --></style>

测试

访问:http://localhost:8080/#/

可以发现:可以正常触发组件的生命周期(created、destroyed)。

其他网址

Vue keepAlive实现不同的路由共用一个组件component的缓存问题_代码修整工的博客-CSDN博客

本文链接地址:https://www.jiuchutong.com/zhishi/295270.html 转载请保留说明!

上一篇:基于Springboot社区疫情防控管理系统 毕业设计-附源码164621(基于springboot的oa)

下一篇:富文本编辑器 ck-editor5 的使用(富文本编辑器和markdown编辑器的区别)

  • 苹果12pro多长(ipone12pro多长)

    苹果12pro多长(ipone12pro多长)

  • 为什么对方微信封面是黑色(为什么对方微信头像换了我却看不到)

    为什么对方微信封面是黑色(为什么对方微信头像换了我却看不到)

  • 荣耀x10支持wifi6吗(荣耀X10支持快充吗)

    荣耀x10支持wifi6吗(荣耀X10支持快充吗)

  • 苹果x微信闪退是什么原因(苹果x微信闪退打不开)

    苹果x微信闪退是什么原因(苹果x微信闪退打不开)

  • 拼多多注销后能重新登录吗(拼多多注销后能恢复吗)

    拼多多注销后能重新登录吗(拼多多注销后能恢复吗)

  • 以前下载的app删了怎么找到(以前下载的app删了怎么找)

    以前下载的app删了怎么找到(以前下载的app删了怎么找)

  • 钉钉是否可以手机和电脑同时使用(钉钉可以手写吗)

    钉钉是否可以手机和电脑同时使用(钉钉可以手写吗)

  • 网易云下载的音乐在哪个文件夹(网易云下载的音乐如何转成mp3)

    网易云下载的音乐在哪个文件夹(网易云下载的音乐如何转成mp3)

  • 哪些直播平台属于腾讯(直播平台那些)

    哪些直播平台属于腾讯(直播平台那些)

  • 华为m6能用优盘吗(华为m6可以读取移动硬盘吗)

    华为m6能用优盘吗(华为m6可以读取移动硬盘吗)

  • 手机销号后余话费怎么处理(电话号码销号后的余额会退还吗)

    手机销号后余话费怎么处理(电话号码销号后的余额会退还吗)

  • oppo手机怎么重新录入面部(oppo手机怎么重设账号密码)

    oppo手机怎么重新录入面部(oppo手机怎么重设账号密码)

  • ios13为什么闹钟有时没声音(ios13.3闹钟不响)

    ios13为什么闹钟有时没声音(ios13.3闹钟不响)

  • 为什么我的抖音没有合拍(为什么我的抖音收藏不了别人的视频)

    为什么我的抖音没有合拍(为什么我的抖音收藏不了别人的视频)

  • 怎样下载京东购物(怎样下载京东购物软件)

    怎样下载京东购物(怎样下载京东购物软件)

  • 照片如何调分辨率(照片如何调分辨率到300dpi的小程序)

    照片如何调分辨率(照片如何调分辨率到300dpi的小程序)

  • 苹果x跟苹果11有什么区别(苹果11和苹果x)

    苹果x跟苹果11有什么区别(苹果11和苹果x)

  • 怎么找QQ浏览器中加密的文件(怎么找qq浏览器的私密空间)

    怎么找QQ浏览器中加密的文件(怎么找qq浏览器的私密空间)

  • 怎么把自己的腾讯会员给别人用(怎么把自己的腾讯会员和别人一起用)

    怎么把自己的腾讯会员给别人用(怎么把自己的腾讯会员和别人一起用)

  • 已经实名认证还是收不了红包(已经实名认证还是显示未实名)

    已经实名认证还是收不了红包(已经实名认证还是显示未实名)

  • 抖音怎么截图当壁纸(抖音截图怎么弄)

    抖音怎么截图当壁纸(抖音截图怎么弄)

  • iPhone6送修后怎样查询维修进度(苹果手机送修了会给备用机吗)

    iPhone6送修后怎样查询维修进度(苹果手机送修了会给备用机吗)

  • ChatGPT火爆来袭,携手参与为开源助力

    ChatGPT火爆来袭,携手参与为开源助力

  • 【web前端开发】超详细讲解CSS盒子模型(web前端开发html代码)

    【web前端开发】超详细讲解CSS盒子模型(web前端开发html代码)

  • 认证不过的进项税是怎么调出分录?
  • 印花税的征税对象是条例列举的凭证未列举的不征税
  • 企业借款给个人利息如何处理
  • 股权转让如何缴纳增值税
  • 注册资本印花税怎么交?什么时候交?
  • 包工包料怎么付款流程
  • 工资表只显示一个人的其他看不见
  • 存货内部交易抵消分录第二年
  • 非货币性资产交换固定资产清理
  • 销售部预借差旅费什么凭证
  • 保证金交易收益率
  • 小规模纳税人销售额
  • 建筑企业收到材料发票没有备注能用吗
  • 商品销售赠送部分要交税吗
  • 维修房产用的建材会计分录
  • 企业只有收入没有支出是否违规
  • 企业如果亏损应该计提缴纳所得税吗
  • 印花税计提比例是多少
  • 公司委托法人代收款
  • 增值税小规模纳税人申报表填表说明
  • 办公室零食知乎
  • 记账凭证和转账凭证可以装订在一起吗
  • 承兑跨省是不是不能用
  • 外籍人士离职补偿
  • 员工探亲路费报销交个税吗
  • 拆迁公司属于什么性质
  • 小规模企业申报表填写
  • 鸿蒙的usb调试
  • 如何开启windows10云服务
  • 发票金额与实际金额不一致违法吗
  • macbook不用键盘膜会进灰吗
  • 哪些行业可以简易征收增值税
  • PHP:bzdecompress()的用法_Bzip2函数
  • 按实际成本结转6日和7日的材料采购成本
  • 最轻薄数码相机
  • 优先股转化
  • 企业签订的技术合同
  • 非货币性资产交换
  • 强制划缴税款
  • php 上传文件
  • 金税盘发票数据导出不完整
  • vue3中使用window方法
  • 公司车辆出售需要什么手续
  • 江西税务官网
  • 帝国cms如何使用
  • 怎么在网上增加办税人员
  • 广告费支出税前扣除标准30
  • phpcms怎么用
  • 一般纳税人如何交增值税
  • 公司如何帮员工补缴社保
  • 公转私户违法吗
  • 货物已到发票未开具
  • 总公司费用能分摊到分公司吗
  • 营业外支出的用法
  • 固定资产清理是资产类的备抵科目吗
  • 业务招待费纳税调整会计分录
  • 研发费用和研发支出的会计处理
  • 没有工会的企业收到返还的工会经费派什么用场
  • sqlserver游标的使用
  • sql clean
  • windows虚拟内存转移有什么危害
  • mac cad软件
  • openbsd6.8
  • win8无法正常启动你的电脑
  • mac睡眠后黑屏
  • u盘设置背景音乐怎么弄
  • windows7家长控制
  • win8.1删除所有内容并重新安装
  • 如何灵活使用蒙恬
  • 电脑ahci模式什么意思
  • win10预览版好吗
  • nodejsapi
  • shell脚本中执行命令语句
  • cmd for /f
  • javascript入门教学
  • js复制字符串的方法
  • 代扣代缴申报表 填表说明
  • 广西个人医保缴费时间
  • 大渡口在重庆吗
  • 绵阳税务局咨询电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设