英文官网
中文官网
动态构建用户界面的渐进式JavaScript框架
作者:尤雨溪
遵循MVVM模式
编码简洁,体积小,运行效率高,适合移动/PC端开发
它本身只关注UI,可以引入其它第三方库开发项目
初识vue
Hello!{
{name}}!
效果:
注意:
{ {xxx}}
中的xxx要写js表达式,且xxx可以自动读取到data中的所有属性
vue模板语法
效果:
总结:
Vue模板语法包括两大类:
插值语法:
{ {xxx}}
,xxx是js表达式,且可以直接读取到data中的所有区域指令语法:
数据绑定
单向数据绑定:
双向数据绑定:
效果:
总结:
Vue中有2种数据绑定的方式:
v-bind
):数据只能从data流向页面v-model
):数据不仅能从data流向页面,还可以从页面流向data备注:
、
、
等)v-model:value
可以简写为v-model
,因为v-model
默认收集的就是value值
el与data的两种写法
Hello,{
{name}}!
总结:
el有2种写法:
vm.$mount('#root')
指定el的值data有2种写法:
由Vue管理的函数,一定不要写箭头函数,否则this就不再是Vue实例了
MVVM模型:
效果:
总结:
总结:
object.defineProperty()
把data对象中所有属性添加到vm上。
事件的基本用法
hello,{
{name}}
效果:
总结:
v-on:xxx
或@xxx
绑定事件,其中xxx是事件名@click="demo
和@click="demo($event)"
效果一致,但后者可以传参
事件修饰符
效果:
总结:
Vue中的事件修饰符:
event.target
是当前操作的元素时才触发事件修饰符可以连续写,比如可以这么用:
@click.prevent.stop="showInfo"
键盘事件
欢迎来到{
{name}}学习
效果:
总结:
键盘上的每个按键都有自己的名称和编码,例如:Enter(13)。而Vue还对一些常用按键起了别名方便使用
Vue中常用的按键别名:
注意:
系统修饰键(用法特殊):ctrl、alt、shift、meta
可以使用keyCode去指定具体的按键,比如:@keydown.13="showInfo"
,但不推荐这样使用
Vue.config.keyCodes.自定义键名 = 键码
,可以自定义按键别名
计算属性
姓:
名:
姓名:{
{fullName}}
效果:
总结:
计算属性:
定义:要用的属性不存在,需要通过已有属性计算得来。
原理:底层借助了Objcet.defineproperty()
方法提供的getter和setter。
get函数什么时候执行?
优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便
备注:
new Vue({
el:’#root’,
data:{
firstName:‘张’,
lastName:‘三’
},
computed:{
fullName(){
return this.firstName + ‘-’ + this.lastName
}
}
})
监视属性
今天天气好{
{info}}!
效果:
总结:
监视属性watch:
当被监视的属性变化时,回调函数自动调用,进行相关操作
监视的属性必须存在,才能进行监视
监视有两种写法:
vm.$watch
监视vm.$watch(‘isHot’,{
immediate:true,
handler(newValue,oldValue){
console.log(‘isHot被修改了’,newValue,oldValue)
}
})
深度监视
a的值是:{
{numbers.a}}
b的值是:{
{numbers.b}}
效果:
总结:
深度监视:
deep:true
可以监测对象内部值的改变(多层)备注:
如果监视属性除了handler没有其他配置项的话,可以进行简写。
使用计算属性:
new Vue({
el:'#root',
data:{
firstName:'张',
lastName:'三'
},
computed:{
fullName(){
return this.firstName + '-' + this.lastName
}
}
})
使用监听属性:
new Vue({
el:'#root',
data:{
firstName:'张',
lastName:'三',
fullName:'张-三'
},
watch:{
firstName(val){
setTimeout(()=>{
this.fullName = val + '-' + this.lastName
},1000);
},
lastName(val){
this.fullName = this.firstName + '-' + val
}
}
})
总结:
computed和watch之间的区别:
两个重要的小原则:
{
{name}}
{
{name}}
{
{name}}
{
{name}}
{
{name}}
效果:
总结:
class样式:
写法:class="xxx"
,xxx可以是字符串、对象、数组
字符串写法适用于:类名不确定,要动态获取
对象写法适用于:要绑定多个样式,个数不确定,名字也不确定
数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用
style样式:
:style="{fontSize: xxx}"
其中xxx是动态值:style="[a,b]"
其中a、b是样式对象
条件渲染
当前的n值是:{
{n}}
Hello,{
{name}}!
Angular
React
Vue
效果:
总结:
v-if:
写法:
v-if="表达式"
v-else-if="表达式"
v-else
适用于:切换频率较低的场景
特点:不展示的DOM元素直接被移除
注意:v-if
可以和v-else-if
、v-else
一起使用,但要求结构不能被打断
v-show:
v-show="表达式"
使用
v-if
的时,元素可能无法获取到,而使用v-show
一定可以获取到
基本列表
人员列表(遍历数组)
-
{
{p.name}}-{
{p.age}}
汽车信息(遍历对象)
-
{
{k}}-{
{value}}
遍历字符串
-
{
{char}}-{
{index}}
遍历指定次数
-
{
{index}}-{
{number}}
效果:
总结:
v-for
指令:
,其中key可以是index,也可以是遍历对象的唯一标识
key的原理
人员列表
-
{
{p.name}} - {
{p.age}}
效果:
原理:
面试题:react、vue中的key有什么作用?(key的内部原理)
虚拟DOM中key的作用:key是虚拟DOM中对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】,随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下:
对比规则:
旧虚拟DOM中找到了与新虚拟DOM相同的key:
旧虚拟DOM中未找到与新虚拟DOM相同的key:创建新的真实DOM,随后渲染到到页面
用index作为key可能会引发的问题:
开发中如何选择key
列表过滤
人员列表
-
{
{p.name}}-{
{p.age}}-{
{p.sex}}
效果:
人员列表
-
{
{p.name}}-{
{p.age}}-{
{p.sex}}
效果:
Vue数据监视
学生信息
姓名:{
{student.name}}
年龄:{
{student.age}}
性别:{
{student.sex}}
爱好:
-
{
{h}}
朋友们:
-
{
{f.name}}--{
{f.age}}
效果:
总结:
Vue监视数据的原理:
vue会监视data中所有层次的数据
如何监测对象中的数据?
通过setter实现监视,且要在new Vue
时就传入要监测的数据
Vue.set(target,propertyName/index,value)
vm.$set(target,propertyName/index,value)
如何监测数组中的数据?
通过包裹数组更新元素的方法实现,本质就是做了两件事:
在Vue修改数组中的某个元素一定要用如下方法:
push()
、pop()
、shift()
、unshift()
、splice()
、sort()
、reverse()
Vue.set()
或 vm.$set()
特别注意:Vue.set()
和 vm.$set()
不能给vm 或 vm的根数据对象(data等) 添加属性
收集表单数据
效果:
总结:
收集表单数据:
,则v-model
收集的是value值,用户输入的内容就是value值
,则v-model
收集的是value值,且要给标签配置value属性
v-model
的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)v-model
的初始值是数组,那么收集的就是value组成的数组v-model
的三个修饰符:
过滤器
时间
当前时间戳:{
{time}}
转换后时间:{
{time | timeFormater()}}
转换后时间:{
{time | timeFormater('YYYY-MM-DD HH:mm:ss')}}
截取年月日:{
{time | timeFormater() | mySlice}}
效果:
总结:
过滤器:
定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。
语法:
注册过滤器:Vue.filter(name,callback)
或 new Vue{filters:{}}
使用过滤器:{ { xxx | 过滤器名}}
或 v-bind:属性 = "xxx | 过滤器名"
备注:
v-text指令
你好,{
{name}}
效果:
总结:
之前学过的指令:
v-bind
:单向绑定解析表达式,可简写为:
v-model
:双向数据绑定v-for