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

  • vivox70pro+支持面部解锁吗(vivox70pro支持双卡双待吗)

    vivox70pro+支持面部解锁吗(vivox70pro支持双卡双待吗)

  • 网易云k歌保存本地在哪里找(网易云k歌保存的草稿在哪)

    网易云k歌保存本地在哪里找(网易云k歌保存的草稿在哪)

  • vivo隐私与应用加密密码忘了怎么办(vivo隐私与应用加密忘记怎么找回密码?)

    vivo隐私与应用加密密码忘了怎么办(vivo隐私与应用加密忘记怎么找回密码?)

  • 华为nova7如何取消抬起亮屏(华为nova7如何取消锁屏壁纸图片)

    华为nova7如何取消抬起亮屏(华为nova7如何取消锁屏壁纸图片)

  • 微信界面黑色怎么设置成白色(微信界面黑色怎么办)

    微信界面黑色怎么设置成白色(微信界面黑色怎么办)

  • 联想拯救者进入bios设置按哪个键(联想拯救者进入bios按什么键)

    联想拯救者进入bios设置按哪个键(联想拯救者进入bios按什么键)

  • 3g手机能用微信吗(3g手机能使用微信吗)

    3g手机能用微信吗(3g手机能使用微信吗)

  • ata和ahci有什么区别(ahci和ata的区别)

    ata和ahci有什么区别(ahci和ata的区别)

  • 收到数据包少无法上网(数据包收到很少不能上网)

    收到数据包少无法上网(数据包收到很少不能上网)

  • 拼多多退货商家不处理怎么办(拼多多退货商家拒收快递会怎么样)

    拼多多退货商家不处理怎么办(拼多多退货商家拒收快递会怎么样)

  • 取消gprs还能上网吗(gprs能不能取消)

    取消gprs还能上网吗(gprs能不能取消)

  • mate30和mate20区别(mate30和mate20哪个好)

    mate30和mate20区别(mate30和mate20哪个好)

  • 怎么让ppt图片一个一个出来(怎么让ppt图片一部分变透明)

    怎么让ppt图片一个一个出来(怎么让ppt图片一部分变透明)

  • 微信群里如何私聊个人(微信群里如何私聊)

    微信群里如何私聊个人(微信群里如何私聊)

  • 苹果11max上网太慢的原因(iphone 11上网很慢)

    苹果11max上网太慢的原因(iphone 11上网很慢)

  • 知乎可以看最近访客吗(知乎看最近访客)

    知乎可以看最近访客吗(知乎看最近访客)

  • wpsreset按了怎么恢复(wpsreset按了怎么用手机调回)

    wpsreset按了怎么恢复(wpsreset按了怎么用手机调回)

  • ipada2197能插手机卡吗(ipad能插手机卡吗)

    ipada2197能插手机卡吗(ipad能插手机卡吗)

  • 电子计算器off是什么(电子计算器off是哪个键)

    电子计算器off是什么(电子计算器off是哪个键)

  • 怎么看淘宝号是哪一年注册的(怎么看淘宝号是不是被盾了)

    怎么看淘宝号是哪一年注册的(怎么看淘宝号是不是被盾了)

  • 虾米音乐怎么分享到陌陌(虾米音乐怎么播放本地音乐)

    虾米音乐怎么分享到陌陌(虾米音乐怎么播放本地音乐)

  • mt6762处理器等于骁龙(mt6762处理器等于A几)

    mt6762处理器等于骁龙(mt6762处理器等于A几)

  • oppo悬浮键盘怎么关闭(oppo悬浮键盘怎么变大)

    oppo悬浮键盘怎么关闭(oppo悬浮键盘怎么变大)

  • 苹果13系统短信有个叹号(苹果13系统短信叹号怎么取消)

    苹果13系统短信有个叹号(苹果13系统短信叹号怎么取消)

  • 拼多多晒图如何置顶(拼多多晒图怎么操作步骤)

    拼多多晒图如何置顶(拼多多晒图怎么操作步骤)

  • line收不到手机验证码(手机收不到line的验证短信)

    line收不到手机验证码(手机收不到line的验证短信)

  • 小度在家1s怎么使用(小度在家1s怎么下载钉钉)

    小度在家1s怎么使用(小度在家1s怎么下载钉钉)

  • 公司购车购置税有优惠吗
  • 分公司财务负责人和总公司财务负责人
  • 小规模纳税人预缴税款怎么填申报表
  • 进口环节增值税由海关征收吗
  • 个体工商户生产经营所得怎么申报
  • 并购产生的商誉怎么冲减
  • 商贸公司可以用加工厂的商标委托加工生产吗
  • 交易性金融资产是什么意思
  • 合并会计报表长期股权投资
  • 税费改革是什么
  • 摊销费用怎么计提
  • 材料入库时实收什么意思
  • 应交税费明细科目设置
  • 单位购置汽车如何入账
  • 律师事务所日常管理松懈混乱整改措施
  • 应交增值税明细科目如何结转
  • 500万以下固定资产最新政策
  • 计提递延所得税费用会计分录
  • 哪些行业可以加计抵扣进项税
  • 加工费月底需要全部结转吗
  • 代开票扣了个人所得税怎么做账?
  • 借款利息资本化条件
  • 员工迟到扣工资的会计处理
  • 银行定期存款账户
  • 进项发票如何抵扣销项发票
  • 汇款手续费应由谁承担
  • 开具给个人的发票哪里查询
  • mac环境搭建
  • RuntimeError: CUDA out of memory 已解决
  • 带息应收票据计息时
  • 收到的担保费如何记账
  • 什么叫非同一控制下
  • web安全如何入门
  • vue环境搭建及配置简书
  • auto.js 教程
  • php二维数组foreach
  • 表单验证方法一般有哪几种
  • 残保金计提比例
  • 用于应酬用的烟有哪些
  • 小型微利企业的认定标准2023年
  • 年末关账注意事项
  • 非独立核算的分公司需要独立建账吗
  • 关于翡翠手镯知识
  • 企业购进材料取得增值税专用发票
  • 开一家公司的具体步骤
  • 公司注销前的资产负债
  • 怎样计提税金及附加
  • 销售退款现金流量表
  • 建筑施工企业检查的内容包括什么
  • 融资租赁首付租金会计账务处理
  • 商业银行的固定资产
  • 下列sql server语句中出现语法错误的是
  • win10开机出现onekey ghost
  • Windows Server 2003几个实用小技巧
  • win8搜索程序和文件在哪里
  • win8蓝屏解决方法
  • 制作xp系统盘需要多大u盘
  • windowsserver2008修改远程端口
  • win8激活windows
  • win10mobile最新版本
  • win10内置管理员账户禁用
  • cocos2dx4.0教程
  • 基于JAVAscrip的课程设计源代码
  • js frameset
  • 详解16型人格
  • xcopy /s /e
  • linux lvm配置
  • 如何获取医院电子发票
  • 瀑布流 css
  • 学javascript的书
  • unity中assets文件夹的作用
  • jquery设置滚动条
  • android内存优化三 简书
  • unity坐标系转换
  • jquery下拉列表框
  • 重庆地方税务局12366
  • 工会经费计提比例0.8%
  • 是否一般纳税人怎么查
  • 请问一般纳税人的业务协调税率是多少
  • 安全生产管理局和应急局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设