Vue知识点整理
文章目录
-
一、初识Vue
-
-
-
- 1.1.Vue 是一个用于前端开发的技术。
-
-
-
1.2.Vue 的两大核心功能是组件实例和数据绑定。
-
学习Vue的基础语法时会涉及创建组件和定义属性。
-
在Vue中使用vm实例时需注意其与组件实例的关系。
-
实现事件监听机制通常会结合watch指令。
-
使用v-bind指令实现属性绑定时会生成计算属性。
-
computed属性通常用于存储基于父元素状态的变化结果。
-
watch指令用于监控元素的状态变化并触发相应事件。
-
在表单元素之间实现双向绑定有助于提高数据同步效率。
-
2.1.filter方法用于创建过滤器对象来筛选特定的数据项。
-
2.2.updateArr方法负责检测数据变化并通知相关组件更新状态。
-
注册组件时需确保其引用正确以避免引用错误。
-
2.Vue组件
-
-
- 1.1组件间通信:
-
-
1.2.Vue2.6版本新增v-slot指令
-
总结
-
一、初识Vue
1.1.Vue 是什么:
Vue 是一套用于构建用户界面的渐进式框架
1.2.Vue 的两大核心:
- 基于动态反馈机制的数据绑定:在数据发生变化时, 视图会实时更新, 并且可以在不影响业务逻辑的前提下专注于数据处理
- 灵活配置的视图组件能够将功能划分为模块化的基本单元, 并通过层次化的组合方式构建复杂的系统架构, 在设计上支持倒置组件树结构, 并具备良好的维护性和重用性特征
1.3.Vue 基础语法:
文本插值: {{}} : 花括号中是js表达式;
命令: directive; 在Vue中新增的一些属性也被称作command, 每个command都有其独特的功能。
条件渲染中,v-if 的值由一个表达式决定,在该表达式结果为 true 时会创建并附加 DOM 标签,在结果为 false 时则移除该标签。在遇到特定需求时(如无需因嵌套标签而修改 HTML 结构),可以通过 template 标签实现对单个元素的展示。
template: 模板;这是 Vue 提供的一个虚标签,在 HTML 中不会显示自身。
v-show:该字段是一个JavaScript表达式,在其值为true时会显示内容;而当该表达式的值为false时,则使其不可见。
如何选择使用v-if\v-show?? 两者区别?
v-if的显隐是通过标签的创建删除实现,v-show是通过css显隐实现.
由此可知,v-if相较于其他组件而言具有较低的初始渲染消耗,而对比之下,v-show则具有较高的初始渲染消耗.不过需要注意的是,v-if在切换时所消耗的能量也相对较低,相比之下,v-show在切换过程中所消耗的能量则更为显著.综合来看,在频繁切换的情况下,建议优先选择v-show组件,而相对较少的情况下,可以选择使用v-if组件.
v-html:展示html;
指定绑定方式;该指令包含参数。指定一个名为'js表达式值'的参数。其中参数名即为属性名称。允许简化为仅指定数值。
v-once:一次性绑定: 该指令所在标签, 数据变化,页面不会随之变化.
列表渲染:
v-for="(元素,索引) in 数组" : 不需要索引时,可以缺省()和索引;
v-for="(属性值,属性名) in 对象" ; 遍历对象;
使用v-for语句 (元素, 索引) 在 整數 中进行遍历;其实在此处会遍历一个数值集合;其中该整数值代表了该集合的数量。
1.4.Vue的vm实例:
vm$el 属性, 取值是一个DOM元素,vue实例初始化时会根据构造函数传入option对象中的el字段,查找对应的DOM标签,赋值给$el.
vm._data属性,取值是一个对象, 对象的属性与option对象中的data字段下属性保持一致:
这些数据属性会通过object.defineProperty方法以存取描述符 (set\get) 的方式添加到_data中.
也就意味着,赋值会调用set方法,取值的时候会调用get方法.
可以通过vm._data.属性名称的方式访问这些属性:
也可以直接通过vm.属性名称的方式访问这些属性,与vm._data.属性名称等价.
vue的数据更新是响应式的(reactive);
响应式: 数据变化了,页面会自动更新. 依赖于数据是通过object.defineProperty方法以存取描述符 (set\get) 的方式添加的
AI写代码
1.3.Vue的事件监听:
v event 监听用于触发特定条件的变化;其简写形式为 @ 事件名称 = " 表达式 || 少量代码 ";
通常情况下,默认会接收 event 参数;此外还可以手动传递其他所需数据;
当 @ 事件名称绑定为 " 函数名 ( a, b... ) " 时...
此时 a, b... 是由用户自主传递的参数;
如果将绑定形式设置为 " 函数名 ( event, a, b... ) " ...则 event 表示当前事件对象;a、b... 则是其他所需的附加数据;
在回调函数中,this变量代表当前的Vue实例,在Vue组件生命周期管理中,this始终指向当前正在运行的组件实例对象(DOM树根节点)。 采用this机制可以实现灵活且高效的依赖注入功能; 通过this引用可以方便地访问组件的状态信息以及相关的数据资源; 此外,this也是传递数据和状态的重要桥梁,在组件生命周期管理中有不可替代的作用
这些特殊的符号和关键词称为事件修饰符,在Vue的核心逻辑中扮演着至关重要的角色
1.5.Vue的双向绑定:
原理:
视图 ← 数据: 当数据发生变化时, 视图会随之更新; 这种关系通过v-bind:value属性实现;
绑定实现:
数据 ↔ 视图: 当视图发生变更时, 数据也会相应更新; 该过程通过v-on:input事件监听来完成
简化表示方法可写作:v-model
1.6.Vue的属性绑定 v-bind:
属性绑定 v-bind : html中默认属性的取值都是string
vue中对常用的属性, class\style的绑定做了扩展
class:
字符串;例如 "red big"
数组: 例如 ["red", "big"]
对象: 例如 {red:true,big:false} 取值true,说明有这个class,反之false
style:
字符串: 例如 "width:100px;height:100px;background-color:red;"
对象: 例如 {width:100px,height:100px,backgroundColor:red}
数组: 例如 [
{
width:100px,height:100px,
},
{
backgroundColor:red
}
]
AI写代码
1.7.Vue的计算属性computed:
计算属性:会存储计算结果:重复调用get方法只会返回结果一次;仅当依赖的数据发生变化时才会触发重新计算。
取值操作通常采用get方法;赋值操作则多采用set方法。其中set操作较少应用,在大多数场景下仍以get操作为主,并可结合简写方式高效实现。
1.8.Vue的监视属性watch:
该方法名称为需要监视的数据名称,在数据发生变更时会触发该函数。
para1:新版本,最新数值
para2:现有版本,旧数值
1.9.表单元素的双向绑定:
双向绑定:
数据->视图: 数据变化,视图更新;
视图->数据: 试图变化, 数据更新;
双向绑定简写为v-model;v-model是双向绑定的语法糖;
input\textarea
v-bind:value 属性绑定 实现数据变化,视图更新;
v-on input 事件监听, 实现试图变化,数据更新;
radio\checked
v-bind:checked
v-on:change
select-option
v-bind:selected
v-on :change
双向绑定的事件修饰符
number : 将输入内容转化为数字
trim : 裁剪;将输入开头结尾的空格删除
lazy : 懒 ; 将input事件监听换成change;
input:输入字符时触发;
change:输入变化并失去焦点时触发;
AI写代码
2.1.filter:过滤器:
filter:过滤器; 进行数据格式化;
filter实际就是函数;
可以在{{}} 以及 v-bind 中使用过滤器.例如{{oldValue | 过滤器名称}} , {{oldValue | 过滤器名称(第二个参数,第三个是参数....)}}
过滤器函数的参数:
para1:| 前面的变量;
过滤器支持串联; 例如{{oldValue | 过滤器1 | 过滤器2 | 过滤器3 ...}}
执行第一个过滤器,得到返回值,将返回值作为参数传入第二个过滤器
AI写代码
例:
filters:{
capitalize:function(value,count){
return value.toFixed(count)
},
dateFormate(time){
const times = new Date(time);
const year = times.getFullYear()
const mouth = times.getMonth()+1
const day = times.getDate()
const hour = times.getHours()
const minute = times.getMinutes()
const secound = times.getSeconds()
console.log(times);
return year +"-"+mouth+"-"+day+","+hour+":"+minute+":"+secound
},
Dada(value){
return value.toUpperCase();
},
rugao(value){
return value.split("").reverse().join("")
}
}
AI写代码
2.2数据变化检测updateArr:
能够检测到数组的变化,并相应地更新页面。
在数组末尾添加一个指定值的操作。
从数组末尾移除一个特定数值。
从数组头部删除一个指定位置的数值。
在头部插入新数值的方法。
通过spice方法执行可增删的操作。
对原始数据进行逆序排列的方式。
默认参数包括当前元素、其索引以及整个原数组本身。
要求回调函数必须返回布尔类型的数据;
true表示满足条件;
false则表示不满足条件。
基于索引修改数据的方法无法直接被检测到,
并且不会影响页面展示;
可以通过使用spice方法先删除原有数据,
然后再插入新的数据以达到目标效果。
2.3组件注册:
组件:component;将由HTML/CSS/JS实现特定功能并封装为一个component。
一个项目通常由多个component构成。
组件具有可重用性。
为了方便管理与维护,在注册时应为全局注册component。
para1的组件名称可采用短横杠连接或驼峰命名法。
para2定义了组件的配置对象;
template指定视图模板;每个template仅包含一个与label对应的元素。
data定义了组件所需的数据;该数据必须通过函数获取,并返回用于构建该component所需的数据对象。
为什么data必须是函数?
因此设计data为函数形式是为了确保在复用过程中能够保持数据独立性。当调用data函数时会获得独立的对象副本,在每次复用时不会与其他component共享同一份数据资源。
2.Vue组件
beforeCreate():创建前;这时,this_data为undefined,这个钩子在数据观测(dataobserver)和event/watcher 事件配置
之前被调用
created():实例已经创建完成之后被调用.这时,this._data有值,在这一步,实例已完成以下的配置;数据观测(data observer),
属性和方法的运算, watch/event 事件回调.然而,挂载阶段还没开始,$el 属性目前不可见
beforeMount():(载入前) 在挂载开始之前被调用,相关的render函数首次被调用.实例已完成以下配置:编译模板,把data里面的
数据和模板生成html 注意此时还没有挂载html页面上,this.$el为undefined.
mouthed():(载入后 )在el被创建的 vm.$el 替换,并挂载到实例上去之后调用,实例已完成以下的配置;用上面编译好的html内容替换
el属性指向的DOM对象,完成模板中的html渲染到html页面中,this.$el有值.
beforeUpdate()(更新前) 在数据更新之前调用,发生在虚拟dom重新渲染和打补丁之前.可以在该钩子中进一步更改状态,不会触发附加
的重渲染过程
updated():(更新后) 在由于数据更改导致的虚拟dom重新渲染,和打补丁之后调用,调用时,组件DOM已经更新,所以可以执行依赖于DOM的
操作.然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环.该钩子在服务器渲染期间不被调用.
beforeDestory():(销毁前) 在实例销毁之前调用.实例仍然完全可用.
destory():(销毁后) 在实例销毁之后调用.调用后,所有的事件监听器会被移除,所有的子实例也会被销毁.该钩子在服务器渲染期间不被调用.
activated():被激活,在keep-alive 组件激活时调用.服务器端渲染期间不调用该生命周期.组件包裹keep-alive进行重用时,create\mount只会
调用一次,之后每次出现会调用activated方法.
deactivated(): 在keep-alive 组件失活时调用.
errorCaptured():当捕获一个来自子孙组件的错误时被调用.此钩子会收到三个参数:错误对象,发生错误的组件实例以及一个包含错误来源信息的
字符串.此钩子可以返回 false 以阻止该错误继续向上传播.
常见操作:
created:发送请求,获取数据
mounted:操作DOM
destroyed:进行清空操作,例如销毁定时器
AI写代码
例:
beforeCreate(){
console.log("创建前");
console.log(this.$el);
console.log(this._data);
},
created(){
console.log("创建后");
console.log(this.$el);
console.log(this._data);
},
beforeMount(){
console.log("挂载前");
console.log(this.$el);
console.log(this._data);
},
mounted(){
console.log("挂载后");
console.log(this.$el);
console.log(this._data);
},
beforeUpdate(){
console.log("更新前");
console.log(this.$el);
console.log(this._data);
},
updated(){
console.log("更新后");
console.log(this.$el);
console.log(this._data);
},
beforeDestroy(){
console.log("销毁前");
console.log(this.$el);
console.log(this._data);
},
destroyed(){
console.log("销毁后");
console.log(this.$el);
console.log(this._data);
},
activated(){
console.log("活跃的");
},
deactivated(){
console.log("不活跃");
},
AI写代码
1.1组件间通信:
- 通过父组件向下发送数据
- 为子组件附加自定义属性
- 在子组件中新增props字段,并列举所有需要传递的属性名称
- 单向的数据流动特性表明:当父组件发生更改时
其影响会即时传播给相关联的所有子组件;然而并非所有情况都是可逆的
即当父端发生变化不会直接影响到同一个child端的变化
- 你可以通过以下方式限定信息传输范围:
- 类型标识(type)用于限定信息的基本类型
- 是否必要(required):指示是否必须包含该字段
- 默认值(default)设置:提供一个备用值以备缺省
- 验证逻辑(validator):这是一个用于校验输入有效性的机制
1.2.Vue2.6版本新增v-slot指令
6版本新增v-slot指令
可以采用v-slot指令说明标签放在哪个slot位置,指令的参数就是对应slot的名称;
注意: v-slot指令只能在tenplate上使用
slot标签中可以设置该slot的默认值,当不插入内容时,采用默认值。
父级模板的所有内容都是在父级作用域中编译的(默认只能使用父级组件的数据);
子模板里的所有内容都是在子作用域中编译的(默认只能使用子组件的数据)。
如何在待插入的标签中使用子组件的数据?作用域插槽.
在子组件中,slot的开始标签上自定义属性的方式传递数据;
在父组件中,slot对应的template中,v-slot指令的值就是接收到的数据对象.
v-slot指令的值 支持解构赋值
let {nickname:petname,age} = {nickname:"nextson",age:25}
v-slot: 可以简写为#
AI写代码
6版本之前, 作用域插槽 采用 slot-scope属性实现.
<next-son>
<template slot="top" slot-scope="props">
<p>{{props}}</p>
<p>{{props.nickname}}</p>
<strong>强壮的{{nickname}}</strong>
</template>
<template v-slot:bottom>
<small>小的</small>
</template>
</next-son>
AI写代码
