美文网首页
vue 中响应式的实现思路

vue 中响应式的实现思路

作者: Rui哥 | 来源:发表于2019-11-07 15:17 被阅读0次

1. javaScript中对象obj的属性的属性值监听

 <script> 
      const obj = {
        name: 'zhangsan',
        age: 18
      }
     
      // 遍历属性的key
      Object.keys(obj).forEach(key =>{
    
        let value = obj[key] 
        
        // 给obj的属性key 添加属性监听
        Object.defineProperty(obj,key,{
          set(newValue){
            console.log(`调用了属性:${key}的set方法了, 新值:${newValue}, 旧值: ${value}`); 
            value = newValue;
          },
          get(){
            console.log(`监听到属性:${key}的值被获取了`); 
            return value;
          }
        })
      })
     
    </script>

2. 在javaScript 中实现 发布者/订阅者模式

<script>  
      // 发布者类
      class Dep{
        // 构造器, 当对象调用new 是就会调用
        constructor(name){
          console.log(`Dep 的构造器被调用了`);
    
          // 订阅的服务名
          this.name = name;
          // 记录订阅者
          this.subs = []
        }
    
        // 添加订阅者 (每个订阅者就是一个Watcher对象)
        addSub(watcher){
          this.subs.push(watcher)
        }
    
        // 发布消息
        notify(){
          this.subs.forEach(watcher=>{
            watcher.update(this.name)
          })
        }
      }
    
    
      // 订阅者者类
      class Watcher{ 
        constructor(name){
          this.name = name;
        }
    
        update(source){
          console.log(`Watcher ${this.name} , 收到了来自${source} 的消息更新通知`);
        }
      }
 </script>

2.1 发布者/ 订阅者应用

 <script>
      // 1. 创建发布者
      const dep1 = new Dep('新华日报')
      const dep2 = new Dep('腾讯新闻')
    
      // 2. 创建订阅者者
      const watcher1 = new Watcher('观察者1')
      const watcher2 = new Watcher('观察者2')
      const watcher3 = new Watcher('观察者3')
    
      // 3. 订阅者向发布者订阅消息
      dep1.addSub(watcher1)
      dep1.addSub(watcher2)
      dep1.addSub(watcher3)
    
      dep2.addSub(watcher1)
      dep2.addSub(watcher2)
      dep2.addSub(watcher3)
    
     // 4. 发布者通知订阅者消息
     dep1.nodify()
     
     dep2.notify()
    
    </script>

3. vue 中响应式的大致实现如下:

   <script> 
    
     const obj = {
       name: 'zhangsan',
       age: 18
     }
    
     // 遍历属性的key
     Object.keys(obj).forEach(key =>{
   
       let value = obj[key] 
       
       // 给obj的属性key 添加属性监听
       Object.defineProperty(obj,key,{
         set(newValue){
           console.log(`调用了属性:${key}的set方法了, 新值:${newValue}, 旧值: ${value}`); 
           
           // 找到这个属性的发布者 发布消息, 告诉外面这个服务内容有变化
           // 响应式实现了
           value = newValue;
         },
         get(){
           console.log(`监听到属性:${key}的值被获取了`); 
           
           // 找到这个属性的发布者, 让使用该数据的人订阅这个服务
           
           return value;
         }
       })
     })
    
   </script>

相关文章

  • Vue的响应式浅析

    1 Vue如何实现响应式? Vue的响应式是建立在监听data中的数据. 2 在Vue2中响应式的实现 Vue通过...

  • vue 中响应式的实现思路

    1. javaScript中对象obj的属性的属性值监听 2. 在javaScript 中实现 发布者/订阅者模...

  • 前端面试题【Day02】

    本篇绪论 1,Vue响应式原理 1,Vue响应式原理 在vue实例中声明的数据就是响应式的。响应式:数据发生改变,...

  • mvvm三要素

    1.响应式:修改data属性之后,vue立刻监听到 - vue 如何实现响应式 :Object.definePr...

  • 一步一步实现Vue的响应式-数组观测

    本篇是以一步一步实现Vue的响应式-对象观测为基础,实现Vue中对数组的观测。 数组响应式区别于对象的点 如果是直...

  • vue 中数组和json的响应式

    一. vue 中数组操作的响应式 1. Vue 中javaScript 数组响应式操作的方法 push()方法响应...

  • 【Vue3.0】- 响应式

    响应式原理 响应式是 Vue.js 组件化更新渲染的一个核心机制 Vue2.x响应式实现 Object.defin...

  • Vue中实现响应式

    效果展示 屏幕最大化的展示效果 801px-1200px的展示效果 0-800px的展示效果 解决思路 利用@me...

  • Vue

    vue双向绑定原理及实现从零带你手把手实现Vue3响应式原理-上从零带你手把手实现Vue3响应式原理-下为什么说 ...

  • Vue源码03-响应式原理

    这节将专门讲解vue MVVM响应式处理 Vue采用的是 实现数据的响应式 数据劫持 Observer类 Obse...

网友评论

      本文标题:vue 中响应式的实现思路

      本文链接:https://www.haomeiwen.com/subject/djrvbctx.html