VUE NOTE————路由
一、
后端渲染: 服务器从数据库获取数据后,后端填充数据,将数据加载进来生成HTML,然后传到浏览器中解析成页面。
前端渲染: 后端不提供完整的HTML页面,而是提供一些API,使前端可以获取到JSON数据,前端拿到JSON数据后HTML页面,然后展示在浏览器上。
区别在于: 数据填充。
即由谁来完成HTML文件的完整拼接,如果是在后端完成的,直接填充到HTML后传给前端,然后返回给客户端,就是后端渲染;
若是前端完成了HTML的拼接,通过ajax从后台拿数据进行操作,就是前端渲染
后端路由: 由服务器来处理Url和页面之间的映射关系
前端路由: URL 变化引起 UI 更新,页面无刷新,由前端来维护路由规则
SPA是只有一张Web页面的应用,加载单个HTML页面,并在用户交互时动态更新。
二、
history.pushState({},'','home') // 通过压栈 修改urlhistory.back() // 通过出栈修改urlhistory.replaceState({},'','home')
以下方法相当于浏览器界面的前进、后退history.go(-1) // 相当于 history.back()history.go(1) // 相当于 history.forward()history.go(2) // 压入2个
三、
1.安装vue-router
npm i vue-router –save
2.在模块化工程中使用
第一步:导入路由对象,import Vue from 'vue';import VueRouter from 'vue-router';
并调用 Vue.use(VueRouter)
tip: 插件需要通过Vue.use()去安装
第二步:创建路由实例,并传入路由的映射配置
映射关系:
1 | const routes = [ |
创建路由实例
1 | const router = new VueRouter({ |
导出: export default router
第三步:在Vue实例中挂载创建的路由实例
挂载:
1 | new Vue({ |
使用:
1 | <router-link to="/home"></router-link> |
tip:
router-link最终会被渲染成<a/>
router-view 相当于占位,根据当前url渲染不同组件
3.
路由的默认路径:
1 | { |
4.
router-link的补充
- to属性
- tag属性 tag: 渲染成其他标签 eg: button
1
2
3<router-link to="/home" tag="button" replace active-class="active">
首页
<router-link/>
replace: 浏览器上的前进后退按钮disable
5.路由的代码跳转<button @click="homeClick">首页
1 | methods: { |
6.动态路由
在路由映射中:
1 |
|
- 动态绑定用户ID
<router-link :to="'/user/'+userId"></router-link>
1 | data() { |
- 在子组件中获取路由参数
user组件中:<h2>{{userId}}</h2>
computed:{
userId() {
// $route表示获取当前处于活跃状态的路由
// abc 为配置映射表时定义的path
return this.$route.params.abc;
}
}
7.路由的懒加载
npm run build
默认将js打包为三个文件:
- app 自己写的业务代码
- manifest 做底层支撑
- vendor 第三方提供商
打包构建应用时,js包可能会非常大,影响页面加载
更加高效的做法是: 把不同路由对应的组件分割成不同的代码块,当路由被访问时才加载相应组件
懒加载的方式
{
path:'/home',
component:() => import('../components/Home')
}
或者
const Home = () => import('../components/Home')
{
path: '/home',
component: Home
}
通过路由懒加载,打包完的js会根据不同组件,进行分包。
8.嵌套路由
实现路由嵌套:
- 创建子组件,在路由映射中配置对应的子路由
- 在组件内部使用<router-view>
eg.
在home.vue中
<router-link to="/home/news">新闻</router-link>
<router-link to="/home/msg">信息</router-link>
<router-view></router-view>
在配置路由映射中
const routes = [
{
path:'/home',
component: Home,
children: [
{
// 嵌套路由的默认路径
path:'',
redirect:'news'
}
{
path:'news',
component:HomeNews
},
{
path:'msg',
component:HomeMsg
}
]
}
]
9.路由之间的参数传递
a.传递参数的方式: params和query
- params
配置路由格式: /user/:id
传递方式: 在path后面跟上对应值
传参后形成的路径: /user/1 - query
配置路由格式: /user
传递方式: 使用query的key
传参后形成的路径: /user?id=1
query eg.
localhost:8080/profile?name=apple&price=10
在profile组件中:
<h1>{{$route.query.name}}</h1>
<h1>{{$route.query.price}}</h1>
在app.vue中:
<router-link :to="{path:'/profile', query:{name: 'apple', price:10}}">
</router-link>
<router-view></router-view>
b.通过代码跳转并传参
<button @click="clickProfile()"></button>
methods: {
clickProfile() {
this.$router.push({
path:'/profile',
query: {
name: apple,
price: 10
}
});
}
}
10.$route和$router的区别
$route是当前处于活跃状态的路由。每个对象都是局部的,可以获取当前路由的 path, name, params, query等属性。
$router是全局的 router 实例。在vue根实例中注入 router 实例,再注入到每个子组件,任何页面都可调用 pushSate(), replace(), go() 等方法。
11.导航守卫
全局导航守卫: 监听路由跳转
例如根据路由改变网页标题
在配置路由映射中:
{
path:'/home',
component:Home,
meta: {
title:'首页'
},
children:[
]
}
在index.js中
router.beforeEach((to, from, next) => {
document.title = to.meta.title;
next();
})
beforeEach()又称前置守卫,next()必须调用
next({path: ‘/login’})
next(false) 中断当前导航
导航守卫补充
后置钩子afterEach() 不需要调用next()
router.afterEach((to,from) => {
})
beforeEach() 和 afterEach()是全局守卫
12.路由独享的守卫
routes: [
{
path:'/home',
component: Home,
beforeEnter:(to, from, next)=> {
}
}
]
13.组件内守卫
const cpn = {
template:...,
beforeRouteEnter(to,from,next) => {},
beforeRouteUpdate(to,from,next) => {},
beforeRouteLeave(to,from,next) => {}
}
14.keep-alive
a.
keep-alive是Vue内置的组件
lifecycle:created(){}destroyed(){}
以下两个函数只有使用了keep-alive包裹起来时才有效
keep-alive作用: 该组件保持状态,不要销毁,避免重新渲染activated(){}deactivated(){}
<keep-alive><router-view/></keep-alive>
b.keep-alive 的属性
- include
字符串或正则表达式,只有匹配的组件才会被缓存
eg.<keep-alive include="User"><router-view/></keep-alive> - exclude
字符串或正则表达式,只有不匹配的组件才会被缓存
tip:两个组件之间逗号连接 ,不要加空格<keep-alive exclude="User,About"><router-view/></keep-alive>
- 本文作者:JSZ
- 本文链接:blog.vampuck.com/2020/12/16/vue_note_router/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!