Vue数据响应式
Vue数据相应式
Vue数据相应式:就是当修改普通JavaScript对象时,视图(view)会进行更新。
响应式系统

当把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter/setter。这个过程称为数据劫持。
这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖,在 property 被访问和修改时通知变更。
具体来说,
- 当执行get()响应时,会调用
dep.depend(),此函数将target对象push进监听队列(subscris),然后读取property。 - 当执行set()响应时,会先拿到新值,然后调用
dep.notify(),此函数执行监听队列中的每个target,重新更新。
每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把“接触(Touch)”过的数据 property 记录为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。
举例:
1 | |
测试:
1 | |
异步更新队列
上面例子中,watcher被极度简化。实际上,Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并buffer在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次(数据去重),避免不必要的计算和 DOM 操作。然后,在下一个的事件循环“tick”中,Vue 刷新队列。
具体见一下例子:
https://jsbin.com/mocotic/edit?html,js,output
html:
1 | |
JavaScript:
1 | |
因为 b 一开始不是 obj 的 key,所以 Vue 并没有监听 b。即使 b 的值变了,视图也不会更新。
JavaScript:
1 | |
由于更新DOM过程是异步的。当更新a属性时,Vue监听到变化,先是开启了一个新的监听队列,将更新任务push到新的更新队列里。等到代码运行完毕,再更新DOM。此时页面展示的就是所有的跟新的数据。
版权声明:本文作者为「Andy8421」.本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!