IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 【技能】vue-router的嵌套、动态路由、路由懒加载 -> 正文阅读

[JavaScript知识库]【技能】vue-router的嵌套、动态路由、路由懒加载

目录

(一)src文件夹下的文件结构

(1)router文件夹-router.js

(2)App.vue文件

(3)main.js文件

(4)components文件夹下的文件

????????1. Home.vue文件

????????2. HomePage1.vue文件

????????3. HomePage2.vue文件

????????4.? About.vue文件

????????5. User.vue文件

(二)路由懒加载


注:

  1. ?routes的写错,会导致后续link-view无法渲染内容 。非routers!!!? (参考:vue-router 中router-view不能渲染)
  2. 使用?this.$router.push('/home')?时,会出现报错:‘Avoided redundant navigation to current location’。解决方案参考《?vue-router 路由重复点击报错?》

(一)src文件夹下的文件结构

src文件结构

(1)router文件夹-router.js

????????src文件夹-->新建router文件夹-->新建router.js文件(可将在创建vueCli项目后,自动生成的router.js删除)。

// 0.导入Router
import Router from 'vue-router' 
import Vue from 'vue'
//*************************路由正常写法******************************************
// 导入组件components下的不同vue文件,即不同的页面
//import Home from '../components/Home'
//import About from '../components/About'
//import User from '../components/User'
//*************************路由懒加载写法:避免打包后的app.js文件太大******************************************
// 1个路由懒加载,打包后,在js文件夹下会生成1个js文件。只有路由被访问时,才会加载对应的js文件。
const Home= () => import('../components/Home')  
const HomePage1= () => import('../components/HomePage1')  //Home页面的子页面1
const HomePage2= () => import('../components/HomePage2')  //Home页面的子页面2
const About= () => import('../components/About')
const User= () => import('../components/User')

// 1.安装Router插件。通过Vue.use(插件)
Vue.use(Router)
// 2.配置路由和组件之间的应用关系。
const routes=[  //注意:是routes,非routers。
  {
    // 保证网页默认打开首页
    path: '',
    redirect:'/home',
  },
  {
    path: '/home',
    component: Home,
    // component:()=>import('../components/Home') , //不推荐写法
    meta: {
      title:'首页',
    },
    children: [
      {
        path: '',
        redirect:'page1' ,
      },
      {
        path: 'page1',
        component: HomePage1,
      },
      {
        path: 'page2',
        component: HomePage2,
      },
    ]

  }, {
    path: '/about',
    component: About,
    meta: {
      title:'关于',
    },
  }, {
    path: '/user/:userid', //userid是自定义的。符号:不能省略。
    component: User,
    meta: {
      title:'用户',
    },
  }, {
    path: '/profile', 
    component: Profile,
    meta: {
      title:'档案',
    },
    beforeEnter:(to,from,next)=> {
      console.log('档案界面'); //局部路由监测
    }
  }
]
//3.新建Router对象,并命名为router。
const router = new Router({
  routes,
  linkExactActiveClass:'ExactActive', //修改自动生成的类名称——router-link-exact-active
  linkActiveClass:'Active', //修改自动生成的类名称——router-link-active
  mode:'history',  //html5的history模式.能够将网址上的#去掉
});

// 4.将router对象传入到Vue实例
export default router;

//*****************其他功能****************************8
// 全局导航守卫监测
router.beforeEach((to, from, next) => { 
  document.title = to.matched[0].meta.title;
  next(); //不能省略
});
// 后置钩子(hook)
router.afterEach((to,from) => { 
  //不需要next()
});

// 避免多次push导致router重复
const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
   return originalPush.call(this, location).catch(err => err)
}

(2)App.vue文件

????????在src文件夹下--> App.vue文件中使用。

<template>
  <div id="app">
    <!-- router-link标签,默认是a标签 -->
    <!-- <router-link to="/home">首页</router-link> -->
    <!-- replace属性无效,不知道为什么 -->
     <!-- <router-link to="/home" tag="button" replace>首页</router-link> -->
    <!-- <router-link to="/home" tag="button">首页</router-link>
    <router-link to="/about" tag="button">关于</router-link> -->

    <!-- ***************************************************************** -->

    <!-- 普通组件方法 -->
    <button @click="homeClick">首页</button>
    <button  @click="aboutClick">关于</button>

     <!-- 动态路由 -->
    <router-link :to="'/user/'+userId">用户</router-link>  

    <!-- 保证子页面内容的呈现 -->
    <router-view></router-view> 
  </div>
</template>
<script>
// 导出
export default {
  name:'App',
  data(){
     return{
       userId:'张三',
     }
  },
  methods:{
    homeClick(){
       this.$router.push('/home')
    },
    aboutClick(){
      this.$router.push('/about')
    },
  }
}
</script>

<style>

button:hover{
   cursor: pointer;
}

/*router-link-active类名的重新定义*/
.Active{
  color:#fff;
  background-color:transparent;
  border:1px solid black;
 
}

/*router-link-exact-active类名的重新定义*/
.ExactActive{
  background-color:royalblue;
  
}
</style>

(3)main.js文件

????????在src文件夹下--> main.js文件中使用。

import Vue from 'vue'
import App from './App.vue'
import router from './router/router.js'

Vue.config.productionTip = false

new Vue({
  router, //使用router
  render: h => h(App)  //网页打开后,首先会渲染App.vue文件的原因!!!
}).$mount('#app')

(4)components文件夹下的文件

????????1. Home.vue文件

????????在src文件夹下--> components文件夹-->Home.vue文件。

<template>
    <div id="home">
        <div>我是首页</div>
        <div>我是首页内容,哈哈哈</div>

        <router-link to="/home/page1">子页面1</router-link>
        <router-link to="/home/page2">子页面2</router-link>

         <!-- 保证子页面的内容呈现 -->
        <router-view></router-view>
    </div>
</template>
<script>
// 导出
export default {
    name:'Home',
}
</script>
<style scoped>

</style>

????????2. HomePage1.vue文件

????????在src文件夹下--> components文件夹-->HomePage1.vue文件。

<template>
    <div id="homePage1">
        <ul>
            <li>子页面1的内容1</li>
            <li>子页面1的内容2</li>
            <li>子页面1的内容3</li>
            <li>子页面1的内容4</li>
        </ul>
    </div>
</template>
<script>
// 导出
export default {
    name:'HomePage1',
}
</script>
<style scoped>

</style>

????????3. HomePage2.vue文件

?????????在src文件夹下--> components文件夹-->HomePage2.vue文件。

<template>
    <div id="homePage2">
        <ul>
            <li>子页面2的内容1</li>
            <li>子页面2的内容2</li>
            <li>子页面2的内容3</li>
            <li>子页面2的内容4</li>
        </ul>
    </div>
</template>
<script>
// 导出
export default {
    name:'HomePage2',
}
</script>
<style scoped>

</style>

????????4.? About.vue文件

????????在src文件夹下--> components文件夹-->About.vue文件。

<template>
    <div id="about">
        <div>我是关于</div>
        <div>我是关于内容,哈哈哈</div>
    </div>
</template>
<script>
export default {
    name:'About',
}
</script>
<style scoped>

</style>

????????5. User.vue文件

?????????在src文件夹下--> components文件夹-->User.vue文件。

<template>
    <div id="user">
        <div>我是用户</div>
        <div>{{userName}}</div>
    </div>
</template>
<script>
// 导出
export default {
    name:'User',
    computed:{
        userName(){
            console.log(this); //测试
            return this.$route.params.abc; //保持与router.js文件中自定义的变量abc一致
        }
    }
}
</script>
<style scoped>

</style>

(二)路由懒加载

  1. 路由懒加载写法:避免打包后的app.xxxx.js文件太大。
  2. 1个路由懒加载,打包后,在js文件夹下会生成1个js文件。
  3. 只有路由被访问时,才会加载对应的js文件,提高页面访问效率。

路由懒加载的写法

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-23 15:40:27  更:2021-12-23 15:42:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:26:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码