最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

vue使用Proxy实现双向绑定的方法示例

来源:懂视网 责编:小采 时间:2020-11-27 21:59:45
文档

vue使用Proxy实现双向绑定的方法示例

vue使用Proxy实现双向绑定的方法示例:前言:vue3.0要用Proxy来实现双向绑定,因此先来尝试一下实现方法。 1 Object.defineProperty 实现 原来vue2的实现使用Object.defineProperty,监听set,但对于数组直接下标给数组设置值监听不了。 function observe(data) { i
推荐度:
导读vue使用Proxy实现双向绑定的方法示例:前言:vue3.0要用Proxy来实现双向绑定,因此先来尝试一下实现方法。 1 Object.defineProperty 实现 原来vue2的实现使用Object.defineProperty,监听set,但对于数组直接下标给数组设置值监听不了。 function observe(data) { i

前言: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;
 }
 });

文档

vue使用Proxy实现双向绑定的方法示例

vue使用Proxy实现双向绑定的方法示例:前言:vue3.0要用Proxy来实现双向绑定,因此先来尝试一下实现方法。 1 Object.defineProperty 实现 原来vue2的实现使用Object.defineProperty,监听set,但对于数组直接下标给数组设置值监听不了。 function observe(data) { i
推荐度:
标签: VUE 的方式 的方
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top