Vue是什么?
一套用于构建用户界面的渐进式JavaScript框架。
构建用户界面:数据
--->
界面
渐进式:Vue可以自底向上逐层的应用。【简单应用:只需一个轻量小巧的核心库】【复杂应用:可以引入各式各样的Vue插件】
谁开发的?尤雨溪
后起之秀,生态完善,已然成为国内前端工程师必备技能。
Vue的特点
<div id="root">
<h1>Hello,{{name}}, {{age}}h1>
div>
<script>
Vue.config.productionTip = false; // 阻止vue在启动时生成生产提示。
new Vue({ // 创建vue实例
el: '#root', // el用于指定当前vue实例为哪个容器服务,值通常为css选择器字符串
data: { // data中用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
name: '小王',
age: 18
}
})
script>
总结:
{{ xxx }}
中的xxx要写js表达式,且xxx可以自动读取到data中的所有数据。Vue模板语法有2大类:
插值语法:双大括号表达式
功能:用于解析报签体内容
写法:{{ xxx }}
,xxx是js表达式,且可以直接读取到data中的所有属性。
指令语法:以v-开头
功能:用于解析标签(包括:标签属性、标签体内容、绑定事件…)
举例:v-bind:href=''xxx'
,xxx会作为js表达式解析。
Vue中有2种数据绑定的方式:
单向绑定(v-bind):数据只能从data流向页面。
双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。
注意:
v-model:value
可以简写为v-model
,因为v-model
默认收集的就是value
的值。data与el的两种写法:
el有两种写法:
new Vue
时候配置el属性。vm.$mount('#root')
指定el的值。data有2种写法:
对象式
data: {
name: '尚硅谷'
}
函数式:若需要用组件的时候,data必须使用函数式,否则会报错。
data() { // data: function() {
return {
name: '尚硅谷'
}
}
一个重要原则:由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了。
MVVM模型:
观察发现:
数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)
Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读/写)
Vue中数据代理的好处:更加方便的操作data中的数据
基本原理:
通过Object.defineProperty()
把data对象中所有属性添加到vm上。为每一个添加到vm上的属性,都指定一个getter/setter。在getter/setter内部去操作(读/写)data中对应的属性。
事件的基本使用
v-on:xxx
或@xxx
绑定事件,其中xxx是事件名。methods
中配置的函数,不要用箭头函数!否则this就不是vm了。methods
中配置的函数,都是被Vue所管理的函数,this指向的是vm或组件实例对象。@click="demo"
和@click="demo($event)"
效果一致,但后者可以传参。Vue中的事件修饰符
prevent
:阻止默认事件(常用)。stop
:阻止事件冒泡(常用)。once
:事件只触发一次(常用)。capture
:使用事件的捕获模式。self
:只有event.target
是当前操作的元素时才触发事件。passive
:事件的默认行为立即执行,无需等待事件回调执行完毕。注意:想要实现多种修复的功能,可以在后面加点继续写。
键盘事件
enter
delete
(捕获“删除”和“退格”键)esc
tab
(特殊,必须配合keydown去使用)up
down
left
right
caps-lock
(短横线命名)ctrl
、alt
、shift
、meta(Win键)
Vue.config.keyCodes.自定义键名 = 键码
,可以去定值按键别名。计算属性
Object.defineproperty
方法提供的getter
和setter
。methods
实现相比,内部有缓存机制(复用),效率更高,调试方便。监视属性Watch
普通监视
new Vue
是传入watch
配置。vm.$watch
监视。深度监视
deep: true
可以检测对象内部值的改变(多层).注意:
计算属性和监视属性的区别
computed
能完成的功能,watch
都可以完成。watch
能完成的功能,computed
不一定能完成。例如:watch
可以进行异步操作。两个重要的小原则
class样式:写法:class="xxx",xxx可以是字符串、对象、数组。
字符串写法适用于:类名不确定,要动态获取。
对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。
数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用。
style样式
:style="[fontSize: xxx]"
其中xxx是动态值。
:style="[a,b]"
其中ab是样式对象。
v-if
写法:
v-if="表达式"
v-else-if="表达式"
v-else="表达式"
适用于:切换频率较低的场景
特点:不展示的DOM元素直接被移除。
注意:
v-if
可以和v-else-if
、v-else
一起使用,但是要求结构不能被"打断"。template
标签一起使用,但不会破坏页面结构。v-show
写法:v-show="表达式"
适用于:切换频率较高的场景。
特点:不展示的DOM未被移除,仅仅是使用样式隐藏掉。
注意:不可以配合template
标签一起使用
注意:使用v-if
的时候,元素可能无法获取到,而使用v-show
一定可以获取到。
v-for指令
v-for="(item, index) in xxx" :key="yyy"
。key的原理
虚拟DOM中key的作用:
key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成生成【新的虚拟DOM】,随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较。
对比规则:
用index作为key可能会引发的问题
开发中如何选择key?
图片解析key原理
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的根数据对象添加属性。
:则v-model
收集的是value值,用户输入的就是value值。
:则v-model
收集的是value值,且要给标签配置value值。
input
的value属性,那么收集的就是checked(勾选or未勾选,是布尔值)。input
的value值
v-model
的初始值是非数组,那么收集的就是checked
(勾选or未勾选,是布尔值)。v-model
的初始值是数组,那么收集的就是value组成的数组。v-model
的三个修饰符:
lazy
:失去焦点再收集数据。number
:输入字符串转为有效的数字。trim
:输入首尾空格过滤。Vue.filter(name, callback)
或new Vue({ filters: {} })
{{ xxx | 过滤器名 }}
或v-bind: 属性 = "xxx | 过滤器名"
内置指令
v-text
v-text
会替换掉节点中的内容,{{ xxx }}
则不会。v-html
v-html
会替换掉节点中所有的内容,{{ xxx }}
v-html
可以识别html结构。v-html
有安全性问题
v-htm
,永远不要用在用户提交的内容上。v-cloak
:(没有值)
v-cloak
属性。v-cloak
可以解决网速慢时页面展示出{{ xxx }}
的问题。v-once
v-once
所在节点在初次动态渲染后,就视为静态内容了。v-once
所在结构的更新,可以用于优化性能。v-pre
自定义指令
定义语法
局部指令
new Vue({
directives: { 指令名: 配置对象 }
})
new Vue({
directives: { 指令名: 回调函数 }
})
全局指令
Vue.directive(指令名, 配置对象)
Vue.directive(指令名, 回调函数)
配置对象中常用的三个回调
bind
:指令与元素成功绑定是调用。inserted
:指令所在元素被插入页面时调用。update
:指令所在模板结构被重新解析时调用。备注
v-
,但使用时要加v-
。kebab-case
命名方式,不要使用cameCase
命名。生命周期
常用的生命周期钩子
mounted
:发送ajax
请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。beforeDestroy
:清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】关于销毁Vue实例
beforDestroy
操作数据,因为即便操作数据,也不会再触发更新流程了。生命周期图解