当前位置: 首页 > news >正文

vue-router小结

1.什么是vue-router

vue-router是vue.js官方给出的路由解决方案,只能结合vue项目进行使用,能够轻松的管理SPA项目中组件的切换

2.vue-router的用法

先安装vue-router (npm i vue-router)
在新建router/index.js 文件,在文件内导入Vue和vue-router(新建的路径由自己决定)

// 导入Vue和VueRouter的包
// router/index.js文件
import Vue from 'vue'
import VueRouter from 'vue-router'// 调用Vue.use()函数,把VueRouter安装为Vue的插件
Vue.use(VueRouter)const Home = () => import("../home.vue");// 创建路由的实例对象
const router = new VueRouter({// routes是一个数组,定义"hash地址"与"组件"之间的关系routes:[// 重定向属性,当刚打开页面,并没有点击跳转时,则设置首页面渲染{path: '/',redirect: '/home'},{path: '/home',component: Home}]
})// 导出的目的是为了在main.js进行导入, 将路由实例对象挂载在 new Vue()里面
export default router

在组件中vue-router的用法

  // app.vue组件<template><div>// router-link来替代普通的a连接 to为组件路径<router-link to='/home'></router-link>// 只要在项目中安装和配置了vue-router,就可以使用router-view这个组件// 作用 : 占位符,表示渲染的内容的位置<router-view></router-view></div></template>

嵌套路由的使用

  import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter)//懒加载,打包的时候会分离,使用的时候才会加载 可减小js体积const Home = () => import('Home.vue')const tab = () => import('Tab.vue')const router = new VueRouter({routes: [{path: '/home',component: Home,// 子路由的重定向redirec: '/home/tab',// 子路由children: [// 默认子路由 如果children中的path为空,则这条路由规则,就叫做默认子路由{path: 'tab', // 子路由路径不用加/component: Tab}]}]})export default router// app.vue组件<template><div>// 路径为子路径,点击后跳转到子路径<router-link to='/home/tab'></router-link>// 若使用的是默认子路由,则to后面 /tab可以省略<router-link to='/home'></router-link><router-view></router-view></div></template>

3.动态路由的使用

// 需求: 在Movie组件中,希望根据id的值,展示对应电影的详情信息// 这里path路径中有参数,可以开启props传参,是为了方便Movie组件拿到参数值
// 在对象中加入props:true
// 如果路径中没有参数,则开启props传参也没有意义
{path: '/movie/:id',component: Movie,props: true}// id的值会存在放Vue实例中的 $route.params.id中// Movie.vue
//则这里就可以直接拿到id的值
props: ['id']

命名路由

import Vue from 'vue'
import VueRouter from 'vue-router'Vue.use(VueRouter)const Home = { template: '<div>This is Home</div>' }
const Foo = { template: '<div>This is Foo</div>' }
const Bar = { template: '<div>This is Bar {{ $route.params.id }}</div>' }const router = new VueRouter({mode: 'history',base: __dirname,routes: [{ path: '/', name: 'home', component: Home },{ path: '/foo', name: 'foo', component: Foo },{ path: '/bar/:id', name: 'bar', component: Bar }]
})new Vue({router,template: `<div id="app"><h1>Named Routes</h1><p>Current route name: {{ $route.name }}</p><ul><li><router-link :to="{ name: 'home' }">home</router-link></li><li><router-link :to="{ name: 'foo' }">foo</router-link></li>// 若这里是path,则不可以写params,写了不会生效<li><router-link :to="{ name: 'bar', params: { id: 123 }}">bar</router-link></li></ul><router-view class="view"></router-view></div>`
}).$mount('#app')

多个路由指向同一个组件时,组件内的生命周期钩子不会被调用了,这是因为组件被复用了,如以下代码都是指向Home组件

  const routes = [{path: '/home',component: Home},{path: '/about',component: Home}]// 使用watch则可以进行监听,对路由参数做出响应watch: {'$route'(to,from){console.log(from)}}// 也可以在组件内使用如下beforeRouteUpdate(to, from, next) {// react to route changes...// don't forget to call next()}

扩展:

a.在hash地址中,/后面的参数项,叫做’路径参数’,路由中路径参数放在params中

b.在hash地址中,?后面的参数项,叫做”查询参数”,路由中查询参数放在query中

c.在this.$route中,path只是路径部分,不包含查询参数,而fullPath则是完整路径

4.路由守卫

记住参数或查询的改变并不会触发进入/离开的导航守卫(这个是指组件内的beforeRouteEnter)。你可以通过观察 $route 对象(watch)来应对这些变化,或使用 beforeRouteUpdate 的组件内守卫。

注意: 如果是全局守卫和组件内的beforeRouteUpdate和beforeRouteLeave在动态路由跳转时也会调用触发守卫

全局前置路由守卫

   // router/index.js// to是将要访问的路由的对象// from 是将要离开的路由的对象// next是一个函数,调用next() 表示放行,允许这次路由导航router.beforeEach((to,from,next) => {next();})// next函数的3中调用方式// 当前用户拥有后台主页的访问权限,直接放行 next();// 当前用户没有后台主页的访问权限,强制跳转登录页面 next('/login')// 当前用户没有后台主页的访问权限,不允许跳转到后台主页  next(false);

使用场景:使用前置路由守卫模拟登录(代码展示)

router.beforeEach((to, from, next) => {// 判断要跳转的页面是不是登录页,如果是的话,就直接同意跳转if (to.path === '/login') {return next();}// 如果不是,则判断浏览器里是否存储了token值,判断登录是否过期,如果不存在token或者过期//则强制跳转到登录页重新进行登录else if (!localStorage.getItem('token')) {return next('/login');}// 最后则是有token值,则让其正常跳转next();
})

以上则是一个模拟登录功能的简单实现,但以上功能还没有完善,只是大概结合全局前置路由守卫进行实现

全局后置钩子

// 不会接受 next 函数也不会改变导航本身:
router.afterEach((to, from) => {// ...
})

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python3网络爬虫开发实战(1)爬虫基础
  • Vue.js 与 Ajax(vue-resource)的集成应用
  • Vue 项目部署后首页白屏问题排查与解决
  • WEBKIT 通过JavaScript 调用本地,硬件未来之窗OS硬件APP
  • 03、爬虫数据解析-bs4解析/xpath解析
  • 套接字选项、广播和组播
  • 【elasticsearch实现优先展示连词并按某个字段折叠显示最新一条】
  • 代码片段管理的终极助手:MassCode
  • 参数化的艺术:Postman中API测试用例的动态构建
  • DP学习——享元模式
  • javascript deriveKey和deriveBits()由主密钥派生出新的密钥进行加密
  • git--本地仓库修改同步到远程仓库
  • 基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
  • SPSS个人版是什么软件
  • qt--做一个拷贝文件器
  • 2019.2.20 c++ 知识梳理
  • Cookie 在前端中的实践
  • create-react-app做的留言板
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • es6
  • gcc介绍及安装
  • IndexedDB
  • iOS | NSProxy
  • Javascript编码规范
  • java取消线程实例
  • linux安装openssl、swoole等扩展的具体步骤
  • markdown编辑器简评
  • NSTimer学习笔记
  • Python语法速览与机器学习开发环境搭建
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spring Boot MyBatis配置多种数据库
  • vue 个人积累(使用工具,组件)
  • Vue.js源码(2):初探List Rendering
  • Vue全家桶实现一个Web App
  • XForms - 更强大的Form
  • 阿里云购买磁盘后挂载
  • 给Prometheus造假数据的方法
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 精彩代码 vue.js
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何实现 font-size 的响应式
  • 微信小程序填坑清单
  • 我有几个粽子,和一个故事
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 小而合理的前端理论:rscss和rsjs
  • Android开发者必备:推荐一款助力开发的开源APP
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Java数据结构)ArrayList
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (SERIES12)DM性能优化
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)换源+apt-get基础配置+搜狗拼音
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)