1,认识路由
改变路径的方式有两种: URL的hash 和 HTML5的history
URL的hash
URL的hash也就是锚点(#), 本质上是改变window.location的href属性.
我们可以通过直接赋值location.hash来改变href, 但是页面不发生刷新
HTML5的history模式:五种模式改变URL而不刷新页面:
history.pushState()
history.replaceState()
history.go()
history.back() 等价于 history.go(-1)
history.forward() 等价于 history.go(1)
这三个接口等同于浏览器界面的前进后退。
2,vue-router基本使用
vue-router是基于路由和组件的
路由用于设定访问路径, 将路径和组件映射起来.
在vue-router的单页面应用中, 页面的路径的改变就是组件的切换
-
步骤一: 安装vue-router: npm install vue-router --save
-
步骤二: 在模块化工程中使用它(因为是一个插件, 所以可以通过Vue.use()来安装路由功能)
- 1:导入路由对象,并且调用 Vue.use(VueRouter)
- 2:创建路由实例,并且传入路由映射配置
- 3:在Vue实例中挂载创建的路由实例
-
使用vue-router的步骤:
- 1 : 创建路由组件
- 2 : 配置路由映射: 组件和路径映射关系
- 3 : 使用路由: 通过和
-
: 该标签是一个vue-router中已经内置的组件, 它会被渲染成一个标签.
-
: 该标签会根据当前的路径, 动态渲染出不同的组件.
- 网页的其他内容, 比如顶部的标题/导航, 或者底部的一些版权信息等会和处于同一个等级.
- 在路由切换时, 切换的是挂载的组件, 其他内容不会发生改变.
3,vue-router 补充
路由的默认路径: 让路径默认跳到到首页, 并且渲染首页组件
配置解析: 在routes中又配置了一个映射.
path配置的是根路径: /
redirect是重定向, 也就是我们将根路径重定向到/home的路径下, 这样就可以得到我们想要的结果了.
const routes = [
{ path: '/', redirect : '/Home'},
... ]
默认情况下, 路径的改变使用的URL的hash.
使用HTML5的history模式: mode : ‘history’,
router-link补充
1,tag: tag可以指定之后渲染成什么组件,
比如上面的代码会被渲染成一个<li>元素, 而不是<a><router-link to='/home' tag='li'>
2,replace: replace不会留下history记录, 所以指定replace的情况下, 后退键返回不能返回到上一个页面中,
3,active-class: 当对应的路由匹配成功时, 会自动给当前元素设置一个router-link-active的class, 设置active-class可以修改默认的名称.
const router =new VueRouter({
routes,
mode : 'history',
linkActiveClass : 'active'
}) ;
动态路由: path和Component的匹配关系
希望路径是:/user/aaaa或/user/bbbb
路由脚本:
{
path: '/User/:use_id',
component : User,
// meta:{ title: "用户" }
},
主页使用:
<router-link to="/user/cookie" replace tag="button" >主页新闻</router-link>
User 组件使用:
<p>{{$route.params.use_id}}</p>
4,路由的懒加载 , vue-router嵌套路由
路由懒加载做了什么?
路由懒加载的主要作用就是将路由对应的组件打包成一个个的js代码块.
只有在这个路由被访问到的时候, 才加载对应的组件
懒加载的方式: const Home = () => import('../components/Home.vue')
嵌套路由: 比如在home页面中, 通过/home/news和/home/message访问一些内容.
一个路径映射一个组件, 访问这两个路径也会分别渲染两个组件.
实现嵌套路由有3个步骤:
创建对应的子组件,
在路由映射中配置对应的子路由.
在组件内部使用标签.
5,vue-router参数传递
传递参数主要有两种类型: params和query
params的类型:
配置路由格式: /router/:id
传递的方式: 在path后面跟上对应的值
传递后形成的路径: /router/123, /router/abc
query的类型:
配置路由格式: /router, 也就是普通配置
传递的方式: 对象中使用query的key作为传递方式
传递后形成的路径: /router?id=123, /router?id=abc
传递参数方式一:
<router-link
:to="{ path: '/Profile/' + Profile_id,
query : {age: 24, hobby:'炒股'} }"
tag="button" >档案</router-link>
传递参数方式二: JavaScript代码
<button @click="ToProfile">档案</button>
export default {
name: "APP",
data (){ return { Profile_id: 'cookie_profile', } },
methods: {
ToProfile(){
this.$router.push(
{ path: '/Profile/' + this.Profile_id, // path: '/Profile' + cookie_profile,
query : {age: 24, hobby:'炒股'}
})
}
}
}
获取参数: 通过$route对象获取的.
在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route ,并且当路由切换时,路由对象会被更新。
profile 组件中模板获取参数:
<p>params: {{$route.params.profile_id}}</p>
<p>query: {{$route.query}}</p>
r o u t e 和 route和 route和router是有区别的
r o u t e r 为 V u e R o u t e r 实 例 , 想 要 导 航 到 不 同 U R L , 则 使 用 router为VueRouter实例,想要导航到不同URL,则使用 router为VueRouter实例,想要导航到不同URL,则使用router.push方法
$route为当前router跳转对象里面可以获取name、path、query、params等
6,vue-router导航守卫
导航守卫?
vue-router提供的导航守卫主要用来监听监听路由的进入和离开的.
vue-router提供了beforeEach和afterEach的钩子函数, 它们会在路由即将改变前和改变后触发
- 例子
网页标题是通过<title>来显示的, 但是SPA只有一个固定的HTML, 切换不同的页面时, 标题并不会改变.
但是我们可以通过JavaScript来修改<title>的内容.window.document.title = ‘新的标题’.
利用beforeEach来完成标题的修改.
首先, 我们可以在钩子当中定义一些标题, 可以利用meta来定义
其次, 利用导航守卫,修改我们的标题
router.beforeEach((to, from, next) => {
window.document.title = to.matched[0].meta.title;
next()
});
导航钩子的三个参数解析:
to: 即将要进入的目标的路由对象.
from: 当前导航即将要离开的路由对象.
next: 调用该方法后, 才能进入下一个钩子
7,keep-alive
keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
- keep-alive 两个属性:
- include - 字符串或正则表达,只有匹配的组件会被缓存
- exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存
router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存:
// <!--使被包含的组件保留状态,或避免重新渲染 ,使用正则,逗号后面不能有空格 -->
<keep-alive exclude="Profile,User">
<router-view> </router-view>
</keep-alive>
设置404页面
从我的云笔记中截个图…
vue-router实例
实现效果