vue-router 组件复用问题详解


Posted in Javascript onJanuary 22, 2018

组件系统是Vue的一个重要组成部分,它可以将一个复杂的页面抽象分解成许多小型、独立、可复用的组件,通过组合组件来组成应用程序,结合 vue-router 的路由功能将各个组件映射到相应的路由上,通过路由的变化来告诉Vue要在哪里渲染他们,实现各个组件、各个页面之间的跳转导航。

问题

使用 vue-router 切换路由时会触发组件树的更新,根据定义的路由渲染一个新的组件树,大致的切换过程是这样的:

  1. 停用并移除不需要的组件
  2. 验证切换的可行性
  3. 复用没有进行更新的组件
  4. 启用并激活新的组件

具体路由切换控制流程请参考官方文档:切换控制流水线

那 vue-router 是怎么判断某一个组件可以复用的呢? 我们看一下下面这条路由配置:

{
  path: 'post/:postId',
  name: 'post',
  component: resolve => require(['./components/Post.vue'],resolve)
}

这是通过文章ID加载对应文章页面的路由,第一次访问时, Post.vue 这个组件会被渲染到组件树中,mounted安装组件时通过文章ID获取文章内容展示到页面上,当我们访问另一篇文章时,路由参数 :postId 发生改变,按照我们的预期应该会展示新文章的内容,但是事与愿违。

我们看到的还是之前的文章,虽然路由参数已发生更改,但是 vue-router 会以为你访问的是 Post.vue 这个组件,由于之前已经渲染过该组件,所以会直接复用之前的组件,并且 不会 执行组件中的任何操作包括 mounted 之类的生命周期函数。

所以我们最终看到的还是原来组件的内容。

那要怎么才能实现我们期望的效果呢?下面介绍一种有效的解决方法

解决方法

我们可以使用 watch 侦听器来监听路由的变化情况,根据路由参数的变化来响应相应的数据,具体实现过程是这样的:

定义数据获取方法

首先定义一个获取文章的方法,根据文章ID从后台获取对应的文章信息。

methods: {
  getPost(postId) {
    this.$http.get(`/post/get_post/${postId}`).then((response) => {
      if(response.data.code === 0){
        this.post = response.data.post;
      }
    });
  }
}

监听路由

接着是在路由切换的时候判断目标组件是否是 Post.vue 组件,这里可以根据定义的路由名称 name 实现,如果是,我们就可以从路由信息中获取目标文章ID来更新组件内容。

watch: {
  '$route' (to, from) {
    if(to.name === 'post'){
      this.getPost(to.params.postId);
    }
  }
}

组件初始化

这里需要注意的是, 当组件首次被挂载到组件树上时,对路由的监听是无效的 ,这时我们需要在生命周期钩子 mounted 对组件进行初始化工作:

mounted() {
  this.getPost(this.$route.params.postId);
}

写在最后

通过上面的方法就可以实现组件内容随路由参数的变化而更新了,有效解决了 vue-router 组件复用导致路由参数失效的问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
锋利的jQuery jQuery中的DOM操作
Mar 21 Javascript
JQuery对class属性的操作实现按钮开关效果
Oct 11 Javascript
BootStrap3学习笔记(一)之网格系统
May 20 Javascript
js接收并转化Java中的数组对象的方法
Aug 11 Javascript
新闻上下滚动jquery 超简洁(必看篇)
Jan 21 Javascript
详解VueJs异步动态加载块
Mar 09 Javascript
原生js更改css样式的两种方式
Mar 15 Javascript
jQuery中map函数的两种方式
Apr 07 jQuery
如何解决js函数防抖、节流出现的问题
Jun 17 Javascript
Vue 动态组件components和v-once指令的实现
Aug 30 Javascript
浅谈webpack构建工具配置和常用插件总结
May 11 Javascript
微信小程序开发(二):页面跳转并传参操作示例
Jun 01 Javascript
详解webpack多页面配置记录
Jan 22 #Javascript
详解html-webpack-plugin用法全解
Jan 22 #Javascript
js构造函数创建对象是否加new问题
Jan 22 #Javascript
bmob js-sdk 在vue中的使用教程
Jan 21 #Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
Jan 21 #Javascript
Angular17之Angular自定义指令详解
Jan 21 #Javascript
laravel5.3 vue 实现收藏夹功能实例详解
Jan 21 #Javascript
You might like
SONY ICF-SW55的电路分析
2021/03/02 无线电
discuz7 phpMysql操作类
2009/06/21 PHP
使用PHP实现密保卡功能实现代码<打包下载直接运行>
2011/10/09 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
Python序列类型的打包和解包实例
2019/12/21 Python
python基于opencv检测程序运行效率
2019/12/28 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
init进程的作用
2015/08/20 面试题
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
土木工程毕业生推荐信
2013/10/28 职场文书
电脑教师的教学自我评价
2013/11/26 职场文书
大学生暑期实践感言
2014/02/26 职场文书
创业女性典型材料
2014/05/02 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
求职信范文怎么写
2015/03/19 职场文书
土建技术员岗位职责
2015/04/11 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
Win11开始菜单添加休眠选项
2022/04/19 数码科技