• 技术文章 >web前端 >js教程

    使用Proxy实现双向绑定的方法介绍(代码)

    不言不言2019-03-20 10:08:33转载858
    本篇文章给大家带来的内容是关于使用Proxy实现双向绑定的方法介绍(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    前言:vue3.0要用Proxy来实现双向绑定,因此先来尝试一下实现方法。

    1 Object.defineProperty 实现

    原来vue2的实现使用Object.defineProperty,监听set,但对于数组直接下标给数组设置值监听不了。

    function observe(data) {
      if (!data || typeof data !== 'object') {
          return;
      }
      // 取出所有属性遍历
      Object.keys(data).forEach(function(key) {
          defineReactive(data, key, data[key]);
      });
    };
    function defineReactive(data, key, val) {
      observe(val); // 监听子属性
      Object.defineProperty(data, key, {
          enumerable: true, // 可枚举
          configurable: false, // 不能再重写defineProperty
          get: function() {
              return val;
          },
          set: function(newVal) {
              console.log('-------通知订阅者--------')
              val = newVal;
          }
      });
    }

    2 使用Proxy实现

    使用Proxy实现原理主要是new一个Proxy对象,代理你的data值,需要注意的一点是,对于数组的方法操作来说,会产生两次赋值操作,一次是添加值,一次是改变他的length值,而对于Object.defineProperty监听不到的数组下标给数组设置值,Proxy是可以监听到的。

    function observe(data) {
        if (!data || typeof data !== 'object') {
            return;
        }
        // 取出所有属性遍历
        Object.keys(data).forEach(function(_k) {
            // Proxy不允许绑定在非对象上
            if (data[_k] && typeof data[_k] === 'object') {
                data[_k] = defineReactive(data[_k]);
            }
        });
    }
    
    function defineReactive(data) {
      return new Proxy(data, {
        set(target, key, value, proxy) {
            // 进行数组操作时,会进行两次set 一次数据改变,一次length改变,两次改变data的值是不变,因此不应该多分发一次消息
          if (
            Object.prototype.toString.call(data) === "[object Array]" &&
            key === "length"
          ) {
            Reflect.set(target, key, value, proxy);
            return true;
          }
          observe(data);
          Reflect.set(target, key, value, proxy);
          console.log('-------通知订阅者--------')
          return true;
        }
      });

    本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的JavaScript教程视频栏目!

    以上就是使用Proxy实现双向绑定的方法介绍(代码)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:javascript vue.js
    上一篇:JavaScript函数式编程中代码组合(compose)的理解 下一篇:jQuery unbind方法如何使用

    相关文章推荐

    • Java动态代理(Proxy)的详细解析(附示例)• ES6中Proxy和Reflect的介绍(代码示例)• ES6中defineProperty和proxy的详细介绍(代码示例)• ES6中defineProperty与proxy的详细介绍(代码示例)• JavaScript中Proxy的详细介绍(代码示例)• es6中的Proxy的理解(附示例)• MySQL数据库连接池SMProxy

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网