解决vue-router 嵌套路由没反应的问题


Posted in Javascript onSeptember 22, 2020

先看下route.js

//route.js
const App = () => import('../App.vue');
const Login = () => import('../component/Login.vue');
const Class = () => import('../component/Class.vue');
const CourseList = () => import('../component/CourseList.vue');
const CourseContent = () => import('../component/CourseContent.vue');
 
const routers = [{
  path:'/',
  component:App,
  children:[{
      path:'login',
      component:Login
    },{
      path:'class',
      component:Class
    },
    { 
      path:'course',
      children:[{
          path:'list',
          component:CourseList
        },{
          path:'content',
          component:CourseContent
        }
      ]
       
    },
  ]
}] 

export default routers

当你访问的时候,发现

http://localhost:8080/#/login

http://localhost:8080/#/class

都正常,但是:

http://localhost:8080/#/course/list

http://localhost:8080/#/course/content

都是一片空白,检查元素,发现没有加载过来。检查,子路由前面并没有加/,所以这没有问题,排除。

其实这是list的父级course没有component,有了componnet,并且需要在这个component理要有<router-view></router-view>,修改下:

{
path:'course',
component:Course
children:[{
path:'list',
component:CourseList
},{
path:'content',
component:CourseContent
}
]
},

Course.vue如下:

<template>
<div>
<router-view></router-view>
</div>
</template>

这样就可以实现嵌套了。想想,本例子中,其实App组件也是这样的,他提供了个<router-view></router-view>,对不对?

http://localhost:8080/#/course/list

http://localhost:8080/#/course/content

都可以访问了。

补充知识:关于Vue-router子路由不显示的一个坑

遇到这个问题的基本上应该跟我遇到的情况一样,但是这个问题很隐蔽,老手不会遇到,新人说不清楚,所以爬坑之后来提一下。

父子路由是嵌套关系,所以不能跳过父组件直接显示子组件。例如我有如下index.js:``

import Vue from 'vue'
import VueRouter from 'vue-router'

//引入两个组件
import recomView from '../components/views/ty/recom/view.vue'
import recomEdit from '../components/views/ty/recom/edit.vue'

Vue.use(VueRouter)

//建立router
const router = new VueRouter({
 mode: 'history',
 routes: [
 {
   path: '/recom',
   children: [
    {
     path: 'view',
     name: 'recomView',
     component: recomView
    },
    {
     path: 'edit',
     name: 'recomEdit',
     component: recomEdit
    }
   ]
  },
  
//暴露router,export default方式暴露出的模块在导入时可以起任何名(不冲突的情况下)
export default router

在某个组件XXX.vue中,我想把recomView和recomEdit两个组件导入,

<template>
……
<router-view></router-view>
……
</template>

<script>
……
this.$router.push('/recom/view')
this.$router.push('/recom/edit')
……
</script>

然而使用上面的index.js,会发现无论如何也无法引入。原因在于引入的时候跳级了。回头看上面index.js,不妥之处很多,慢慢分析一下

父级路由'/recom'没有对应的component,导致XXX.vue中的router-view没有对应的组件,所以此时页面中你想显示recomView或者recomEdit的地方会是空白

假如此时把'/recom'处添加component,为方便直接给component: recomView,会发现你原本指向recomView和recomEdit的两个路由都会显示recomView

那么问题就清楚了,其实就是给的路由跳级了:父子路由是一个两层的嵌套关系,而最上层组件中的router-view只会指向我们这里的父级路由,也就是'/recom',要想指向子路由,那就要再嵌套一层

到这里,解决方法就比较容易想到了,那就是再建立一个组件recom.vue对应父级路由,在recom.vue中再引入一次router-view就行了。

//recom.vue,鉴于我这里并不需要这个'/recom'页面,所以以最简单的方式引入router-view就可以了
<template>
 <router-view></router-view>
</template>

那还有没有更简单的不需要建立recom.vue方法呢?有。

在index.js中直接引入const recom = {template: `<router-view></router-view>`}就行了。修正后的index.js应该是这样的:

import Vue from 'vue'
import VueRouter from 'vue-router'

//引入两个组件
import recomView from '../components/views/ty/recom/view.vue'
import recomEdit from '../components/views/ty/recom/edit.vue'

Vue.use(VueRouter)

//引入recom组件!
const recom = {
 template: `<router-view></router-view>`
}

//建立router
const router = new VueRouter({
 mode: 'history',
 routes: [
 {
   path: '/recom',
   component: recom,  //引入recom,必不可少
   children: [
    {
     path: 'view',
     name: 'recomView',
     component: recomView
    },
    {
     path: 'edit',
     name: 'recomEdit',
     component: recomEdit
    }
   ]
  },
  
export default router

那还有没有其他的办法呢?也有。那就是不要用嵌套路由,直接把子路由升到跟父路由同级就行了,反正你这里又不需要父路由对应的组件,然后给父路由设置一个redirect指向你想默认显示的页面,这个相信都会,就不写了。这也是我一开始想到的办法,但是上面的bug没解决心里不舒服,所以耽误了点时间,不过还好,勉强算是找到原因了。

感觉JS是个很灵活的语言,像我这种半路出家什么书都没看直接开始做web的,真的要抽时间好好补补基础了。

以上这篇解决vue-router 嵌套路由没反应的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
Oct 10 Javascript
javascript创建数组之联合数组的使用方法示例
Dec 26 Javascript
JavaScript 浏览器对象模型BOM使用介绍
Apr 13 Javascript
浅谈jQuery的offset()方法及示例分享
Jul 17 Javascript
JS实现页面跳转参数不丢失的方法
Nov 28 Javascript
Angular.js自动化测试之protractor详解
Jul 07 Javascript
vue判断input输入内容全是空格的方法
Mar 02 Javascript
vue.js 实现点击按钮动态添加li的方法
Sep 07 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
Sep 28 Javascript
JS将时间秒转换成天小时分钟秒的字符串
Jul 10 Javascript
JS实现可用滑块滑动的缓动图代码
Sep 01 Javascript
js实现简单抽奖功能
Nov 24 Javascript
Js跳出两级循环方法代码实例
Sep 22 #Javascript
vue 二维码长按保存和复制内容操作
Sep 22 #Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
Sep 22 #Javascript
解决vue2中使用elementUi打包报错的问题
Sep 22 #Javascript
element-ui中dialog弹窗关闭按钮失效的解决
Sep 22 #Javascript
小程序实现录音功能
Sep 22 #Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
Sep 22 #Javascript
You might like
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
2014/06/01 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
Python装饰器入门学习教程(九步学习)
2016/01/28 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
python利用platform模块获取系统信息
2020/10/09 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
对教师的评语
2014/04/28 职场文书
道德之星事迹材料
2014/05/03 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
大学军训的体会
2014/11/08 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android