Api

useScriptTriggerElement

useScriptTriggerElement 函数的 API 文档。

创建一个触发器,以便在特定元素事件发生时加载脚本。

签名

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

参数

export interface ElementScriptTriggerOptions {
  /**
   * The event to trigger the script load.
   * 
   * For example we can bind events that we'd normally use addEventListener for: `mousedown`, `mouseenter`, `scroll`, etc.
   */
  trigger?: 'immediate' | 'visible' | string | string[] | false | undefined
  /**
   * The element to watch for the trigger event.
   * @default document.body
   */
  el?: HTMLElement | Ref<HTMLElement | undefined> | null
}

返回

一个在脚本加载后解析的 Promise。

处理预水合事件

当注册一个依赖用户输入的触发器时,例如 mousedown,用户可能会在水合过程完成之前与该元素进行交互。

在这种情况下,事件监听器将不会附加到该元素,并且脚本将不会加载。

为了确保正确处理,您应该将 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">
    Click me to load the script
  </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>Scroll down to load the script</h1>
  </div>
  <div ref="el">
    <h1>Script loaded!</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>hover me to load the script</h1>
  </div>
</template>