useScriptTriggerElement

useScriptTriggerElement 函数的 API 文档。

创建一个触发器,根据特定的元素事件来加载脚本。

签名

function useScriptTriggerElement(options: ElementScriptTriggerOptions): Promise<void> & { ssrAttrs?: Record<string, string> } | 'onNuxtReady' {}

参数

export interface ElementScriptTriggerOptions {
  /**
   * 触发脚本加载的事件。
   * 
   * 例如我们可以绑定通常使用 addEventListener 的事件:`mousedown`、`mouseenter`、`scroll` 等。
   */
  trigger?: 'immediate' | 'visible' | string | string[] | false | undefined
  /**
   * 监听触发事件的元素。
   * @default document.body
   */
  el?: HTMLElement | Ref<HTMLElement | undefined> | null
}

返回值

返回一个 Promise,当脚本加载完成时会被解析。

处理预水合事件

当注册依赖用户输入的触发器时(例如 mousedown),用户可能会在水合(hydration)过程完成之前与元素互动。

此时,事件监听器还未绑定到元素上,脚本也不会被加载。

为了确保正确处理,应该将 ssrAttrs 值绑定到你附加事件的元素上。注意,在使用 ssrAttrs 值之前,应确认函数返回的是 Promise。

<script setup lang="ts">
import { ref, useScriptTriggerElement } from '#imports'

const el = ref<HTMLElement>()
const trigger = useScriptTriggerElement({
  trigger: 'mousedown',
  el,
})

const elAttrs = computed(() => {
  return {
    ...(trigger instanceof Promise ? trigger.ssrAttrs : {}),
  }
})
</script>
<template>
  <div ref="el" v-bind="elAttrs">
    点击我以加载脚本
  </div>
</template>

示例

  • 当元素出现在视口时加载脚本。
<script setup lang="ts">
const el = ref<HTMLElement>()
useScript('/script.js', {
  trigger: useScriptTriggerElement({
    trigger: 'visible',
    el,
  })
})
</script>

<template>
  <div style="height: 100vh;">
    <h1>向下滚动以加载脚本</h1>
  </div>
  <div ref="el">
    <h1>脚本已加载!</h1>
  </div>
</template>
  • 当元素被悬停时加载脚本。
<script setup lang="ts">
const el = ref<HTMLElement>()
useScript('/script.js', {
  trigger: useScriptTriggerElement({
    trigger: 'hover',
    el,
  })
})
</script>

<template>
  <div ref="el">
    <h1>鼠标悬停我以加载脚本</h1>
  </div>
</template>