iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue3响应式原理和api编写的方法是什么
  • 431
分享到

vue3响应式原理和api编写的方法是什么

2023-06-22 01:06:19 431人浏览 八月长安
摘要

这篇文章主要讲解了“vue3响应式原理和api编写的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3响应式原理和api编写的方法是什么”吧!前言vue3响应式原理加api编写

这篇文章主要讲解了“vue3响应式原理和api编写的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3响应式原理和api编写的方法是什么”吧!

前言

vue3响应式原理加api编写,快速明白vue3响应式原理

vue3响应式原理实现

先写一段代码看下

实现effect

var name = 'sl', age = 22;effect1 = () => `我叫${name},今年${age}岁`effect2 = () => `我叫${name},今年${age+1}岁`console.log(effect1()) //我叫sl,今年22岁console.log(effect2()) //我叫sl,今年23岁age = 30;console.log(effect1())  //我叫sl,今年30岁console.log(effect2())  //我叫sl,今年31岁

看看有什么可以优化的点呢?

首先:多个函数,在age发生变化后需要手动再次调用多个函数才可以获取最新信息

期望可以修改信息以后自动调用多个函数

如何实现呢

可以想到将多个函数存放到一起存放到gather函数,并且让age发生变化时可以将多个函数调用trigger调用

实现gather及trigger

var name = "sl",  age = 22;var tom, joy;effect1 = () => (tom = `我叫${name},今年${age}岁`);effect2 = () => (joy = `我叫${name},今年${age + 1}岁`);var dep = new Set();function gather() {  dep.add(effect1);  dep.add(effect2);}function trigger() {  dep.forEach((effect) => effect());}gather();effect1()effect2()console.log(tom); //我叫sl,今年22岁console.log(joy); //我叫sl,今年23岁age = 30;trigger()console.log(tom); //我叫sl,今年30岁console.log(joy); //我叫sl,今年31岁

再继续看下还是有什么可以优化的点

如果变量是一个对象或多个对象的话该怎么处理呢

  • 变量为原始类型时Set存储

  • 变量为对象时可以用map存储

  • 多个对象时用weakMap存储

var obj1 = { name: "tom", age: 22 };var obj2 = { name: "joy", age: 23 };var tom, joy;effect1 = () => (tom = `我叫${obj1.name},今年${obj1.age}岁`);effect2 = () => (joy = `我叫${obj2.name},今年${obj2.age}岁`);var depsMap = new WeakMap();function gather(target, key) {  let depMap = depsMap.get(target);  if (!depMap) {    depsMap.set(target, (depMap = new Map()));  }  let dep = depMap.get(key);  if (!dep) {    depMap.set(key, (dep = new Set()));  }  if (target === obj1) {    dep.add(effect1);  } else {    dep.add(effect2);  }}function trigger(target, key) {  let depMap = depsMap.get(target);  if (depMap) {    const dep = depMap.get(key);    if (dep) {      dep.forEach((effect) => effect());    }  }}gather(obj1, "age");//收集依赖gather(obj2, "age");//收集依赖effect1();effect2();console.log(tom); //我叫sl,今年22岁console.log(joy); //我叫sl,今年23岁obj1.age = 30;obj2.age = 10;trigger(obj1, "age");trigger(obj2, "age");console.log(tom); //我叫sl,今年30岁console.log(joy); //我叫sl,今年31岁

在继续看看有哪些可以优化的点

上边依赖的收集gather以及函数的更新通知trigger每次都是手动收集手动触发更新,那有什么方法可以自动收集及触发吗

Proxy

实现reactive

先写一个Reactive函数

function reactive(target) {  const handle = {    set(target, key, value, receiver) {      Reflect.set(target, key, value, receiver);      trigger(receiver,key) // 设置值时触发自动更新    },    get(target, key, receiver) {      gather(receiver, key); // 访问时收集依赖      return Reflect.get(target, key, receiver);    },  };  return new Proxy(target, handle);}

然后将reactive函数应用到之前代码

var obj1 = reactive({ name: "tom", age: 22 });var obj2 = reactive({ name: "joy", age: 23 });var tom, joy;effect1 = () => (tom = `我叫${obj1.name},今年${obj1.age}岁`);effect2 = () => (joy = `我叫${obj2.name},今年${obj2.age}岁`);var depsMap = new WeakMap();function gather(target, key) {  let depMap = depsMap.get(target);  if (!depMap) {    depsMap.set(target, (depMap = new Map()));  }  let dep = depMap.get(key);  if (!dep) {    depMap.set(key, (dep = new Set()));  }  if (target === obj1) {    dep.add(effect1);  } else {    dep.add(effect2);  }}function trigger(target, key) {  let depMap = depsMap.get(target);  if (depMap) {    const dep = depMap.get(key);    if (dep) {      dep.forEach((effect) => effect());    }  }}effect1();effect2();console.log(tom); //我叫sl,今年22岁console.log(joy); //我叫sl,今年23岁obj1.age = 30;obj2.age = 10;console.log(tom); //我叫sl,今年30岁console.log(joy); //我叫sl,今年31岁

然后还有个问题,就是gather函数中有写死dep添加函数

如何解决呢 重写effect函数

let activeEffect = nullfunction effect(fn) {  activeEffect = fn;  activeEffect();  activeEffect = null; // 执行后立马变成null}var depsMap = new WeakMap();function gather(target, key) {  // 避免例如console.log(obj1.name)而触发gather  if (!activeEffect) return;  let depMap = depsMap.get(target);  if (!depMap) {    depsMap.set(target, (depMap = new Map()));  }  let dep = depMap.get(key);  if (!dep) {    depMap.set(key, (dep = new Set()));  }  dep.add(activeEffect) //将函数添加到依赖}effect(effect1);effect(effect2);

reactive也已经实现了,那么还有ref也实现下

ref

在vue3中ref怎么使用呢

var name = ref('tom')console.log(name.value) // tom

需要使用.value的方式获取值

function ref(name){    return reactive(        {            value: name        }    )}const name = ref('tom');console.log(name.value) //tom

完整代码

var activeEffect = null;function effect(fn) {  activeEffect = fn;  activeEffect();  activeEffect = null; }var depsMap = new WeakMap();function gather(target, key) {  // 避免例如console.log(obj1.name)而触发gather  if (!activeEffect) return;  let depMap = depsMap.get(target);  if (!depMap) {    depsMap.set(target, (depMap = new Map()));  }  let dep = depMap.get(key);  if (!dep) {    depMap.set(key, (dep = new Set()));  }  dep.add(activeEffect)}function trigger(target, key) {  let depMap = depsMap.get(target);  if (depMap) {    const dep = depMap.get(key);    if (dep) {      dep.forEach((effect) => effect());    }  }}function reactive(target) {  const handle = {    set(target, key, value, receiver) {      Reflect.set(target, key, value, receiver);      trigger(receiver, key); // 设置值时触发自动更新    },    get(target, key, receiver) {      gather(receiver, key); // 访问时收集依赖      return Reflect.get(target, key, receiver);    },  };  return new Proxy(target, handle);}function ref(name){    return reactive(        {            value: name        }    )}

感谢各位的阅读,以上就是“vue3响应式原理和api编写的方法是什么”的内容了,经过本文的学习后,相信大家对vue3响应式原理和api编写的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: vue3响应式原理和api编写的方法是什么

本文链接: https://www.lsjlt.com/news/301718.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue3响应式原理和api编写的方法是什么
    这篇文章主要讲解了“vue3响应式原理和api编写的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue3响应式原理和api编写的方法是什么”吧!前言vue3响应式原理加api编写...
    99+
    2023-06-22
  • Vue3的响应式原理是什么
    ProxyProxy这个核心API被Vue3的响应式原理所依赖,利用Proxy可以拦截一些对象操作。const obj = { a: 1 }; const p = new Proxy(obj, { get(target, propert...
    99+
    2023-05-24
    Vue3
  • Vue2/Vue3的响应式原理是什么
    本篇内容主要讲解“Vue2/Vue3的响应式原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue2/Vue3的响应式原理是什么”吧!在讲解之前,我们先了解一下数据响应式是什么?所谓数据...
    99+
    2023-07-05
  • Vue3 Reactive响应式原理是什么
    一、怎么实现变量变化怎么实现变量变化,相关依赖的结果也跟着变化 当原本price=5变为price=20后total应该变为40,但是实际total并不会改变。 解决办法可以这样,当变量改变了,重新计算一次,那么结果就会改变为最新的结果。如...
    99+
    2023-05-21
    Vue3 reactive
  • Vue3中响应式的特殊处理方法是什么
    本篇内容介绍了“Vue3中响应式的特殊处理方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue2 vs vue3两个响应式更新的核...
    99+
    2023-07-06
  • vue3响应式实现readonly的方法是什么
    readonly的实现it("happy path", () => { console.warn = vi.fn(); const original = { foo: 1, };...
    99+
    2023-05-21
    Vue3 readonly
  • Vue的响应式原理是什么
    本篇内容介绍了“Vue的响应式原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Depvar Dep = ...
    99+
    2023-06-20
  • Vue3中的ref和reactive响应式原理解析
    目录1 ref2 isref判断是不是一个ref对象3 shallowref创建一个跟踪自身.value变化的 ref,但不会使其值也变成响应式的4 triggerRef5 cust...
    99+
    2022-11-13
    Vue3 ref和reactive响应式 Vue3 ref和reactive
  • vue响应式原理是什么
    Vue 的响应式原理是通过数据劫持(Object.defineProperty)实现的,其核心思想是将数据模型和视图模型进行双向绑定...
    99+
    2023-05-13
    vue响应式原理 vue
  • Vue.js中响应式的原理是什么
    今天就跟大家聊聊有关Vue.js中响应式的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。关于Vue.jsVue.js是一款MVVM框架,上...
    99+
    2024-04-02
  • Vue中响应式原理是什么
    这篇文章主要介绍“Vue中响应式原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中响应式原理是什么”文章能帮助大家解决问题。响应式在日常开发中的应用是很常见的,这里举个简单的例子:le...
    99+
    2023-07-05
  • vue2.0/3.0中响应式的原理是什么
    本篇文章为大家展示了vue2.0/3.0中响应式的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。vue是什么Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框...
    99+
    2023-06-15
  • vue3 reactive响应式依赖收集派发更新原理是什么
    proxyvue3已经从Object.property更换成Proxy,Proxy相比于前者可以直接监听对象数组,对于深层次的对象和数组,会把触发对应getter,然后去递归进行依赖收集,并不是直接像vue2暴力那样递归,总体而言性能更好对...
    99+
    2023-05-16
    Vue3 reactive
  • vue3.0响应式函数原理是什么
    这篇文章将为大家详细讲解有关vue3.0响应式函数原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言:Vue3重写了响应式系统,和Vue2相比底层采用Proxy对象实现,在初始化的时候不需要遍历...
    99+
    2023-06-29
  • Vue数据响应式原理是什么
    本文小编为大家详细介绍“Vue数据响应式原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue数据响应式原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。响应式是什么简而言之就是数据变页面变如何实...
    99+
    2023-06-30
  • vue处理响应式数据的方法是什么
    这篇“vue处理响应式数据的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue处理响应式数据的方法是什么”文章吧...
    99+
    2023-07-05
  • Vue.js中实现响应式的原理是什么
    Vue.js中实现响应式的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Vue.js 响应式的使用现在有个很简单的需求,点击页面...
    99+
    2024-04-02
  • Vue 中数据响应式的原理是什么
    Vue 中数据响应式的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。改造数据我们先来尝试写一个函数,用于改造对象:为什么要先写这个函...
    99+
    2024-04-02
  • Vue响应式流程及原理是什么
    本文小编为大家详细介绍“Vue响应式流程及原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue响应式流程及原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、组件化流程1. 整个new Vue...
    99+
    2023-07-02
  • Vue 3中响应式的实现原理是什么
    本篇文章给大家分享的是有关Vue 3中响应式的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 实现响应式响应基本类型变量首先...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作