VUE:一套用于构造用户界面的渐进式Javascript
框架
简单应用:只需一个轻量小巧的核心库
复杂应用:可以引入各式各样的Vue
插件
开发人:尤雨溪
1:采用组件化模式,提高代码复用率,且让代码更好维护
2:声明式编码,让编码人员无需直接操作DOM,提高开发效率
3:使用虚拟DOM+优秀的Diff算法,尽量复用DOM节点
方法:Object.defineProperty
value
: 默认值
writable: true
, 可写,可修改
enumerable: true
, 可遍历,
configurable: true
, 可删除
代码示范:
通过vm对象来代理data对象中属性的操作(读/写)
更加方便的操作data中的数据
为每一个添加到VM上的属性,都指定一个getter/setter.
在getter/setter内部去操作(读/写)data中对应的属性
1:使用v-on:xxx或@xxx绑定事件,其中xxx是事件名
2:事件的回调需要配置在methods对象中,最终会在vm上
3:methods中配置的函数,不要用箭头函数!!! 否则this就不是vm
4:methods中配置的函数,都是被Vue所管理的函数,this的指向是vue或组件实例对象
5:@click=‘demo’ 和 @click=’demo($enent)‘效果一样,但后者可以传参
1:.prevent
:阻止默认事件 (类似于a标签的默认跳转)
2:.stop
: 阻止事件冒泡,(内层的点击事件会触发父级的点击事件)
3:.once
: 事件只触发一次
4:.capture
: 使用事件的捕获模式, (一般先捕获,再冒泡,在冒泡事件上处理事件,用此方法可以在事件捕获阶段处理事件。加在父级上)
5:.passive
: 事件的默认行为立即执行,无需等待事件回调执行完毕
回车 => enter
删除=>delete(捕获删除和退格键)
空格=>space
退出=>esc
换行=>tab (特殊,必须配合keydown去使用,自身自带光标切走)
上=>up
下=>down
左=>left
右=>right
console.log(e.key) 输出键盘名
console.log(e.keyCode) 输出键盘编码
(1):配合keyup使用:按下修饰键同时,再按下其他键,随后释放其他键,事件才会触发
(2):配合keydown使用:正常触发事件
vue.config.keyCodes.自定义键名 = 键码 , 可以定制按键别名 (一般不推介,每个人键盘编码会不一致)
methods
:方法;computed{}
:计算属性;定义:要用的属性不存在,要通过自己的属性计算得来
原理:底层借助了Object.definrProperty方法提供的getter和setter
get函数什么时候执行:(1):初次读取会执行一遍 (2):当依赖的数据发生改变时会被再次调用
优势:与methods方法相比,内部有缓存机制(复用),效率更高,调试方便
备注:
(1):计算属性最终会出现在VM上,直接读取即可
(2):如果计算属性要被修改,那必须写在set函数上去相应修改,且set中要引起计算时依赖的数据发生
watch
:监视属性;immediate: true
, //初始化时让函数调用一下
deep:true
// 开启深度监视
以上两个必须配合函数handler(){}
使用,函数名不可变,详见下图
1:当被监视的属性发生变化时,回调函数自动调用,进行相关操作
2:监视属性必须存在,才能进行监视!
3:监视属性的两种写法:
(1):new.Vue时传入watch配置
(2):通过vm.$watch监视
4:深度监视:
(1):Vue中的watch默认不监视对象内部值的改变(一层)
(2):配置deep:true
可以检测对象内部值的改变(多层)
filter
:过滤器 定义:对要显示的数据进行特定格式化后再显示(适用于一些简单的逻辑处理)
语法:
1:注册过滤器: Vue.filter(name,callback) 或 new Vue{filters:{}}
2: 使用过滤器:{{ xxx | 过滤器名 }} 或 v-bind:属性 = ”xxx | 过滤器名“
备注:
1:过滤器也可以接收额外传参,多个过滤器可以串联
2:过滤器并没有改变原本的数据,是产生新的对应数组
computed
和watch
之间的区别1:computed
能完成的功能,watch
都可以完成
2:watch
能完成的功能,computed
不一定都能完成,例如:watch
可以进行异步操作
1:所被Vue管理的函数,做好写成普通函数,这样this的指向才是vm或组件实例对象
2:所有不被Vue管理的函数(定时器的回调函数,ajax的回调函数,Promise的回调函数),最好写成回调函数,这样this的指向才是vm或组件实例对象
写法::class=‘xxx’ xxx可以是字符串,对象,数组
1:字符串写法适用于:类名不确定,要动态获取
2:对象写法适用于:要绑定多个样式,个数不确定,名字也不确定
3:数组写法适用于:要绑定多个样式,个数确定,名字确定,但是不确定用不用
:style=’{fontSize : xxx}’ 其中xxx是动态值
:style="[a,b]" 其中a,b是动态值
v-if
(1):v-if=‘表达式’
(2):v-else-if=‘表达式’
(3):v-else=‘表达式’
适用于:频率切换较低的场景
特点:不展示的DOM元素直接被移除
注意:v-if可以和:v-else-if,v-else一起使用,但中间结构不能“打断”
v-show
写法:v-show=”表达式“
适用于:切换频率较高的场景
特点:不展示的DOM元素未被移除,仅仅是样式隐藏消失
v-for
指令: 用于展示列表数据
语法:v-for = ”(item,index) in xxx“ :key=“index”
可遍历:数组,对象,字符串(用的少),指定次数(用的少)
key的内部原理
: key
是虚拟DOM对象的标识,当数据发生改变时,Vue会根据【新数据】生成【新的虚拟DOM】
随后Vue进行了【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下:
(1):旧虚拟DOM中找到了与新虚拟DOM相同的key
若虚拟DOM中内容没变,直接使用之前的真实DOM!
若虚拟DOM中的内容变了,则生成新的真实DOM,随后替换掉页面中真实的DOM
(2):旧虚拟DOM中未找到与新虚拟DOM相同的key
创建新的虚拟DOM,随后渲染到页面
(3):用index作为key可能会引发的问题
1:若对数据进行:逆序添加,逆序删除等破坏顺序的操作:
会产生没有必要的真实DOM更新 ==> 界面效果没有问题,但效率低
2:如果结构中还包含输入类的DOM:
会产生错误的DOM更新 ==> 界面有问题
(4):开发中如何选择key?
通过setter实现监视,且要在new Vue时就传入要检测的数据
(1):对象中后追加的属性,Vue默认不做响应式处理
(2):如需要给后添加的属性做响应式,请使用如下API:
Vue.set(this.student, ‘sex’, ‘男’)
vm.$set(this.student, ‘sex’, ‘男’)
通过包裹数组更新元素的方法实现,本质就是做了两件事:
(1):调用原生对应的方法对数组进行更新
(2):重新解析模板,进而更新页面
(1):使用这些API:push() ,pop(), shift(), unshift(), splice(), sort(a,b){}, reverse()
(2):Vue.set() 或 vm.$set
v-model
:收集表单数据lazy
:失去焦点在收集数据number
:输入字符串转为有效数字trim
:输入首尾空格过滤若: 则v-model收集的时value值,用户输入的就是value值
若: 则v-model收集的时value值,且要给标签配置value值
若:
1:没有配置input的value值
2:配置input的value属性:
(1):v-model
的初始时非数组,那么收集到的就是checked(勾选 or 未勾选,是布尔值)
(2):v-model
的初始值是数组,那么收集到的就是value组成的数组
v-bind
:单项绑定解析表达式,可简写为:xxxv-model
: 双向数据绑定v-for
:遍历数组/对象/字符串v-if
: 条件渲染(动态控制节点是否存在)v-else
:条件渲染(动态控制节点是否存在)v-show
:条件渲染(动态控制节点是否展示)v-text
指令: 1:作用:向其所在的节点中渲染文本内容
2:与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会
v-html
指令: 1:作用:向指定节点中渲染包含html结构的内容
2:与插值语法的区别:
(1):v-html会替换掉节点中所有的内容,{{xx}}则不会
(2):v-html可以识别html结构
(1):再网站上动态渲染任意html是非常危险的,容易导致XSS攻击
(2):一定要在可信的内容上使用v-html,永远不要用在用户提交的内容上!!!
v-cloak
指令: (1):本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删除v-cloak属性,
(2):使用css配合v-cloak可以解决网速慢时页面展出{{xxx}}的问题
v-once
指令: 1:v-once所在的节点在初次动态渲染后,就视为静态内容了
2:以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能
v-pre
指令: 1:跳过其所在节点的编译过程
2:可利用它跳过:没有使用指令语法,没有使用插值语法的节点,会加快编译
一:定义语法:
new Vue({ new Vue({
directives:{指令名:配置对象} 或 directives(){}
}) })
Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)
bind
:指令与元素成功绑定时调用。inserted
:指令与元素被插入页面时被调用update
:指令所在模板结构被重新解析时调用 三:备注:
1:指令定义时不加v-,但是使用时要加v-
2:指令名如果是多个单词,要使用kebab-case方式命名,不要用小头峰式
1:又名:生命周期回调函数,生命周期函数,生命周期钩子
2:是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数
3:生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的
4:生命周期函数中的this指向是vm或组件实例对象
beforeCreate
将要创建created
创建完毕beforeMount
将要挂载mounted
挂载完毕 可发送ajax请求,启动定时器,绑定自定义事件,订阅消息等【初始化操作】beforeUpdate
将要更新 在此阶段会导致页面更新与数据不符(Vue已将数据更新完毕,还未更新页面)updated
更新完毕beforeDestroy
将要销毁 可清除定时器,解绑自定义事件,取消订阅消息等【收尾工作】销毁后自定义事件会失效,但原生DOM事件依然有效。一般不会在beforeDestroy操作数据,因为即使操作数据,也不会再触发更新流程destroyed
销毁完毕1:作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态
2:具体名字:
1:activated
路由组件被激活时触发
2:deactivated
组件失活时触发
3:this.$nextTick(function(){})
当修改了数据之后,Vue操作完DOM之后,把真实的页面放入页面,Vue调用这个函数