路由钩子函数分为三种类型如下:
主要包括beforeEach(全局前置守卫)和aftrEach(全局后置守卫)
beforeEach的钩子函数,它是一个全局的before 钩子函数,意思是在 每次每一个路由改变的时候都得执行一遍。
它的三个参数:
to: (Route路由对象) 即将要进入的目标 路由对象 to对象下面的属性: path params query hash fullPath matched name meta(在matched下,但是本例可以直接用)
from: (Route路由对象) 当前导航正要离开的路由
next: (Function函数) 一定要调用该方法来 resolve 这个钩子。 调用方法:next(参数或者空) ***必须调用
next(无参数的时候): 进行管道中的下一个钩子,如果走到最后一个钩子函数,那么 导航的状态就是 confirmed (确认的)
next(’/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。
应用场景:可进行一些页面跳转前处理,例如判断需要登录的页面进行拦截,做登录跳转!!
afterEach函数不用传next()函数
router.beforeEach 是页面加载之前,相反router.afterEach是页面加载之后
举例: 通过跳转后改变document.title
router.afterEach((to, from) => {
if( to.meta.title ){
window.document.title = to.meta.title //每个路由下title
}else{
window.document.title = ‘默认的title’
}
})
主要用于写某个指定路由跳转时需要执行的逻辑
{
path: '/dashboard',
component: resolve => require(['../components/page/Dashboard.vue'], resolve),
meta: { title: '系统首页' },
beforeEnter: (to, from, next) => {
},
beforeLeave: (to, from, next) => {
}
},
主要包括 beforeRouteEnter和beforeRouteUpdate ,beforeRouteLeave,这几个钩子都是写在组件里面也可以传三个参数(to,from,next),作用与前面类似.
beforeRouteEnter(to, from, next) {
next(vm => {
if (
vm.$route.meta.hasOwnProperty('auth_key') &&
vm.$route.meta.auth_key != ''
) {
if (!vm.hasPermission(vm.$route.meta.auth_key)) {
vm.$router.replace('/admin/noPermission')
}
}
})
},
因为v-for 具有比 v-if 更高的优先级,这意味着 v-if 将分别重复运行于每个 v-for 循环中,如果每一次都需要遍历整个数组,将会影响速度,尤其是当之需要渲染很小一部分的时候
使用推荐方式:
v-show 只是简单的控制元素的 display 属性,而 v-if 才是条件渲染(条件为真,元素将会被渲染,条件为假,元素会被销毁)
v-if的原理是根据判断条件来动态的进行增删DOM元素,v-show是根据判断条件来动态的进行显示和隐藏元素,频繁的进行增删DOM操作会影响页面加载速度和性能,由此我们可以得出结论:
当您的项目程序不是很大的时候,v-if和v-show都可以用来进行判断展示和隐藏(这种场景使用v-if只是影响不大,并不是没有影响);当您的项目程序比较大的时候,不推荐使用v-if来进行判断展示和隐藏,推荐使用v-show
共同点:v-if 和 v-show 都能实现元素的显示隐藏
foreach适用于只是进行集合或数组遍历,for则在较复杂的循环中效率更高。
foreach不能对数组或集合进行修改(添加删除操作),如果想要修改就要用for循环
for循环可以使用break跳出循环,但forEach不能。
for循环可以控制循环起点(i初始化的数字决定循环的起点),forEach只能默认从索引0开始。
for循环过程中支持修改索引(修改 i),但forEach做不到(底层控制index自增,我们无法左右它)。
补充两个知识点
1.break
用break语句可以使流bai程跳出switch语句体,也可以用break语句在循环结构终止本次循环体,从而提前结束本层循环。
2.continue
对于浅拷贝的定义可以理解为:
对于深拷贝的定义可以理解为:
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
var a = [1, 2, 3, 4, 5];
var b = a;
a[0] = 2
console.log(a);
console.log(b);
可以点击看看