数据响应式:就是在数据变化时可以被检测并对这种变化做出响应的机制
vue中关于响应式,主要需要了解MVVM模型
M:模型(Model):对应data中的数据
V:视图(view):模板
VM:视图模型(ViewModel):Vue实例对象
在这个机制中要解决的一个核心问题是连接数据层和视图层,通过数据驱动视图,数据变化,视图更新,要做到这点的就需要对数据做响应式处理,这样一旦数据发生变化就可以立即做出更新处理。
以vue为例说明,通过数据响应式加上虚拟DOM和patch算法,可以使我们只需要操作数据,完全不用接触繁琐的dom操作,从而大大提升开发效率,降低开发难度。
响应式的优缺点:
vue2中的数据响应式会根据数据类型来做不同处理,如果是对象则采用Object.defineProperty()的方式定义数据拦截,当数据被访问或发生变化时,我们感知并作出响应;如果是数组则通过覆盖该数组原型的方法,扩展它的7个变异方法,使这些方法可以额外的做更新通知,从而作出响应。这种机制很好的解决了数据响应化的问题,但在实际使用中也存在一些缺点:比如初始化时的递归遍历会造成性能损失;新增或删除属性时需要用户使用Vue.set/delete这样特殊的api才能生效;对于es6中新产生的Map、Set这些数据结构不支持等问题。
关于Object.defineProperty()方法:
Object.defineProperty()传三个参数
Object.defineProperty(a,b,c)
a:要添加属性的对象
b:要添加的属性名
c:配置项
configurable:是否可删除
(1)当我们直接在一个对象上定义某个属性时,它的默认值是true
(2)而当我们通过属性描述符进行定义属性时,它的默认值是false
enumerable:是否可枚举,就是是否可遍历
(1)当我们直接在一个对象上定义某个属性时,他的默认值是true
(2)而当我们通过属性描述符进行定义属性时,他的默认值是false
writable:是否可修改,他的默认值是false
value:属性值
get函数
获取属性时执行的函数,默认为undefined
set函数
设置或者修改属性值时执行的函数,默认为undefined
数组变异方法:
在数组原型方法上进行了部分更改,使其在保存原效果的同时新增的部分效果,用法保持不变
push():往数组最后面添加一个元素,成功返回当前数组的长度
pop():删除数组的最后一个元素,成功返回删除元素的值
shift():删除数组的第一个元素,成功返回删除元素的值
unshift():往数组最前面添加一个元素,成功返回当前数组的长度
splice():有三个参数,第一个是想要删除的元素的下标(必选),第二个是想要删除的个数(必选),第三个是删除 后想要在原位置替换的值
sort():sort() 使数组按照字符编码默认从小到大排序,成功返回排序后的数组
reverse():reverse() 将数组倒序,成功返回倒序后的数组