vue renderTracked和renderTriggered有什么使用场景和用法?

vue renderTracked和renderTriggered有什么使用场景和用法?
https://cn.vuejs.org/api/options-lifecycle.html#rendertracked

具体来说,比如:
type DebuggerEvent = {
effect: ReactiveEffect
target: object
type: TrackOpTypes / 'get' | 'has' | 'iterate' /
key: any
}
type DebuggerEvent = {
effect: ReactiveEffect
target: object
type: TriggerOpTypes / 'set' | 'add' | 'delete' | 'clear' /
key: any
newValue?: any
oldValue?: any
oldTarget?: Map<any, any> | Set<any>
}

get has iterate set add delete clear分别是什么意思
oldTarget是什么意思

阅读 1k
avatarAI BotBETA

renderTrackedrenderTriggered 是 Vue.js 中生命周期钩子的函数,它们用于跟踪和触发渲染相关的操作。

  • renderTracked:该钩子在每次渲染过程中被跟踪。它应该返回一个对象,该对象包含一个或多个可以被用于优化渲染性能的属性。如果返回的对象发生变化,Vue 将停止追踪。
  • renderTriggered:该钩子在每次渲染过程中被触发。它应该返回一个对象,该对象包含一个或多个可以被用于优化渲染性能的属性。如果返回的对象发生变化,Vue 将重新触发渲染。

这两个钩子的使用场景如下:

  • 当你在组件内部使用复杂的计算或者处理大量数据时,可以考虑使用 renderTrackedrenderTriggered 来优化渲染性能。如果这些操作的结果在渲染过程中发生变化,你可以使用这两个钩子来通知 Vue 进行相应的优化。
  • 如果你在组件中使用了第三方库或者插件,这些库或者插件可能会在渲染过程中产生副作用。在这种情况下,你可以使用 renderTrackedrenderTriggered 来跟踪和触发这些副作用的产生,从而更好地控制渲染过程。

使用这两个钩子的方法如下:

  • 在组件的选项中使用 renderTrackedrenderTriggered 钩子,并返回需要优化的属性对象。
  • 在返回的属性对象中,你可以包含任何有效的 JavaScript 对象,例如数字、字符串、数组等。只要这些属性的值在渲染过程中发生变化,Vue 就会自动进行优化。

需要注意的是,renderTrackedrenderTriggered 钩子的返回值必须是对象类型,否则将无法正常工作。此外,这两个钩子的使用应该谨慎,因为过度使用它们可能会导致代码难以理解和维护。

2 个回答

image.png

然后得到答案:

image.png

没人说一下场景,那我来研究一下这个DebuggerEvent参数里边具体是什么意思


export const onRenderTriggered = createHook<DebuggerHook>(
LifecycleHooks.RENDER_TRIGGERED //即'rtg'
)
export const onRenderTracked = createHook<DebuggerHook>(
LifecycleHooks.RENDER_TRACKED //即'rtc'
)
https://github.com/vuejs/core/blob/1c525f75a3d17a6356d5f66765623c0ae7c0ebcc/packages/runtime-core/src/apiLifecycle.ts#L85
这里注入钩子


https://github.com/vuejs/core/blob/1c525f75a3d17a6356d5f66765623c0ae7c0ebcc/packages/runtime-core/src/enums.ts#L13

export const enum LifecycleHooks {
  BEFORE_CREATE = 'bc',
  CREATED = 'c',
  BEFORE_MOUNT = 'bm',
  MOUNTED = 'm',
  BEFORE_UPDATE = 'bu',
  UPDATED = 'u',
  BEFORE_UNMOUNT = 'bum',
  UNMOUNTED = 'um',
  DEACTIVATED = 'da',
  ACTIVATED = 'a',
  RENDER_TRIGGERED = 'rtg',
  RENDER_TRACKED = 'rtc',
  ERROR_CAPTURED = 'ec',
  SERVER_PREFETCH = 'sp'
}

然后在https://github.com/vuejs/core/blob/1c525f75a3d17a6356d5f66765623c0ae7c0ebcc/packages/runtime-core/src/renderer.ts#L1559
setupRenderEffect函数里

// create reactive effect for rendering
const effect = (instance.effect = new **ReactiveEffect**(
  componentUpdateFn,
  () => queueJob(update),
  instance.scope // track it in component's effect scope
))

...

if (__DEV__) {
  effect.onTrack = instance.rtc
    ? e => invokeArrayFns(instance.rtc!, e)
    : void 0
  effect.onTrigger = instance.rtg
    ? e => invokeArrayFns(instance.rtg!, e)
    : void 0
  update.ownerInstance = instance
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏