给 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 没能实现定位。
相关推荐
kyriewen2 小时前
Webpack vs Vite:一个是“老黄牛”,一个是“猎豹”,你选谁?
前端·webpack·vite
打小就很皮...2 小时前
html2canvas + jsPDF 生成 PDF 的踩坑与解决方案总结
前端·pdf
全栈前端老曹3 小时前
【前端地图】多地图平台适配方案——高德、百度、腾讯、Google Maps SDK 差异对比、封装统一地图接口
前端·javascript·百度·dubbo·wgs84·gcj-02·bd09
xiaogg36783 小时前
spring oauth2 单点登录
java·vue.js·spring
雾岛听风6913 小时前
JavaScript基础语法速查手册
开发语言·前端·javascript
遇见~未来3 小时前
第三篇_现代布局_从弹性到网格
前端·css3
前端那点事3 小时前
Vue前端SEO优化全攻略(实操落地版,新手也能上手)
前端·vue.js
Dxy12393102163 小时前
HTML 如何使用 SVG 画曲线
前端·算法·html
用户2367829801683 小时前
从零实现 GIF 制作工具:LZW 压缩与 Median Cut 色彩量化
前端·javascript
hahaha 1hhh3 小时前
中文乱码 ubuntu autodl
linux·运维·前端