IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue2、Vue3响应式数据原理实现(双向绑定) -> 正文阅读

[JavaScript知识库]Vue2、Vue3响应式数据原理实现(双向绑定)

Vue2

let obj = {
        name: "张三",
        age: 22,
      };
      let obj = {};
      Object.defineProperty(obj, "name", {
        enumerable: true,
        configurable: true,
        get() {
          return obj.name;
        },
        set(value) {
          obj.name = value;
          console.log("val的值已经发生变化了" + val);
        },
      });

Vue3

<script>
export default {
  setup() {
    // ref和reactive底层实现
    // reactive
    function reactive(obj) {
      // 首先判断obj的类型
      if (typeof obj === "object") {
        if (obj instanceof Array) {
          // 如果是数组那么取出数组中的每一个元素,判断每一个元素是否又是对象,如果是对象也需要包装成Proxy
          obj.forEach((item) => {
            if (typeof (item, index) === "object") {
              item[index] = reactive(item);
            }
          });
        } else {
          // 如若是对象 取出对象中的每一个值 判断对象的属性的值是否又是对象,如果是也需要包装成Proxy
          for (let key in obj) {
            if (typeof obj[key] === "object") {
              obj[key] = reactive(obj[key]);
            }
          }
        }
      } else {
        console.warn(`您传入的内容: ${obj}不是一个对象`);
      }
      return new Proxy(obj, {
        //target 代表传入的obj对象
        get(target, key) {
          console.log(`有人读取了obj身上的${key},我要去更新界面了`);
          return target[key];
        },
        set(target, key, value) {
          console.log( `有人改变了obj身上的${key},我要去更新界面了`);
          target[key] = value;
          return true; // 表示当前操作成功 继续执行下一步
        },
        deleteProperty(target,key){
          console.log(`有人删除了obj身上的${key},我要去更新界面了`);
          return delete target[key];
        },
      });
    }

    // ref
    function ref(val) {
      return reactive({ value: val });
    }

    let obj1 = {
      name1: "a",
      age: 18,
      children: {
        name2: "aa",
        age: 19,
        children: {
          name3: "aaa",
          age: 20,
        },
      },
    };
    let obj2 = {
      name: "du",
    };
    let state = reactive(obj1);
    let state2 = reactive(obj2);
    state2.name = "zhang";
    delete state.name

    state.name1 = "b";
    state.children.name2 = "bb";
    state.children.children.nae3 = "bbb";

    console.log(state);
    console.log(state2);
  },
};
</script>

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:09:16  更:2021-08-09 10:09:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 8:04:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码