1.Vue核心
1.Vue核心
1.1.介绍
1.1.1.官网
Vue中文官网:https://cn.vuejs.org
1.1.2.简介
Vue是一套用于构建用户界面的渐进式JavaScript框架。
- 构建用户界面:将一堆杂乱的数据转为简单易懂可视化的界面
- 渐进式:vue可以自底向上逐层的应用(从一个轻量小巧的核心库逐渐递进到各式各样的vue插件)
- 简单应用:只需一个轻量小巧的核心库
- 复杂应用:可以引入各式各样的vue插件
1.1.3.特点
1.Vue采用了组件化模式,提高代码复用率、且让代码更好维护。
- 组件化:将某一个特定的功能里面的HTML、CSS、JS的代码封装到一个vue文件里面。
2.声明式编码,让编码人员无需直接操作DOM,提高开发效率。
- 命令式编码:需要一步一步的制定计算机执行的顺序或者步骤。
- 声明式编码:不需要一步一步的指定的计算机执行的顺序或者步骤,只需描述问题的解决方案。
3.使用虚拟DOM+优秀的Diff算法,尽量复用DOM节点。
- 虚拟DOM:将真实的DOM抽象为虚拟的节点,使页面的渲染、更新等操作都在虚拟DOM上进行,可以提高页面性能和响应速度。
- Diff算法:通过比较两个虚拟DOM树的节点和属性来确定页面上的哪些节点需要更新、添加、删除,确定需要操作的节点后,就可以用来替换真实的DOM,可以提高更新的效率。
1.1.4.引入Vue
v2下载网址:https://v2.cn.vuejs.org/v2/guide/installation.html
1.选择script标签的方式
- CND:与src类似,这个可以加速访问
2.选择开发版本即可
1.1.5.安装扩展
直接在火狐浏览器的扩展中心搜索Vue下载即可
1.2.初识
效果图
代码示例
总结
- 想让vue工作,先得引入vue文件
- 创建vue实例对象,并且传入对应的配置对象
- div中的语法依然为HTML中的语法,只不过是在原有的基础上混入了vue语法
- div中的代码被称为vue模板
- Vue实例和容器是一一对应的
- 真实的开发中只有一个vue实例,且会配合
组件
进行使用 - 一旦data中的数据发生变化,则页面中用到data中的数据也会发生变化
1.3.模板
效果图
模板语法分为两种
- 插值语法:双大括号表达式
- 功能:用于解析标签
体
内容 - 语法:
{{js表达式}}
- 功能:用于解析标签
- 指令语法:以
v-
开头- 功能:用于解析标签体内容、解析标签属性、绑定事件等
- 语法:
v-xxx:???
- xxx为vue的指令语法,有很多,例如bind、if等
- ???会作为js表达式处理,与上面的插值语法类似
1.4.数据绑定
数据绑定
分为两种
- 单向数据绑定:数据只能从data流向页面
- 语法:
v-bind:标签属性
或者简写为:标签属性
- 语法:
- 双向数据绑定:数据不仅可以从data流向页面,还可以从页面流向data
- 语法:
v-model:value
或者简写为v-model
- 注意
- 一般默认收集value的值
- 只能用于输入(表单)类的元素上
- 语法:
效果图
代码示例
1.5.el与data的写法
el第一种写法
new Vue({
el:'#code',
})
el第二种写法
const v = new Vue({
data:{
name:'张三'
}
})
v.$mount("#root")
data第一种写法
new Vue({
//对象式写法
data:{
name:'张三'
}
})
data第二种写法
- vue3中不能使用对象式写法
- 不能使用箭头函数,并且全部由vue管理的都不能使用箭头函数!!!!!!!!!!!!!!!!!!!!!重要的事情说三遍
new Vue({
//函数式写法
data:function(){
return{
name:'张三'
}
}
})
1.6.MVVM模型
M:模型(model):对应data中的数据
V:视图(view):模板
VM:视图模型(viewMdoel):Vue实例对象
MVVM模型图
1.7.事件处理
1.7.1.事件绑定
效果图
代码示例
总结
- 使用
v-on:xxx
或者@xxx
可以绑定事件,xxx为事件名,例如click,dblclick等 - 默认的事件形参为
event
,如果有传参数,则需要使用$event
占位 - 事件的回调函数需要配置到methods对象中,最终也会和data一样出现在vm上
- methods中配置的函数,和data中一样,不要使用箭头函数!!!
- methods中配置的函数,都是被vue所管理的函数
- this(前提不使用箭头函数,箭头函数的指向是window)的指向是
vm
或组件实例对象
- 全部由vue管理的都不能使用箭头函数!!!!!!!!!!!!!!!!!!!!!重要的事情说三遍
- this(前提不使用箭头函数,箭头函数的指向是window)的指向是
1.7.2.事件修饰符
使用方法:@click.xxx
,xxx为修饰符
1.7.3.键盘事件
当按下键盘上特定的键时才会触发事件
效果图
使用方法:@keyup(keydown).xxx
,xxx为修饰符(特定的键)
总结
- vue中常用的按键别名(特定的键)
- 回车=>enter
- 删除(退格)=>delete(back)
- 退出=>esc
- 空格=>space
- 换行=>tab(特殊键,只能使用在
keydown
事件) - 上=>up
- 下=>down
- 左=>left
- 右=>right
- vue未提供别名的按键,可以使用按键的原始名称进行绑定
- 使用
key
方法进行调用查看名字 - 当按键名字为两个单词组成时需要改成全部小写,并且单词之间使用
-
键进行分格- 例如:
CapLock
(转换字母大小写键)=>cap-lock
- 例如:
- 使用
- 系统修饰键:ctrl、alt、shift、meta(win键)
- 配合
keyup
事件:按下修饰键的同时需要再按下其他键,然后松开其他键,这样事件才会被触发 - 配合
keydown
事件:正常触发事件
- 配合
- 除了使用特定的键名来使用修饰符,也可以使用特定键的编码来指定,但是这种方式逐渐淘汰
- 使用
keyCode
方法查看编码 - 例如:@keyup.13 === @keyup.enter
- 使用
- 修改指定键的名字
Vue.config.keyCodes.要修改的名字
= 要修改键的编码
1.7.4.事件总结
- 修饰符的使用可以连续写
- 例如:@click.prevent.stop
- 先阻止默认行为,后阻止冒泡
- 系统修饰键中指定某一个组合才触发事件
- 例如:@keyup.ctrl.y
- 指定ctrl+y键才触发
1.8.计算属性与监视属性
1.8.1.计算属性
- 定义:计算属性是通过已有的
属性
计算得来的属性
:data中的属性
- 原理:使用
object.defineproperty
方法中的getter
和setter
方法 get
方法执行的时机- 初次读取时会执行一次
- 当
依赖的数据
发生改变时会再次被调用- 依赖的数据:计算属性所需要的属性
- 优点:与
methods
实现相比,内部有缓存机制(可以复用),效率更高,调试也更方便 - 备注
- 计算属性最终会出现在
vm
上,直接读取使用即可 - 如果计算属性要被修改,则必须要提高
set
方法进行修改,且set
中要引起计算时依赖的数据发生改变 get
和set
方法不能使用箭头函数
的方式定义,否则this
就会变成window
,并且全部由vue管理的都不能使用箭头函数!!!!!!!!!!!!!!!!!!!!!重要的事情说三遍
- 计算属性最终会出现在
效果图
代码示例
1.8.2.监视属性
效果图
代码示例
总结
-
当被监视的属性变化时,回调函数会自动调用,进行相关的操作
-
监视的属性必须存在才能进行监视!
-
两种书写格式
-
new Vue({ //监视属性 watch:{ //监视的对象 flag:{ //handler:当监视的对象发生改变时会调用 handler(newValue,oldValue){ console.log("新值:" + newValue + " 旧值: " + oldValue); } } } }) //当监视对象中只有handler这一个方法时,还可以进行简写 new Vue({ //监视属性 watch:{ //监视的对象 flag(newValue,oldValue){ console.log("新值:" + newValue + " 旧值: " + oldValue); } } })
-
const vm = new Vue({ }) //此处的监视对象必须用`单引号`引起来,因为不能使用简写方式,以前用的都是简写的方式,所以不用单引号也可以 vm.$watch('flag',{ handler(newValue,oldValue){ console.log("新值:" + newValue + " 旧值: " + oldValue); } }) //当监视对象中只有handler这一个方法时,还可以进行简写 const vm = new Vue({ }) //此处的监视对象必须用`单引号`引起来,因为不能使用简写方式,以前用的都是简写的方式,所以不用单引号也可以 vm.$watch('flag',function(newValue,oldValue){ console.log("新值:" + newValue + " 旧值: " + oldValue); } })
-
1.8.3.深度监视
效果图
未开启深度监视 | 开启深度监视 |
---|---|
![]() |
![]() |
代码示例
总结
- vue的
watch
默认不监视对象内部值的改变(只监视一层,例如:例子中的nums) - 配置
deep=true
:可以监视对象内部值的改变(可以监视多层,例如:例子中的a,b) - 备注
- vue自身可以监视对象内部值的改变,但是vue提供的
watch
默认不支持! - 使用
watch
时根据数据的具体结构,决定是否使用深度监视。
- vue自身可以监视对象内部值的改变,但是vue提供的
1.8.4.两个属性的区别
computed
和watch
的区别
computed
能干的事情,watch
也能干- 反之,
watch
能干的事情,computed
不一定能干,例如:异步操作
两个原则
- 所有被vue所管理的函数,最好都全部写成普通的函数
- 所有不被vue所管理的函数(定时器,Ajax,promise等的回调函数),最好都写成箭头函数
这样两个原则中的this
才能都指向vm
或者组件实例对象
。
1.9.绑定样式
在应用界面中, 某个(些)元素的样式是变化的
class/style 绑定就是专门用来实现动态样式效果的技术
1.9.1.绑定class样式
效果图
代码示例
1.9.2.绑定style样式
效果图
代码示例
绑定样式总结
-
class样式写法:
:class="xxx"
,xxx可以为数组,对象,字符串- 字符串写法---适用于样式名字不确定,需要动态切换
- 数组写法---适用于样式名字不确定,样式个数不确定
- 对象写法---适用于样式名字确定,样式个数确定,但要动态决定要不要使用
-
style样式
-
:style="{fontSize:xxx}"
,其中xxx为动态值
-
:style=[a,b,c]
,其中a、b、c为样式对象-
样式对象:已经定义好的样式对象
-
//例如 styleObj:{ fontSize: '20px', color: 'red' }, styleArr:[ { borderRadius: '50%', }, { border: '10px solid yellow' } ]
-
-
1.10.渲染
1.10.1.条件渲染
效果图
代码示例
总结
- v-if
- 写法
v-if="表达式"
v-else-if="表达式"
v-else
- 场景:切换频率较低的场景
- 特点:不展示的
DOM
元素会直接被移除 - 注意:
v-if
可以和v-else-if
、v-else
一起使用,但是结构不能被打断
- 写法
- v-show
- 写法:
v-show="表达式"
- 场景:切换频率较高的场景
- 特点:不展示的
DOM
元素不会被移除,仅仅只是被隐藏
- 写法:
- 备注:使用
v-if
时,元素可能无法被获取到,而v-show
一定可以获取到
1.10.2.列表渲染
效果图
代码示例
总结
- 作用:用于展示列表数据
- 写法:
v-for="(value,index) in object" :key="xxx"
,:key
为唯一标识 - 可遍历:数组、对象、字符串、指定次数等
1.10.3.列表中的key
react
和vue
中的key
有什么作用
key
是虚拟
DOM对象的标识,当数据发生变化时,vue会根据新数据生成新的虚拟DOM,随后vue进行新虚拟DOM与旧虚拟DOM的差异比较,比较规则如下:- 旧虚拟DOM中找到了与新虚拟DOM相同的
key
- 若虚拟DOM中内容没有改变,会直接使用之前的真实DOM。
- 若虚拟DOM中内容有改变,则生成新的真实DOM,随后替换掉页面中之前的真实DOM。
- 旧虚拟DOM中未找到与新虚拟DOM相同的
key
- 创建新的真实DOM,随后渲染到页面
- 旧虚拟DOM中找到了与新虚拟DOM相同的
- 用
索引
作为key
引发的问题- 若对数据进行逆序添加、逆序删除等破坏顺序的操作,会产生没有必要的真实DOM更新,虽然不影响页面渲染,但是效率会降低。
- 如果结构中还包括输入类的
DOM
,会产生错误DOM更新,并且会影响页面渲染。
- 如何选择
key
值- 使用每条数据的
唯一标识
作为key
,例如学号、电话号码、邮箱、身份证号等唯一值。 - 如果不存对数据进行逆序添加、逆序删除等破坏顺序的操作,仅用于渲染列表展示,则使用
索引
作为key
是没有问题的。
- 使用每条数据的
1.10.4.列表过滤
效果图
代码示例
1.10.5.列表排序
效果图
代码示例
1.11.指令
1.11.1.内置指令
已学指令
- v-bind:单向绑定解析表达式,简写:
:xxx
- v-model:双向绑定解析表达式,绑定
value
时简写:v-model
- v-for:遍历数组、对象、字符串
- v-on:绑定事件监听,简写:
@
- v-if:条件渲染(动态控制节点是否存在)
- v-else-:条件渲染(动态控制节点是否存在)
- v-show:条件渲染(动态控制节点是否展示)
①v-text
作用:向其所在的节点中渲染文本
内容,会把整个内容模块都当成文本
与插值语法的区别:v-text
会替换掉整个节点的内容,插值语法不会
效果图
代码示例
②v-html
作用:向其所在的节点中渲染包含html
内容,不会把内容模块当成文本,会进行解析html,js
等代码
与插值语法的区别
v-html
会替换掉整个节点的内容,插值语法不会v-html
可以识别html
结构
注意:安全性问题
- 在网站上动态渲染任意
html
是非常危险的,容易导致XSS
攻击。 - 一定要在可信的内容上使用
v-html
,不能使用在用户提交的内容上!
效果图
代码示例
③v-cloak
作用:是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak
属性
使用css
配合v-cloak
可以解决网速慢时页面会加载出{{xxx}}
的问题
代码示例
开始访问前五秒时,页面不会显示效果,会将原本的{{name}}
给隐藏掉,
当五秒过后,会立即执行vue,并且将v-cloak
删除,随后显示Vue
④v-once
作用:v-once
所在节点在初次动态渲染后,就视为静态内容了。
以后数据的改变不会引起v-once
所在结构的更新,可以用于优化性能。
效果图
代码示例
⑤v-pre
作用:让Vue
跳过其所在节点的编译。
可利用它跳过没有使用指令语法、插值语法的节点,可以加快编译速度。
效果图
代码示例
1.11.2.自定义指令
①函数式自定义指令
效果图
代码示例
执行时机
- 指令与元素成功绑定时(刚开始)
- 指令所在的模板被重新解析时
②对象式自定义指令
效果图
代码示例
1.11.3.总结
定义语法:
-
局部指令
new Vue({ directives:{指令名:配置对象} }) 或 new Vue({ directives{指令名:回调函数} })
-
全局指令
Vue.directives{指令名:配置对象} 或 Vue.directives{指令名:回调函数}
配置对象中常用的三个回调:
- bind:指令与元素成功绑定时调用。
- inserted:指令所在元素被插入页面时调用。
- update:指令所在的模板被重新解析时调用。
备注:
- 指令定义时不用加
v-
,但使用时需要加v-
。 - 指令名如果是多个单词,每个单词间用
-
分格,不要使用驼峰命名法。
1.12.生命周期
基本概念:
- 别名:生命周期
回调函数
、生命周期函数
、生命周期钩子
。 - 作用:
Vue
关键时刻可以帮我们调用的一些特殊名称的函数。 - 备注:
- 生命周期
函数
的名称不可修改,但函数的具体内容是程序员根据需求编写的。 - 生命周期
函数
中的this
指向的是vm
或者组件实例对象
。
- 生命周期
流程图
总结
常用的生命周期钩子:
- mounted:发送
Ajax
请求、启动定时器、绑定自定义事件、订阅消息等初始化操作
。 - beforeDestroy:清除定时器、解绑自定义事件、取消订阅消息等
收尾操作
。
关于销毁Vue实例:
- 销毁后借助
Vue
开发者工具看不到任何信息。 - 销毁后自定义事件会失效,但原生
DOM
事件依然有效。 - 一般不会在
beforeDestroy
中操作数据,因为即使操作了数据,也不会再触发更新流程了。