随着Ajax的出现, 有了前后端分离的开发模式。
后端只提供API来返回数据, 前端通过Ajax获取数据, 并且可以通过JavaScript将数据渲染到页面中,
这样做最大的优点就是前后端责任的清晰, 后端专注于数据上, 前端专注于交互和可视化上。
随后在后端路由的基础上诞生了前端路由。
有必要提前了解url的hash和html5的history
vue-router前端路由的一种,是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。其官方网站: https://router.vuejs.org/zh/
vue-router是基于路由和组件的
vue-router常见安装方式有cdn、npm、vue cli(优先学习npm方式 熟悉webpack)
例:npm install vue-router --save或者新版vue cli中vue ui可视化插件方式安装
安装完成会在配置文件依赖描述中出现
(填写依赖再npm也可行)
在模块化工程中运用 项目结构:
导入路由对象 并且调用Vue.use(Vue-router)
创建路由实例 并且传入路由映射配置
在vue示例中挂载创建的路由实例
//router/index.js
import Vue from 'vue'
//配置路由相关的信息
import VueRouter from 'vue-router'
//通过Vue.use(插件),安装插件
Vue.use(VueRouter)
//配置映射关系
const routes = []
//创建VueRouter对象
const router = new VueRouter({
//es6增强写法
routes
})
//导出后在main.js导入并挂载
export default router
//main.js
//导入router 自动搜寻/index.js
import router from './router'
new Vue({
router, //挂载添加路由
render: h => h(App)
}).$mount('#app')
和
//router/index.js
//配置映射关系
const routes = [
//例:
{
path: '/test',
name: 'test',
component: testView
},
]
//components/test.vue
//组件内容
我是test组件
//app.vue 组件内容挂上
启动服务后可以使用路由访问:
如何可以让路径默认跳到到首页, 并且
渲染首页组件呢?
只需要配置多配置一个映射就可以了 如下图:
//index.js
//配置映射关系
const routes = [
{
path:'/',
redirect:'/default'
//如果默认路径是/则重定向到/default
},
]
示例:
//views/default.vue
default默认首页面是我
//router/index.js
import Vue from 'vue'
//配置路由相关的信息
import VueRouter from 'vue-router'
import testView from '../views/testView.vue'
import defaultView from '../views/default.vue'
//通过Vue.use(插件),安装插件
Vue.use(VueRouter)
//配置映射关系
const routes = [
{
path:'/',
redirect:'/default'
//如果默认路径是/则重定向到/default
},
{
path:'/test',
name:'test',
component:testView
},
{
path:'/default',
name:'default',
component:defaultView
}
]
//创建VueRouter对象
const router = new VueRouter({
//es6增强写法
routes
})
//导出后在main.js导入并挂载
export default router
//App.vue
testView
default默认首页
效果图:
改变路径的方式有两种:
URL的hash
HTML5的history
默认情况下, 路径的改变使用的URL的hash.
使用HTML5的history模式, 非常简单, 进行如下配置即可:
const router = new VueRouter({
//es6增强写法
routes,
mode:'history'
})
示例效果图:
可见hash的#已经不见了
之后渲染成什么组件, 比如上面的代码会被渲染成一个
元素, 而不是
对应的路由匹配成功时, 会自动给当前元素设置一个router-link-active的class, 设置active-class可以修改默认的名称.示例:
testView
default默认首页
testView222
效果图:
效果也同样可以显示出来
有时候, 页面的跳转可能需要执行对应的JavaScript代码, 这个时候, 就可以使用第二种跳转方式了
比如, 我们将代码修改如下:
效果图:
在某些情况下,一个页面的path路径可能是不确定的,比如我们进入用户界面时,希望是如下的路径:
效果图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZGTaTRG-1622731235653)(https://gitee.com/wx_7585a01835/web_markdowm_img/raw/master/img/士大夫地方 (1)].gif)
方式一: 结合Vue的异步组件和Webpack的代码分析.
const Home = resolve => { require.ensure(['../components/Home.vue'], () => { resolve(require('../components/Home.vue')) })};
方式二: AMD写法
const About = resolve => require(['../components/About.vue'], resolve);
方式三(重点): 在ES6中, 我们可以有更加简单的写法来组织Vue异步组件和Webpack的代码分割.
const Home = () => import('../components/Home.vue')
嵌套路由是一个很常见的功能
实现嵌套路由有两个步骤:
效果图:
准备工作:
为了演示传递参数, 我们这里再创建一个组件, 并且将其配置好
传递参数主要有两种类型: params和query
//porfile.vue
profile页面是我
userId:{{ $route.params.userId }}
age:{{ $route.query.age }}
size:{{ $route.query.size }}
//router/index.js添加
const profile = () => import('../views/profile.vue')
{
path:'/profile/:userId',
component:profile
}
//App.vue
default
Home
profile(params)
porfile(query)
效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h0s2XWeB-1622731235662)(https://gitee.com/wx_7585a01835/web_markdowm_img/raw/master/img/路由参数传递 (1)].gif)
//App.vue
获取参数通过$route对象获取的.
在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route ,并且当路由切换时,路由对象会被更新。
导航守卫主要用来通过跳转或取消的方式守卫导航。
有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。
(记住参数或查询的改变并不会触发进入/离开的导航守卫。你可以通过观察$route对象来应对这些变化,或使用beforeRouteUpdate的组件内守卫)
beforeEach
和afterEach
的钩子函数, 它们会在路由即将改变前和改变后触发.beforeEach函数:
示例:
前置守卫(guard)beforeEach
为例来完成标题的修改(后置钩子(hook)afterEach
暂时了解)
to
: 即将要进入的目标的路由对象.from
: 当前导航即将要离开的路由对象.next
: 调用该方法后, 才能进入下一个钩子.//router/index.js
{
path:'/default',
name:'default',
component:defaultView,
meta:{
title:'default'
}
}, {
path:'/profile/:userId',
component:profile,
meta:{
title:'profile'
}
}
router.beforeEach((to,from,next) => {
//从from跳转到to
document.title = to.matched[0].meta.title
console.log(to);
next()
} )
效果图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8wicIu3k-1622731235665)(https://gitee.com/wx_7585a01835/web_markdowm_img/raw/master/img/导航守卫 (1)].gif)
附加问题:
beforeEach中变量from定义了未引用 ealint代码校验报错解决:
// package.json
rules: {
"no-unused-vars":"off"
}
补充:
具体参考Vue Router官网更新数据
//App.vue