Vue.js设计与实现无限递归学习总结

 更新时间:2023年05月31日 14:54:33   作者:玛拉_以琳  
这篇文章主要为大家介绍了Vue.js设计与实现无限递归学习总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

栈溢出

const data = { foo: 1 }
const obj = new Proxy(data, {/*...*/})
effect(() => obj.foo = obj.foo + 1)

此项操作会引起栈溢出:

Uncaught RangeError: Maximum call sack size exceeded

在此操作中, 会先读取obj.foo的值, 这会触发track操作, 将副作用函数入栈, 此时有加一并赋值, 此时会触发trigger操作, 将副作用函数出栈并执行, 在这种情况下, 该副作用函数还在执行中, 又开始下一次的执行, 导致无限递归调用自己导致栈溢出报错.

在这个操作中读取与设置的是同一个副作用函数activeEffect, 因此在trigger要触发时添加条件: 如果trigger触发的副作用函数与当前执行的副作用函数相同, 则不触发执行:

function trigger (target, key) {
    const depsMap = bucket.get(target)
    if (!depsMap) return
    const effects = depsMap.get(key)
    const effectsToRun = new Set()
    effects && effects.forEach(effectFn => {
        if (effectFn !== activeEffect) {
            effectsToRun.add(effectFn)
        }
    })
    effectsToRun.forEach(effectFn => effectFn())
}

目前为止响应式完整代码

// 储存副作用函数的桶
  const bucket = new WeakMap()
  // 用于储存被注册的副作用的函数
  let activeEffect = undefined
  // 副作用函数栈
  const effectStack = []
  function cleanup (effectFn) {
    for (let itme of effectFn.deps) {
      itme.delete(effectFn)
    }
    effectFn.deps.length = []
  }
  function effect (fn) {
    const effectFn = () => {
        cleanup(effectFn)
        // 调用当前的副作用函数时, 赋值给 全局变量
        activeEffect = effectFn
        // 在调用副作用函数之前将该函数压入栈
        effectStack.push(effectFn)
        fn()

以上就是Vue.js设计与实现无限递归学习总结的详细内容,更多关于Vue.js无限递归的资料请关注脚本之家其它相关文章!

相关文章

  • Vue3请求拦截器里如何配置token

    Vue3请求拦截器里如何配置token

    这篇文章主要介绍了Vue3请求拦截器里如何配置token,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • vue中scss语法的使用你了解吗

    vue中scss语法的使用你了解吗

    这篇文章主要为大家详细介绍了vue中scss语法的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • vue.js实现带日期星期的数字时钟功能示例

    vue.js实现带日期星期的数字时钟功能示例

    这篇文章主要介绍了vue.js实现带日期星期的数字时钟功能,涉及vue.js基于定时器的日期时间运算与数值操作相关使用技巧,需要的朋友可以参考下
    2018-08-08
  • 在vue中使用vant TreeSelect分类选择组件操作

    在vue中使用vant TreeSelect分类选择组件操作

    这篇文章主要介绍了在vue中使用vant TreeSelect分类选择组件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 在vant 中使用cell组件 定义图标该图片和位置操作

    在vant 中使用cell组件 定义图标该图片和位置操作

    这篇文章主要介绍了在vant 中使用cell组件 定义图标该图片和位置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Vue开发配置tsconfig.json文件的实现

    Vue开发配置tsconfig.json文件的实现

    tsconfig.json文件中指定了用来编译这个项目的根文件和编译选项,本文就来介绍一下Vue开发配置tsconfig.json文件的实现,感兴趣的可以了解一下
    2023-08-08
  • Vue uni-app框架实现上拉加载下拉刷新功能

    Vue uni-app框架实现上拉加载下拉刷新功能

    uni-app是一个使用Vue.js(opens new window)开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台
    2022-09-09
  • Vue源码学习defineProperty响应式数据原理实现

    Vue源码学习defineProperty响应式数据原理实现

    这篇文章主要为大家介绍了Vue源码学习defineProperty响应式数据原理实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Vue.js 使用AntV X6的示例步骤

    Vue.js 使用AntV X6的示例步骤

    X6 是 AntV 旗下的图编辑引擎,提供了一系列开箱即用的交互组件和简单易用的节点定制能力,方便我们快速搭建流程图、DAG 图、ER 图等图应用。接下来就看看vue如何使用它
    2021-05-05
  • 在 Typescript 中使用可被复用的 Vue Mixin功能

    在 Typescript 中使用可被复用的 Vue Mixin功能

    这篇文章主要介绍了在 Typescript 中使用可被复用的 Vue Mixin功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04

最新评论