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

  • 开博尔电视盒子刷机(开博尔电视盒子)(开博尔电视盒子,手机遥控下载)

    开博尔电视盒子刷机(开博尔电视盒子)(开博尔电视盒子,手机遥控下载)

  • 抖音头像下面有个白色抖音符号(抖音头像下面有个红色标志)

    抖音头像下面有个白色抖音符号(抖音头像下面有个红色标志)

  • oppo手机怎么设置短信拦截(oppo手机怎么设置下面三个按键)

    oppo手机怎么设置短信拦截(oppo手机怎么设置下面三个按键)

  • 腾讯会议后台运行老师能看见吗

    腾讯会议后台运行老师能看见吗

  • cpu会烧坏吗(手机cpu会烧坏吗)

    cpu会烧坏吗(手机cpu会烧坏吗)

  • dng格式是raw吗(dng是不是raw)

    dng格式是raw吗(dng是不是raw)

  • 屏幕划痕手机店能修吗(手机屏幕有划痕可以退货吗)

    屏幕划痕手机店能修吗(手机屏幕有划痕可以退货吗)

  • 平板美版和国行的区别(平板美版和国行苹果哪个好)

    平板美版和国行的区别(平板美版和国行苹果哪个好)

  • iphone的电池最大容量低于多少不能使用(iphone的电池最大容量掉的快是什么原因)

    iphone的电池最大容量低于多少不能使用(iphone的电池最大容量掉的快是什么原因)

  • 我的手机是什么型号(我的手机是什么型号的怎么查)

    我的手机是什么型号(我的手机是什么型号的怎么查)

  • qq安全中心人脸识别不了验证不了怎么办(qq安全中心 人脸)

    qq安全中心人脸识别不了验证不了怎么办(qq安全中心 人脸)

  • 手机关机怎么定位找回(手机关机怎么定位到准确位置吗)

    手机关机怎么定位找回(手机关机怎么定位到准确位置吗)

  • 淘宝申请试用还要退回去吗(淘宝申请试用是什么意思)

    淘宝申请试用还要退回去吗(淘宝申请试用是什么意思)

  • qq三个太阳三个月亮是多少级(qq三个太阳三个月亮三个星星以后是什么)

    qq三个太阳三个月亮是多少级(qq三个太阳三个月亮三个星星以后是什么)

  • microsoft visual是啥

    microsoft visual是啥

  • ipad air2支持插卡吗(ipadair2可以插卡上网吗)

    ipad air2支持插卡吗(ipadair2可以插卡上网吗)

  • 照相的软件有哪些(照相的软件哪个好)

    照相的软件有哪些(照相的软件哪个好)

  • 电脑灰尘太多怎么清理(电脑里灰尘多有什么影响)

    电脑灰尘太多怎么清理(电脑里灰尘多有什么影响)

  • 苹果x机身长多少厘米(苹果x机体长度)

    苹果x机身长多少厘米(苹果x机体长度)

  • 华为8x盲人模式怎么关闭(华为8xmax盲人模式怎么关)

    华为8x盲人模式怎么关闭(华为8xmax盲人模式怎么关)

  • nova4返回键在哪(nova4返回键怎么设置出来)

    nova4返回键在哪(nova4返回键怎么设置出来)

  • 华为p30支持北斗导航吗(华为P30支持北斗卫星消息吗)

    华为p30支持北斗导航吗(华为P30支持北斗卫星消息吗)

  • 手环测睡眠的原理 (手环测睡眠的原理和作用)

    手环测睡眠的原理 (手环测睡眠的原理和作用)

  • 免税收入对应的成本费用可以扣除吗
  • 税务ukey电子发票二维码用什么扫码
  • 实收资本实务处理办法
  • 对公转账房租怎么备注
  • 未到账的银行存款怎么取
  • 合营企业和联营企业的持股比例
  • 劳务公司拿什么来做成本
  • 保险公司收车船使用税吗
  • 餐费可以抵扣吗
  • 银行日记账必须一年一本吗
  • 转账支票存根联图片
  • 债权转增资本应缴纳什么税
  • 售后回购涉税处理
  • 个人转让著作权所得免征个人所得税吗
  • 不是单位职工个税怎么算
  • 施工企业暂估成本税前扣除
  • 门店装修会计怎样处理帐?
  • 员工午餐补贴可以入福利费吗?
  • 小规模纳税人残疾人纳税优惠
  • 营业外收入怎么申报
  • 负债清偿损益明细表可以0报么
  • 债务重组收益会计处理
  • 年底结账时需要做账吗
  • 鸿蒙系统怎么开启开发者权限
  • realtek自动安装
  • 发票认证平台上不去
  • 购物卡销售的重点工作是什么
  • php中数组的常用函数及用法
  • PHP:zip_entry_filesize()的用法_Zip函数
  • 投资性房地产如何计提折旧
  • 企业购买烟酒可以抵扣吗
  • 100行php代码实现加密端口转发
  • 报废的设备怎么处理
  • 拖拉机拖拉机耕地
  • 其他综合收益明细科目
  • 哪些项目计入其他应收款
  • php和sql
  • 联邦学习攻击与防御综述
  • 投稿p2
  • php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
  • 怎么用php写一个简单框架
  • php使用while循环计算1到100的和
  • 公司管理费一般占多少个点
  • 学网新用什么电脑
  • 怎么把python代码发给别人运行
  • 小规模纳税人做工资没交社保
  • 个体户季报网上申报怎么填写
  • 财务人员如何爱岗敬业
  • 预收款开票后如何做账
  • 研发支出怎么结转到管理费用
  • 企业取得租车发票
  • 什么是现金流量表
  • 购买金税盘的分录
  • 利润表中的营业收入怎么算出来的
  • 实用的银行转账怎么转
  • asp.net ui
  • Navicat for MySQL定时备份数据库及数据恢复详解
  • win7不能复制文件怎么办
  • win10系统怎么设置开机密码
  • ubuntu文本编辑器怎么打开
  • mac电脑apple id
  • mac怎么自定义桌面图标
  • mac图片格式怎么转换jpeg
  • sf2是什么文件
  • 如何解决windows资源管理器已停止工作
  • perl中use strict
  • 脚本合集
  • Compact 显示和更改 NTFS 分区上的文件或目录压缩
  • iframe的使用和例子
  • 批处理set命令
  • jquery 右键菜单
  • SharedPreferences中的MODE_APPEND 和 MODE_PRIVATE 区别
  • 信息流广告与原生广告的区别
  • python 断言详细讲解用法及其案例
  • 国税系统公务员政审父母超生合格吗
  • 增值税纳税申报操作流程
  • 河北电子税务局社保缴费流程
  • 重庆购房退契税
  • 新车购置税最低多少钱
  • 异辛烷征收消费税对成品油影响
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设