STUDY-响应式

简介: STUDY-响应式

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


对象属性响应化处理

// 对象属性响应化处理
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;
      }
    },
  });
}


数组响应化处理

// 数组响应化处理
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;
}


执行统一响应化处理

// 执行统一响应化处理
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

const person = {
  name: "小明",
  age: 18,
  email: ["111@qq.com"],
  address: { city: "bj" },
};
observe(person);
//1. 直接操作对象属性情况
//2. 操作对象嵌套对象情况
//3. 直接赋值对象给属性并读取的情况
//4. 数组7中操作情况



相关文章
|
JSON 前端开发 JavaScript
Vue_Study入门六
Get新知识: promise 的使用promise 为了更好处理异步操作,避免回调嵌套,**Promise **对象用于表示一个异步操作的最终完成 (或失败)及其结果值。 基本使用:实例化 Promise 对象,构造函数中传递函数,该函数用于处理异步任务其中resolve,resject 两个参数用于处理成功和失败两种情况,并通过p.then 获取处理结果如下图示例: Promise 常...
55 0
Vue_Study入门六
|
缓存 JavaScript 数据处理
Vue_Study入门三
Get新知识: vue 表单域修饰符vue 提供了 number trim 和 lazy 三种表单修饰符,其中number 修饰符是将表单标签中的数据转换成数值,默认情况下是 字符串类型的数据,不适合作为计算,转换后更适合计算。trim 修饰符可以去除数据的两端的空格,其中的空格去除不了,需要注意。lazy 修饰符则是将标签默认的 input 事件转换成 change 事件。(input ...
47 0
Vue_Study入门三
|
7月前
|
数据安全/隐私保护 网络架构
若依框架 -------- vue3+element-plus(一)
若依框架 -------- vue3+element-plus(一)
343 1
|
7月前
|
API
若依框架 -------- vue3+element-plus(四)
若依框架 -------- vue3+element-plus(四)
477 1
|
7月前
|
前端开发 JavaScript API
|
JavaScript 开发者
Vue_Study入门五
Get新知识: vue devtools 的安装及简单使用vue devtools 调试工具,相对于浏览器自带的开发者工具对于调试和查看vue 的项目和demo 提供更强大的调试功能,在对数据绑定的检验,标签结构等方面的查看检验调试更方便。 vue 父子组件传值父子组件之间传值,在子组件中使用props 属性接受传值,在使用时子组件时传入在props 中定义的参数名一致的数值。<!DOCT...
46 0
Vue_Study入门五
|
JSON JavaScript 前端开发
Vue_Study入门七
Get新知识: axios 的使用axios 是一个基于promise 的网络请求库,可以用于浏览器和node.js。从node.js中创建http请求支持Promise API拦截请求和响应转换请求数据和响应数据取消请求自动转换JSON数据客户端支持防御XSRF浏览器中创建XMLHttpRequests​ 简单使用<script type="text/javascript" src="....
43 1
Vue_Study入门七
|
7月前
|
前端开发 JavaScript
若依框架 -------- vue3+element-plus(三)
若依框架 -------- vue3+element-plus(三)
247 0
|
7月前
|
JSON API 数据格式
若依框架 -------- vue3+element-plus(二)
若依框架 -------- vue3+element-plus(二)
247 0
|
JavaScript
Vue_Study入门四
Get新知识: vue 过滤器vue 的过滤器可以实现对数据进行指定格式处理后返回数据,实现过滤的效果。过滤器的定义也分全局过滤器 和 局部过滤器,定义方式也和自定义指令的定义的形式类似,一般情况如下全局过滤器:局部过滤器:过滤器的使用。可以使用在 插值表达式 和 属性绑定中,并且支持级联过滤。 vue 生命周期vue 的生命周期一由 挂载, 更新,销毁 三个周期组成。以下是在 vue 生...
48 0
Vue_Study入门四