感悟:最近呢参加了一些面试,感觉自己基础还是不够好 总结一下
vue-router 篇:
跳转路由的几种方式:
1、声明式: 1) 根据路由路径(/home/sort/detail)跳转 <router-link :to="{path: '/home/sort/detail', query:{id: 'abc'}}">点击查看子页面</router-link>
2) 根据路由名称(detail)跳转 <router-link :to="{name: 'detail', params:{id: 'abc'}}">点击查看子页面</router-link>
:to="" 可以实现绑定动态的 路由 和 参数
2、编程式: 1) this.$router.push({path: '/home/sort/detail',query:{id: 'abc'}})
2) this.$router.push({name: 'detail',params:{id: 'abc'}})
备注: params 和 query 传参的区别:
1、params传参时 参数不会出现在url的路径上面, 但是刷新页面时param里面的数据会消失
2、query传参时 参数出现在url的路径上面, 刷新页面时query里面的数据不变
参数接收:
this.$route.query this.$route.params
// 注意:name 必须和 params path 必须和 query 传参时注意
路由监听:
watch:{
$route(to, from){
console.log(to, from)
}
}
// 或:
watch: {
$route: {
handler: function(val, oldVal){
console.log(val);
},
// 深度观察监听
deep: true
}
},
//或:
watch: {
'$route':'getPath'
},
methods: {
getPath(){
console.log(this.$route.path);
}
}
// 注意:组件销毁将无法监听 所以说组件在不销毁的前提下只能监听自身
导航守卫
1.全局前置守卫
router.beforeEach((to, from, next) => {
console.log(to, from, next);
return next(false);
})
// 这里需要注意的是 next 一定要被调用 否则路由不会执行
// next取直: 参数为空时继续走下一步, 参数可以是false 当为false时 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
// next还可以传入新的路由地址 如:任何用在 router-link 的 to prop 或 router.push 中的选项。 {name: '', params:{}}
2.全局解析守卫
说明:你可以用 router.beforeResolve 注册一个全局守卫。这和 router.beforeEach类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用
。
3.全局后置钩子
router.afterEach((to, from) =>{
console.log(to, from)
})
说明:这些钩子不会接受 next 函数也不会改变导航本身
4.路由独享守卫
{
path: '/',
component: () => import('../components/index'),
beforeEnter: (to, from, next) => {
console.log(to,from);
next();
}
},
说明:这些守卫与全局前置守卫的方法参数是一样的。
5.组件内的守卫
export default {
name: 'home',
data() {
return{}
},
beforeRouteEnter (to, from, next) {
// 在渲染该组件的对应路由被 confirm 前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
},
beforeRouteUpdate (to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
},
beforeRouteLeave (to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
},
methods:{
toBack() {
this.$router.push({path:'/', query: {name: 'Marry'}});
}
},
mounted(){
console.log('this is home')
console.log(this.$route.params);
}
}
完整的导航解析流程:
导航被触发。
在失活的组件里调用离开守卫。
调用全局的 beforeEach 守卫。
在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
在路由配置里调用 beforeEnter。
解析异步路由组件。
在被激活的组件里调用 beforeRouteEnter。
调用全局的 beforeResolve 守卫 (2.5+)。
导航被确认。
调用全局的 afterEach 钩子。
触发 DOM 更新。
用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。
路由元信息
path: '/home',
name: 'home',
component: () => import('../components/home'),
props: true,
meta:{ // 路由元信息
authId:0
}
// 访问可以通过 $route.matched 通过它我们可以做一些权限的判断 基础信息获取
滚动行为:
使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。
注意: 这个功能只在支持 history.pushState 的浏览器中可用。
当创建一个 Router 实例,你可以提供一个 scrollBehavior 方法:
const router = new VueRouter({
routes: [...],
scrollBehavior (to, from, savedPosition) {
// return 期望滚动到哪个的位置
}
})
详细的滚动行为请移步:https://router.vuejs.org/zh/guide/advanced/scroll-behavior.html
路由懒加载
const Foo = () => Promise.resolve({ /* 组件定义对象 */ })
或
import('./Foo.vue') // 返回 Promise
注意:
如果您使用的是 Babel,你将需要添加 syntax-dynamic-import 插件,才能使 Babel 可以正确地解析语法。
更多详细说明请移步:https://router.vuejs.org/zh/guide/advanced/lazy-loading.html#%E6%8A%8A%E7%BB%84%E4%BB%B6%E6%8C%89%E7%BB%84%E5%88%86%E5%9D%97