企业网站推广内容,wampserver做网站,广州白云区房价,网站做301的坏处Vue2中检测数组变化的限制和解决方法
vue2用下标设置数组没效果
arr [1,2] arr[0] 0,页面上显示的arr并没有修改(如果对应下标是原始值#xff1b;若是引用值)解决1#xff1a;Vue.Set解决2#xff1a;arr.splice (Vue会劫持splice方法) Vue2对对象是循环defineProperty…Vue2中检测数组变化的限制和解决方法
vue2用下标设置数组没效果
arr [1,2] arr[0] 0,页面上显示的arr并没有修改(如果对应下标是原始值若是引用值)解决1Vue.Set解决2arr.splice (Vue会劫持splice方法) Vue2对对象是循环defineProperty递归、深度set时通知dep.notify()对于数组则是重写数组7个方法push、pop、shift、unshift、splice、sort、reverse时通知dep.notify() div idapp{{ arr[0].a }}{{ arr[1].a }}/divscriptvar app new Vue({el: #app,data: {arr: [{ a: 2 }, { a: 600 }]},mounted() {setTimeout(() {this.arr[1] [{ a: 400 }] // 这样看不到400this.arr[1].a 800 // 这样能看到变成800}, 3000)}})/scriptvue2设置数组长度没效果
arr.length-- ,页面上显示的arr并没有修改解决1Vue.Delete解决2arr.splice
Vue nextTick
Vue渲染是异步渲染添加元素时不会马上渲染而是到下一个tick才渲染。 nextTick的回调会在dom异步渲染完毕后执行vue是组件级的若一有数据就更新性能肯定不好。并且vue是批量做渲染的 在外部添加3个 在nextTick里获取个数 只会打印一次
nextTick的实现
如果支持promise将回调放在then方法里若不若支持MutationObserver就xxx也是异步执行的若不若支持setImmediate再不setTimeout
computed method watch区别
method用在视图上每次都去执行开销大而computed是具备缓存的若依赖的属性无变化不计算
Vue Plugin
全局方法 Vue.xx访问全局指令mixin原型上绑定方法 Vue实例this访问导出插件在main.js里use
Vue组件data返回函数
Vue组件可能存在多个实例如果使用对象形式定义data会导致他们共用一个data对象那么状态变更将会影响所有组件实例采用函数形式定义在initData时会将其作为工厂函数返回全新的data对象有效规避多实例之间状态污染问题。而Vue根实例只能有一个不会有次问题。
加key 高效更新dom
key的作用主要是为了高效更新虚拟DOM其原理是vue在patch(打补丁)过程中通过key可以精准判断两个节点是都是同一个从而避免频繁更新不同元素是patch过程更高效减少dom操作量提高性能若不设置key还可能在列表更新时引发一些隐蔽的bugvue中在使用相同标签名元素的过渡切换时也会使用到key属性目的是为了让vue可以区分他们否则vue只会替换其内部属性而不会触发过渡效果 不使用key更新时不知道每个元素的位置所以在A更新AB更新BC更新为F以此类推实际更新了3次从F开始FCD 创建插入E 源码中每次循环认为这5对是sameVnode只能每次都去更新。而加了key能精准判断是否是相同节点 使用key只做了一次创建F并插入到C前面的操作比较时比较首位元素是否相同
源码 没有设置key时key的值是undefined两个未设置key的标签值被判断为相同 diff算法不是最优增加key优化了diff降低复杂度 加key
index作为key
在数据会增减时可能会产生问题在头部插入在中间删除数量变化index是在变的random作为key随机数还是有可能是一样的
vue-router的原理
vue-router通过hash与History interface两种方式实现前端路由更新视图但不重新请求页面”是前端路由原理的核心history模式则会将URL修改得就和正常请求后端的URL一样,如后端没有配置对应/user/id的路由处理则会返回404错误它提供mode参数hash带# new HashHistory 是基于location.hash来实现的。Location.hash的值就是URL中#后面的内容。当hash改变时页面不会因此刷新浏览器也不会请求服务器。history更像url new HTML5History
update beforeUpdate
总结
不能笼统地说能修改或不能修改数据修改的数据未渲染到视图不会触发这2个钩子this.msg this.msg 1是有可能引起死循环的操作beforeUpdate修改视图数据不会再次触发beforeUpdate 即使也没关系updated修改视图数据为常量会再触发一轮beforeUpdate → update因此若在此生命周期会死循环