前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue.js-深入响应式原理

Vue.js-深入响应式原理

作者头像
用户3258338
发布2019-07-19 17:09:57
1.5K0
发布2019-07-19 17:09:57
举报

从哪来的,还要回到哪儿去

你还相信那样的故事吗?

hello,各位宝宝,最近还好吗?最近生活平静吗?还是有惊喜?不管怎样,心态要平和。不管谁来,不管谁走,都是命运的安排~

最近在看vue.js原理,希望和志同道合的你,一起探索

深入响应式原理

vue的响应式系统,真是给前端同学带了极度舒适。利用vue,在开发过程中我们只需要关注data就好了,渲染更新页面的功能,全部由vue内部帮我们做了,那么到底是怎么做到的呢?

追踪变化

当把一个javascript对象传入vue实例作为data选项时,vue将遍历该对象的所有属性,并使用Object.defineProperty把这些属性全部转换成getter/setter。这些getter/setter对用户来说是不可见的,在内部他们让vue能够追踪依赖,在属性被访问或者修改时通知变更。

每个组件实例都对应一个watcher实例,它会在组件渲染过程中把’接触‘过的数据属性记录为依赖,当依赖项的setter触发时,会通知watcher,从而重新渲染与之关联的组件。

检测变化注意事项

vue无法检测对象属性的添加和删除。由于在初始化实例的时候,已经对data的属性进行了getter/setter的转换,所以属性必须在data对象上存在才会将他转换为响应式的。当我们在开发中确实需要这样做时有两个方法可以选择。

当只需要增加某个属性时:

代码语言:javascript
复制
this.$set(this.someObject,'b',2)

当只需要增加多个属性时:

代码语言:javascript
复制
// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })

声明响应式属性

vue不允许动态添加根级响应式属性,所以需要在初始化时就进行声明。

代码语言:javascript
复制
var vm = new Vue({
  data: {
    // 声明 message 为一个空值字符串
    message: ''
  },
  template: '<div>{{ message }}</div>'
})
// 之后设置 `message`
vm.message = 'Hello!'

vue这样做是为了消除依赖项跟踪系统中的边界情况,同时data对象反应组件状态结构,对于以后的维护人员来说更好维护。

异步更新队列

vue对Dom的更新是异步的,只要侦听到数据变化,就创建一个队列,并缓冲在同一事件循环中的所有数据变化。若同一个watcher被多次触发,只会被推入队列一次。然后在下一次时间循环"tick"中,vue刷新队列并执行实际工作。

例子:

代码语言:javascript
复制
<div id="example">{{message}}</div>
代码语言:javascript
复制
var vm = new Vue({
  el: '#example',
  data: {
    message: '123'
  }
})
vm.message = 'new message' // 更改数据
// 异步更新DOM
vm.$el.textContent === 'new message' // false
// 下一次事件循环时
Vue.nextTick(function () {
  vm.$el.textContent === 'new message' // true
})

愿我们有能力不向生活缴械投降---Lin

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 女程序员的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档