给 Pinia 加一个定位代码的功能(支持 reactive)

pinia 的 timeline 很好很强大,只是到目前为止没有发现有定位的功能,就是说,如果状态发生异常变更的时候,如何快速找到,到底是哪一行代码触发的变更?

watch + error 定位代码

定位代码可以使用 Error 的方式来获得,那么这个Error放在哪里呢?

因为 pinia 的 store 本身就是一个 reactive,所以可以用 watch,不过不是在第二个参数,而是第三个参数的 onTrigger() 。

我们写一个函数(按照"流行"的说法,我们封装一个hooks。)

js 复制代码
import { watch } from 'vue'

export default (store: any) => {
  watch(store, (v) => {},
  {
    onTrigger(event) {
      const err = new Error('记录调用函数')
      console.log('err:', err)
      console.log('onTrigger--event:', event)
    },
  })
}

函数需要传入一个 store,然后用 watch 进行监听,在 onTrigger 里面设置 Error(),用来记录调用的函数,然后打印出来就可以定位了,比如这样:

event 可以记录type、key、value等信息。

js 复制代码
onTrigger--event: {type: "set", key: "name", newValue: "aa", ...}

这样哪个状态出问题就 watch 哪个,然后定位代码,就可以很快找到位置了。

适用范围

pinia 的状态有多种变更方式,每一种都可以吗?让我们挨个测试一遍:

方式 序号(从0开始) 是否可行
直接改属性 6 可以
action 8 只能定位到定义的位置
$state - 好像差一行
$patch 6 可以
$reset 8 可以

在 template 里面也是一样的效果。

三种情况有效:直接改属性、 <math xmlns="http://www.w3.org/1998/Math/MathML"> p a t c h 、 patch、 </math>patch、reset()。

state 内部调用 patch,调用的太深,Error()只有十条记录,超出范围,暂时没有找到办法。

action 的定位方法

action 也比较深,如果想定位的话,可以使用 $onAction(),在里面设置 Error。

代码调整如下:

js 复制代码
export default (store: any) => {
  let isAction = false
  watch(store, (v) => {},
  {
    onTrigger(event) {
      if (!isAction) {
        const err = new Error('记录调用函数')
        console.log('err:', err)
        console.log('onTrigger--event:', event)
      }
    },
  })

  store.$onAction((e: any) => {
    console.log('action 的参数:', e.args)
    const err = new Error('记录调用函数--onAction')
    console.log('err:', err)
    isAction = true
    e.after(() => {
      isAction = false
    })
  })
}

这样就可以了。

setup 的方式是否支持?

上面是 option 的方式,那么 setup 是否有效呢?还是老规矩,测试一下。

经过测试,结果也是一样的,都支持。只是 $reset() 不支持 setup 方式。

小结

优点:

  • 侵入性小,不影响代码
  • onTrigger 只在 开发模式有效,生产模式无效

缺点:

  • 比较简单粗暴,没有优化。
  • $state 没能实现定位。
相关推荐
艾小码几秒前
Vue开发三年,我才发现依赖注入的TypeScript正确打开方式
前端·javascript·vue.js
Evan Wang1 小时前
深度解析GetX依赖注入,从Spring与Vue视角看Flutter架构
vue.js·spring boot·flutter
veneno8 小时前
大量异步并发请求控制并发解决方案
前端
i***t9198 小时前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
oden8 小时前
2025博客框架选择指南:Hugo、Astro、Hexo该选哪个?
前端·html
小光学长9 小时前
基于ssm的宠物交易系统的设计与实现850mb48h(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·前端·数据库
小小前端要继续努力9 小时前
渐进增强、优雅降级及现代Web开发技术详解
前端
老前端的功夫10 小时前
前端技术选型的理性之道:构建可量化的ROI评估模型
前端·javascript·人工智能·ubuntu·前端框架
汝生淮南吾在北10 小时前
SpringBoot+Vue超市收银管理系统
vue.js·spring boot·后端
狮子座的男孩10 小时前
js函数高级:04、详解执行上下文与执行上下文栈(变量提升与函数提升、执行上下文、执行上下文栈)及相关面试题
前端·javascript·经验分享·变量提升与函数提升·执行上下文·执行上下文栈·相关面试题