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中操作情况



相关文章
|
4月前
|
JavaScript
Vue中ref创建_基本类型的响应式数据,在Vue2的年代,数据配在data里,Vue3的区别是不把响应数据写在data里,那个数据是响应式的用ref包一下,let name = ref(“张三“)
Vue中ref创建_基本类型的响应式数据,在Vue2的年代,数据配在data里,Vue3的区别是不把响应数据写在data里,那个数据是响应式的用ref包一下,let name = ref(“张三“)
|
JSON 前端开发 JavaScript
Vue_Study入门六
Get新知识: promise 的使用promise 为了更好处理异步操作,避免回调嵌套,**Promise **对象用于表示一个异步操作的最终完成 (或失败)及其结果值。 基本使用:实例化 Promise 对象,构造函数中传递函数,该函数用于处理异步任务其中resolve,resject 两个参数用于处理成功和失败两种情况,并通过p.then 获取处理结果如下图示例: Promise 常...
51 0
Vue_Study入门六
|
缓存 JavaScript 数据处理
Vue_Study入门三
Get新知识: vue 表单域修饰符vue 提供了 number trim 和 lazy 三种表单修饰符,其中number 修饰符是将表单标签中的数据转换成数值,默认情况下是 字符串类型的数据,不适合作为计算,转换后更适合计算。trim 修饰符可以去除数据的两端的空格,其中的空格去除不了,需要注意。lazy 修饰符则是将标签默认的 input 事件转换成 change 事件。(input ...
45 0
Vue_Study入门三
|
6月前
|
前端开发 JavaScript API
|
JavaScript 开发者
Vue_Study入门五
Get新知识: vue devtools 的安装及简单使用vue devtools 调试工具,相对于浏览器自带的开发者工具对于调试和查看vue 的项目和demo 提供更强大的调试功能,在对数据绑定的检验,标签结构等方面的查看检验调试更方便。 vue 父子组件传值父子组件之间传值,在子组件中使用props 属性接受传值,在使用时子组件时传入在props 中定义的参数名一致的数值。<!DOCT...
43 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="....
38 1
Vue_Study入门七
|
JavaScript 索引
Vue_Study入门二
Get新知识: vue 按键修饰符vue 中不仅可以通过事件来和用户进行交互,也可以同通过键盘按键来交互,使用 v-on:keyup.enter=“xxx” 的格式来为指定的键盘事件指定处理逻辑,一般情况下是对某个具体键盘事件进行专门的处理逻辑,如果不指定具体按键则会是所按键都会出发事件。 vue 自定义按键修饰符通过如下的语句来自定义按键,Vue.config.keyCodes.qaq ...
58 0
Vue_Study入门二
|
JavaScript
Vue_Study入门四
Get新知识: vue 过滤器vue 的过滤器可以实现对数据进行指定格式处理后返回数据,实现过滤的效果。过滤器的定义也分全局过滤器 和 局部过滤器,定义方式也和自定义指令的定义的形式类似,一般情况如下全局过滤器:局部过滤器:过滤器的使用。可以使用在 插值表达式 和 属性绑定中,并且支持级联过滤。 vue 生命周期vue 的生命周期一由 挂载, 更新,销毁 三个周期组成。以下是在 vue 生...
45 0
Vue_Study入门四
|
JavaScript 安全
Vue_Study入门一
Get新知识: vue 的基本使用步骤需要提供标签用于填充数据引入vue.js 库文件可以使用vue 的语法做功能实现将vue 提供的数据填充标签中入门案例:插值表达式的简单使用。形如 {{ xxx }}<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Comp...
68 0
|
前端开发
前端项目实战壹佰壹拾伍react-admin+material ui-react-admin之SimpleList简单使用
前端项目实战壹佰壹拾伍react-admin+material ui-react-admin之SimpleList简单使用
44 0