当前位置:   article > 正文

Vue 的数据响应式原理以及具体实现_vue数据响应式的原理与实现

vue数据响应式的原理与实现

 

一、理解Vue的设计思想

MVVM框架的三要素:数据响应式、模板引擎及其渲染

(1) 数据响应式:监听数据变化并在视图中更新

  • Object.defineProperty()
  • Proxy

(2) 模版引擎:提供描述视图的模版语法

  • 插值:{{}}
  • 指令:v-bind,v-on,v-model,v-for,v-if

(3) 渲染:如何将模板转换为html

  • 模板 => vdom => dom

 

二、数据响应式原理

数据变更能够响应在视图中,就是数据响应式。vue2中利用 Object.defineProperty() 实现变更检测。

 

 三、响应式原理实现

(1)代码:

  1. // TODO 定义一个对象响应式原理
  2. function defineReactive(obj, key, val) {
  3. // TODO 1。处理办法
  4. observe(val)
  5. Object.defineProperty(obj, key, {
  6. get() {
  7. console.log('Get方法:', val)
  8. return val
  9. },
  10. set(newVal) {
  11. if (val !== newVal) {
  12. val = newVal
  13. console.log('Set方法:', val)
  14. // update(val)
  15. // TODO 2。问题2处理:obj.ccc赋值时,会进入到set拦截器,判断newval值为对象,我们需要对覆盖的这个对象做处理
  16. if(typeof newVal === 'object') {
  17. observe(newVal)
  18. }
  19. }
  20. }
  21. })
  22. }
  23. // 更新函数
  24. function update(val) {
  25. document.getElementById('#app').innerHTML = val
  26. }
  27. // 处理对象的响应式,遍历对象中的所有key,对其做响应式处理
  28. function observe(obj) {
  29. if (typeof obj !== 'object' || obj == null) {
  30. return;
  31. }
  32. Object.keys(obj).forEach(key => {
  33. defineReactive(obj, key, obj[key])
  34. })
  35. }
  36. // TODO 3。处理新增的属性,增加响应式
  37. function set(obj, key, val) {
  38. defineReactive(obj, key, val)
  39. }
  40. var obj = {
  41. foo :'foo',
  42. boo: '123',
  43. ccc: {
  44. test: 'test',
  45. test2: 'test2'
  46. }
  47. }
  48. // 将obj 注册为响应式
  49. observe(obj)
  50. // TODO 1。obj.ccc 是一个对象,对象内部也要实现响应式处理
  51. obj.ccc.test
  52. // TODO 2。原本已经给最初赋值的 obj.ccc = {} 做了响应式的处理,但是下面又对他重新覆盖,导致,覆盖的内容不能响应
  53. obj.ccc = {test:1}
  54. obj.ccc.test
  55. // TODO 3。新增一个对象,是没实现响应式处理,要自己实现一个set 方法
  56. // obj.dong = 'dong'
  57. set(obj, 'dong', 'dong')
  58. obj.dong
  59. // 每一秒触发一次对象的set,并更新视图View
  60. // setInterval(() => {
  61. // obj.foo = new Date().toLocaleTimeString()
  62. // }, 1000)

 

(2)实现结果:

传入的对象都实现了set 和 get 的监听。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/259172
推荐阅读
相关标签
  

闽ICP备14008679号