递归函数
- 递归函数需要同时满足以下两个条件
- 自己调用自己
- 一定要有结束条件(否则就会出现死循环)
let i = 1;
function name() {
i++;
console.log(`${i}次`);
if (i <= 5) {
name();
}
}
name(); // 输出2-6次
递归组件
- 在本组件内调用本组件(自己调用自己,作用于嵌套),满足条件如上面的递归函数
- 相当于注册了一个局部组件,并且只能在自己当前组件使用
<template>
// 使用
<注册的组件名/>
</template>
<script>
export default {
// 相当于在本组件内注册了该组件,name的值就是注册的组件名
name: "自定义组件名", // 等同于 父组件 注册 子组件 ===> components: {newItem}
};
</script>
video标签属性
- controls: 控制器
- poster: 设置视频封面图片
<video :poster="图片路径" controls :src="视频路径"></video>
&&(与) 与|| (或)的执行条件
-
&&(与):两个条件同时满足才执行
-
|| (或):一个条件满足就执行
数组方法
- 数组删除
arr.splice(下标值,删除的个数)
- 数组去重
let arr = [...new Set(去重对象)]
- 找到对应的下标值
arr.findIndex((item) => {
// item就是数组arr中的元素
// 这个函数需要返回一个条件判断(布尔值),当条件成立,会立即返回当前的item
})
ref和refs的使用
-
作用一
- ref和refs的使用,等同于原生JS获取标签的方法:document.querySelector('类名'
- ref:在标签上添加ref="自定义命名"
- refs:结合this.$refs.自定义命名,来获取标签
-
作用二
- 可以获取到组件对象
<van-nav-bar ref='nav'" />
// 获取从框架中复制过来的组件
this.$refs.nav
导航/路由守卫
-
本质上是一个函数,就是触发的时机比较特殊,会在路由跳转之前触发的一个叫beforeEach的函数
-
语法:
router.beforeEach((to, from, next) => {
// to:指的是跳转的目标由对象,里面有一个属性 to.path 就是我们的跳转的路径
// from:指当前的路由对象,里面有一个属性,from.path 就是当前的路由路径
// next:表示是否放行的函数
// next() 表示放行
// next(false) 表示不放行
// next(路由路径) 表示跳转指定路径(当条件不满足时)
// 使用场景:可以做页面(路由)权限
// 黑马头条项目中:个人中心必须要登录后才能访问,就是可以使用到导航守卫来实现此功能
});
/deep/ 样式穿透
-
组件库的组件名即为当前组件的类名,使用了样式穿透,我们就可以直接设置组件内部的标签样式
-
/deep/ 样式穿透是less预处理器提供的语法 ,并且要加上 scoped 属性,主要针对局部样式
<style lang="less" scoped>
/deep/.类名 {}
</style>
click修饰符-native
- 自定义组件上不能直接绑定原生事件,需要借助.native才能绑定成功
meta-路由元信息
- 可以用来保存数据,且路由跳转的时候这里的数据不会被重置
闭包
-
在我们封装一些函数的时候,会发现有些变量不适合声明在函数里面,而闭包的存在就是为了让我们在使用的时候更加合理
-
闭包:当两个函数嵌套在一起时,可以使一个函数访问另一个函数的变量
-
应用场景:使得我们封装的函数更加的完善
var a = 123 // 全局变量
function test(){
console.log(a); // 可以访问到
var b = 456 // 局部变量
}
test()
// console.log(b); // 报错 b is not defined
// 封装的函数实现了,可以连续打印5次字符串123出来
function test(){
let i = 1;
return function a(){
i++;
console.log("123");
if(i<=5){
a()
}
}
}
let aa = test()
aa()