vue 方法获取返回值_带你了解 vue-next(Vue 3.0)之 炉火纯青「实践」

本文深入探讨Vue 3.0的响应式系统,解析reactive、effect和ref的实现,通过实践案例展示Proxy在响应式中的应用,并介绍如何构建一个极简的响应式系统。同时推荐了一系列Vue学习资料。
摘要由CSDN通过智能技术生成
1b933d7d14b279ab0ea649fe2ae93330.png

作者:大转转FE

转发链接:https://mp.weixin.qq.com/s/Jb5NKXNhlb1Enq0R1p9DcA

看完上两章 初入茅庐 小试牛刀 之后,大家应该对vue-next(Vue 3.0) 的 API 使用已经了如指掌了。好奇的同学一定对 vue-next 响应式的原理充满好奇,本章就带你解密!

带你了解 vue-next(Vue 3.0)之 初入茅庐【实践】

带你了解 vue-next(Vue 3.0)之 小试牛刀【实践】

前言

最新 vue-next 的源码发布了,虽然是 pre-alpha 版本,但这时候其实是阅读源码的比较好的时机。在 vue 中,比较重要的东西当然要数它的响应式系统,在之前的版本中,已经有若干篇文章对它的响应式原理和实现进行了介绍,这里就不赘述了。在 vue-next 中,其实现原理和之前还是相同的,即通过观察者模式和数据劫持,只不过对其实现方式进行了改变。

因此,这篇文章我也打算按这种风格来写一下利用最近空闲时间阅读 vue-next 响应式模块的源码的一些心得与体会,算是抛砖引玉,同时实现一个极简的响应式系统。

如有错误,还望指正。

vue-next 数据响应机制 - Proxy

在学习 vue-next之前,你必须要先熟练掌握ES6中的 Proxy、 Reflect 及 ES6中为我们提供的 Map、 Set两种数据结构

先应用再说原理:

const { reactive, effect} = Vuelet p = reactive({name:'zhuanzhuan'});// effect方法会立即被触发effect(()=>{     console.log(p.name);})p.name = '转转'; // 修改属性后会再次触发effect方法

源码是采用 ts编写,为了便于大家理解原理,这里我们采用js来从0编写,之后再看源码就非常的轻松啦!

reactive方法实现

看源码

function reactive(target) {     // if trying to observe a readonly proxy, return the readonly version.       if (readonlyToRaw.has(target)) {    return target;       }      // target is explicitly marked as readonly by user       if (readonlyValues.has(target)) {          return readonly(target);   }       return createReactiveObject(      target,      rawToReactive,     reactiveToRaw,     mutableHandlers,    mutableCollectionHandlers   );  }function createReactiveObject(  target,     toProxy,     toRaw,     baseHandlers,     collectionHandlers    ) {      if (!isObject(target)) {          {              console.warn(`value cannot be made reactive: ${String(target)}`);          }          return target;      }      // target already has corresponding Proxy      let observed = toProxy.get(target);      if (observed !== void 0) {          return observed;      }      // target is already a Proxy      if (toRaw.has(target)) {          return target;      }      // only a whitelist of value types can be observed.      if (!canObserve(target)) {          return target;      }      const handlers = collectionTypes.has(target.constructor)          ? collectionHandlers          : baseHandlers;      observed = new Proxy(target, handlers);      toProxy.set(target, observed);      toRaw.set(observed, target);      return observed;  }

稍微精简下

function reactive(target) {    const handlers = collectionTypes.has(target.constructor)   ? collectionHandlers    : baseHandlers     observed = new Proxy(target, handlers)     return observed}
const collectionTypes = new Set([Set, Map, WeakMap, WeakSet]);

基本上除了 Set, Map, WeakMap, WeakSet,都是 baseHandlers。

baseHandlers实现:

function createGetter(isReadonly, shallow = false) {    return function get(target, key, receiver) {       const res = Reflect.get(target, key, receiver);      if (isSymbol(key) && builtInSymbols.has(key)) {        return res;      }            if (shallow) {         track(target, "get" /* GET */, key);        // TODO strict mode that returns a shallow-readonly version of the value               return res;           }             if (isRef(res)) {          return res.value;       }             track(target, "get" /* GET */, key);         return isObject(res)                 ? isReadonly                     // need to lazy access readonly and reactive here to avoid                      // circular dependency                      readonly(res)                  : reactive(res)              : res;      };  }

返回值如果是 object,就再走一次 reactive,实现深度


下面我们自己写个案例,通过proxy 自定义获取、增加、删除等行为

function reactive(target){     // 创建响应式对象      return createReactiveObject(target);}function isObject(target){       return typeof target === 'objec
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue-i18n是一个用于Vue.js的国际化插件,用于实现网站或应用程序的多语言支持。它提供了一种简单的方式来管理和切换不同语言的文本内容。关于Vue-i18n在Vue 3.0中的使用,有几点需要注意: 1. 需要下载最新版的vue-i18n插件。你可以通过以下命令来安装最新版本的vue-i18n: `npm install vue-i18n@next` 或 `yarn add vue-i18n@next`。 [2] 2. 在你的`index.js`文件中,你需要导入`createI18n`函数和语言库文件。语言库文件是包含不同语言文本的文件,可以根据需要自行创建。你可以根据以下代码示例来配置i18n实例:<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue3.0中使用i18n插件来实现国际化以及切换语言所遇到问题得解决](https://blog.csdn.net/qq_43574079/article/details/112473914)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue3.0配置vue-i18n](https://blog.csdn.net/qq_43485006/article/details/120034213)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值