前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STUDY-响应式

STUDY-响应式

作者头像
前端小鑫同学
发布2022-12-24 11:04:22
4840
发布2022-12-24 11:04:22
举报

响应化是MVVM模式中的一个重要组成部分,对数据的操作有了响应才有下一步根据响应做对应操作的机会

对象属性响应化处理

代码语言:javascript
复制
// 对象属性响应化处理
function reactiveObject(obj, key, val) {
  // 对象的值也是对象的情况进行递归操作
  observe(val);
  Object.defineProperty(obj, key, {
    get() {
      console.log("get 属性: ", key, " 值: ", val);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        // 直接赋值对象的情况需要重新响应化处理
        observe(newVal);
        console.log("set 属性: ", key, " 值: ", newVal);
        newVal = val;
      }
    },
  });
}

数组响应化处理

代码语言:javascript
复制
// 数组响应化处理
function reactiveArray() {
  // 获取原始数组原型
  const orgArrayProto = Array.prototype;
  // 备份数组原型并重写方法
  const reactiveArrayProto = Object.create(orgArrayProto);
  ["push", "pop", "shift", "unshift", "splice", "sort", "reverse"].forEach(
    (method) => {
      reactiveArrayProto[method] = function() {
        // 执行数组原始方法
        orgArrayProto[method].apply(this, arguments);
        // 触发变更通知
        console.log("数组操作: method: ", method, " arguments: ", arguments);
      };
    }
  );
  return reactiveArrayProto;
}

执行统一响应化处理

代码语言:javascript
复制
// 执行统一响应化处理
function observe(obj) {
  if (typeof obj !== "object" || obj == null) {
    return;
  }
  if (Array.isArray(obj)) {
    //执行数组响应化
    //覆盖array原型
    obj.__proto__ = reactiveArray();
    for (let i = 0; i < obj.length; i++) {
      observe(obj[i]);
    }
  } else {
    //执行对象响应化(循环遍历将每个属性都进行响应化)
    Object.keys(obj).forEach((key) => reactiveObject(obj, key, obj[key]));
  }
}

TEST

代码语言:javascript
复制
const person = {
  name: "小明",
  age: 18,
  email: ["111@qq.com"],
  address: { city: "bj" },
};

observe(person);
//1. 直接操作对象属性情况
//2. 操作对象嵌套对象情况
//3. 直接赋值对象给属性并读取的情况
//4. 数组7中操作情况
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对象属性响应化处理
  • 数组响应化处理
  • 执行统一响应化处理
  • TEST
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档