位置: 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编辑器的区别)

  • 淘宝网店主必学视觉营销知识(淘宝网店入门)

    淘宝网店主必学视觉营销知识(淘宝网店入门)

  • 如何共享打印机到手机(如何共享打印机)(如何共享打印机到另外一台电脑无法打印)

    如何共享打印机到手机(如何共享打印机)(如何共享打印机到另外一台电脑无法打印)

  • 苹果耳机可以连华为手机么(苹果耳机可以连安卓手机吗)

    苹果耳机可以连华为手机么(苹果耳机可以连安卓手机吗)

  • mate30微信面容支付如何开启(mate20微信面容支付)

    mate30微信面容支付如何开启(mate20微信面容支付)

  • 电脑锁屏名言怎么弄(电脑锁屏标语)

    电脑锁屏名言怎么弄(电脑锁屏标语)

  • 抖音上怎么设置不让别人下载自己的作品(抖音上怎么设置定位地址)

    抖音上怎么设置不让别人下载自己的作品(抖音上怎么设置定位地址)

  • 通过私信添加什么意思(私信加微信怎么加)

    通过私信添加什么意思(私信加微信怎么加)

  • 为什么键盘有的字母没反应(为什么键盘有的字母打不出来)

    为什么键盘有的字母没反应(为什么键盘有的字母打不出来)

  • 电信2g卡怎么升级4g(电信2g卡怎么升级4g套餐会变么)

    电信2g卡怎么升级4g(电信2g卡怎么升级4g套餐会变么)

  • 台式机报警滴滴滴显示器不亮(台式机报警滴滴滴)

    台式机报警滴滴滴显示器不亮(台式机报警滴滴滴)

  • 水星wifi管理员密码是什么(水星wifi管理员密码忘了怎么重新设置)

    水星wifi管理员密码是什么(水星wifi管理员密码忘了怎么重新设置)

  • 华为mate20屏幕多大(华为mate20屏幕多宽)

    华为mate20屏幕多大(华为mate20屏幕多宽)

  • 华为手机微信保存的图片在哪个文件夹(华为手机微信保存的图片图库不显示)

    华为手机微信保存的图片在哪个文件夹(华为手机微信保存的图片图库不显示)

  • 华为手机不能快速充电了怎么回事(华为哪款手机不卡)

    华为手机不能快速充电了怎么回事(华为哪款手机不卡)

  • 企鹅电竞为什么黑屏(企鹅电竞为什么会停运)

    企鹅电竞为什么黑屏(企鹅电竞为什么会停运)

  • bm37电池是什么型号(bm3m电池是什么型号)

    bm37电池是什么型号(bm3m电池是什么型号)

  • v1945a是什么型号(v1924a是什么型号)

    v1945a是什么型号(v1924a是什么型号)

  • 苹果视频怎么截图成照片(苹果视频怎么截取部分画面)

    苹果视频怎么截图成照片(苹果视频怎么截取部分画面)

  • 快手怎么设置商家电话(快手怎么设置商业推广任务)

    快手怎么设置商家电话(快手怎么设置商业推广任务)

  • wps两个表格怎么合并(wps两个表格怎么快速切换)

    wps两个表格怎么合并(wps两个表格怎么快速切换)

  • 国外能用支付宝吗(国外能用支付宝微信支付吗)

    国外能用支付宝吗(国外能用支付宝微信支付吗)

  • qq画画功能在哪里(qq画画图片大全)

    qq画画功能在哪里(qq画画图片大全)

  • 小米9se与小米cc9对比(小米9se与小米8对比)

    小米9se与小米cc9对比(小米9se与小米8对比)

  • 华为p30pro截屏没反应(华为p30pro截屏不灵敏怎么回事)

    华为p30pro截屏没反应(华为p30pro截屏不灵敏怎么回事)

  • 双4g有什么用(双4g有用吗)

    双4g有什么用(双4g有用吗)

  • win10任务栏最近列表关闭教程(win10任务栏不显示最近)

    win10任务栏最近列表关闭教程(win10任务栏不显示最近)

  • 附列资料第8栏
  • 滞留票有什么影响
  • 为员工代缴社保材料
  • 所得税借方贷方
  • 什么叫欠账
  • 没有增值税发票怎么做账
  • 对公账号收款是结算主账户还是结算卡号
  • 进项税加计扣除什么时候开始的
  • 劳动保护费通过什么确认
  • 知道增值税如何计算开票金额
  • 本月进项税额不够抵扣怎么办
  • 建筑公司外包工程收入怎么记账
  • 顾客办理会员卡要退怎么办
  • 旧货如何卖
  • 建筑业的税金计税依据
  • 增值税专用发票可以开电子发票吗
  • 营改增后还有营业费用吗
  • 关于水利工程
  • 税收分类编码格式
  • 退休人员再任职个人所得税
  • 员工看病报销要计税吗
  • 所得税汇算清缴退款账务处理
  • 车辆保险抵扣会计分录
  • 增资后可以减资吗
  • 带息商业汇票的利息分录?
  • 个人所得税申报截止时间
  • 应付款项余额
  • 收到进项发票抵扣联怎么做分录
  • 汇算清缴补交的所得税会计分录
  • 内存坏了电脑会黑屏吗
  • windows10如何移动文件
  • 华为鸿蒙系统开发平台
  • 未开票收入冲回如何做账
  • 小规模纳税人免增值税的账务处理
  • 王者荣耀中雅典娜的战争女神多少钱
  • wamp搭建网站教程
  • window10怎么创建wifi
  • mac升级系统还剩不到一分钟
  • 深入理解php内核
  • php 缓存
  • 废品损失是什么类账户
  • 工程建设质保金规定
  • 预付款发票不能回来了怎么处理
  • 进出口企业税务怎可以查出问题
  • 福利费做账分录
  • three.js gui
  • php上传图片并显示
  • 付检测费会计分录
  • jdbc连接mysql的url怎么写
  • 核定征收的纳税人能否享受六税两费减免
  • 工程物资的税率怎么算
  • 将本月发生的制造费用总额按生产工人
  • 外币应收账款汇兑损失计入
  • 上年结转库存现金会计分录
  • sqlserver控制台
  • 项目差旅费可以直接计入劳务成本吗
  • 税前扣除原则和扣除金额
  • 高新技术企业的申报条件
  • 暂估成本的账务处理分录
  • 已认证未记账
  • 明细分类账的记账
  • 金融企业借款费用扣除比例
  • FNPLicensingService.exe是什么意思
  • xp无法正常启动怎么办
  • window8系统安装步骤
  • 解决win10蓝屏
  • centos7.4升级7.5
  • RAVMOND.exe - RAVMOND是什么进程.有什么作用
  • mac查看地址
  • fsc文件用什么软件打开
  • nodejs爬取数据
  • 清除垃圾的系统
  • vue.js有什么用
  • js中refresh
  • javascript教程 csdn
  • python怎么处理json数据
  • 广西电子税务局登陆入口
  • 消费税的征收范围是如何规定的
  • 冀地是哪里
  • 税务局工会
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设