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


本文摘自PHP中文网,作者不言,侵删。

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

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

1 Object.defineProperty 实现

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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是可以监听到的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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实现双向绑定的方法介绍(代码)的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

javascript类的定义方法有哪些

vue.js有几种安装方式

javascript中数组去重的5种方法是什么

c和javascript的区别是什么

vue.js的ul-li标签仿select标签

javascript数组去重复的方法

dom节点和元素之间有什么区别

javascript怎么设置cookie

javascript代码有几种使用方式

javascript获取日期的方法是什么

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...