Skip to content
API 风格:

Cargando ​

Feedback de carga. Tres formas: máscara de servicio (LhLoading.show(...), a pantalla completa o sobre un contenedor especificado), directiva v-loading y el indicador giratorio básico LhSpinner.

Máscara de servicio a pantalla completa ​

Carga a pantalla completa
vue
<script setup lang="ts">
import { LhLoading } from '@lh-ui/vue3'

const showFullscreen = () => {
  const handle = LhLoading.show({ fullscreen: true, lock: true })
  setTimeout(() => handle.close(), 2000)
}
</script>

<template>
  <LhButton @click="showFullscreen">Carga a pantalla completa 2 s</LhButton>
</template>
vue
<script>
import { LhLoading } from '@lh-ui/vue3'

export default {
  methods: {
    showFullscreen() {
      const handle = LhLoading.show({ fullscreen: true, lock: true })
      setTimeout(() => handle.close(), 2000)
    },
  },
}
</script>

<template>
  <LhButton @click="showFullscreen">Carga a pantalla completa 2 s</LhButton>
</template>

Máscara sobre un contenedor especificado ​

Si no se pasa target, la máscara es a pantalla completa; al pasar un selector o un elemento, se extiende dentro del contenedor (absolute cubre el ancestro posicionado más cercano; si el contenedor es static, se le añade relative automáticamente y se restaura al cerrar).

Carga local
vue
<script setup lang="ts">
import { ref } from 'vue'
import { LhLoading } from '@lh-ui/vue3'

const boxRef = ref<HTMLElement>()

const showBox = () => {
  const handle = LhLoading.show({ target: boxRef.value, text: 'Cargando...', lock: true })
  setTimeout(() => handle.close(), 2000)
}
</script>

<template>
  <div
    ref="boxRef"
    class="demo-loading-box"
  >
    <LhButton @click="showBox">Carga dentro del contenedor</LhButton>
  </div>
</template>
vue
<script>
import { LhLoading } from '@lh-ui/vue3'

export default {
  methods: {
    showBox() {
      const handle = LhLoading.show({ target: this.$refs.boxRef, text: 'Cargando...', lock: true })
      setTimeout(() => handle.close(), 2000)
    },
  },
}
</script>

<template>
  <div
    ref="boxRef"
    class="demo-loading-box"
  >
    <LhButton @click="showBox">Carga dentro del contenedor</LhButton>
  </div>
</template>

Directiva v-loading ​

Tras app.use(LhLoading) (o la importación completa) se registra la directiva v-loading, que controla la visibilidad con un valor booleano.

vue
<template>
  <div v-loading="busy" class="table-zone">…</div>
  <div v-loading:text="'Texto personalizado'" :style="busy2 ? 'height:200px' : ''">…</div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const busy = ref(false)
const busy2 = ref(false)
</script>
vue
<template>
  <div v-loading="busy" class="table-zone">…</div>
  <div v-loading:text="'Texto personalizado'" :style="busy2 ? 'height:200px' : ''">…</div>
</template>

<script>
export default {
  data() {
    return { busy: false, busy2: false }
  },
}
</script>

Indicador giratorio LhSpinner ​

Indicador giratorio básico, utilizable de forma independiente (también es el que renderiza el interior de la máscara semántica de carga).

LhSpinner
vue
<script setup lang="ts">
</script>

<template>
  <div class="demo-loading-row">
    <LhSpinner size="small" />
    <LhSpinner size="medium" />
    <LhSpinner size="large" color="#8f9779" />
  </div>
</template>
vue
<script>
export default {}
</script>

<template>
  <div class="demo-loading-row">
    <LhSpinner size="small" />
    <LhSpinner size="medium" />
    <LhSpinner size="large" color="#8f9779" />
  </div>
</template>

Apariencia personalizada ​

text personaliza el mensaje, background define el fondo de la máscara, z-index controla el orden de apilamiento y spinner desactiva el indicador giratorio.

Apariencia personalizada
vue
<script setup lang="ts">
import { LhLoading } from '@lh-ui/vue3'

const showStyled = () => {
  const handle = LhLoading.show({
    text: 'Sincronizando datos...',
    background: 'rgba(42, 37, 32, 0.6)',
    zIndex: 4000,
    spinner: false,
  })
  setTimeout(() => handle.close(), 2000)
}
</script>

<template>
  <LhButton @click="showStyled">Carga con aspecto personalizado 2 s</LhButton>
</template>
vue
<script>
import { LhLoading } from '@lh-ui/vue3'

export default {
  methods: {
    showStyled() {
      const handle = LhLoading.show({
        text: 'Sincronizando datos...',
        background: 'rgba(42, 37, 32, 0.6)',
        zIndex: 4000,
        spinner: false,
      })
      setTimeout(() => handle.close(), 2000)
    },
  },
}
</script>

<template>
  <LhButton @click="showStyled">Carga con aspecto personalizado 2 s</LhButton>
</template>

API ​

LhLoadingMask Props ​

PropDescripciónTipoPredeterminado
fullscreenSi es a pantalla completa (true cuando el objetivo es body)boolean—
textMensaje de carga (si no se pasa, se toma del paquete de idioma loading.text)string—
backgroundColor de fondo de la máscara (valor CSS background)string—
zIndexNivel de capanumber—
spinnerSi se muestra el icono giratoriobooleantrue
sxProps de maquetación rápida sxLhSxProps—

Servicio: LhLoading.show({ target?, text?, background?, lock?, spinner?, sx? }) devuelve { close }; app.use(LhLoading) registra la directiva v-loading.

Accesibilidad ​

  • La máscara usa role="status" + aria-busy="true"; el mensaje se anuncia como aria-label
  • Con un contenedor especificado, si inert está disponible (mejora progresiva), el contenedor resulta inalcanzable para el teclado y las tecnologías de asistencia, evitando operar los datos subyacentes
  • lock bloquea el desplazamiento y lo restaura al cerrar; al cerrar la máscara se restauran el posicionamiento original del contenedor y su estado de desplazamiento
  • La animación de rotación respeta prefers-reduced-motion

Definiciones de tipos ​

Las estructuras de tipos TypeScript que exporta este componente son las siguientes (extraídas automáticamente de packages/components/loading/src/types.ts y del código fuente de @lh-ui/share/core/*; despliega cada entrada para ver la definición completa; la descripción de los atributos está en la tabla de Props de arriba):

LhLoadingMaskProps
ts
/** Props de la máscara (renderizada internamente por el servicio y la directiva) */
export interface LhLoadingMaskProps {
  /** Si es a pantalla completa (true cuando el objetivo es body) */
  fullscreen?: boolean
  /** Mensaje de carga (si no se pasa, se toma del paquete de idioma loading.text) */
  text?: string
  /** Color de fondo de la máscara (valor CSS background) */
  background?: string
  /** Nivel de capa */
  zIndex?: number
  /** Si se muestra el icono giratorio (por defecto true) */
  spinner?: boolean
  sx?: LhSxProps
}
LhLoadingOptions (de @lh-ui/share/core/loading)
ts
/** Opciones de la máscara de carga (compartidas por el servicio y la directiva) */
export interface LhLoadingOptions {
  /** Objetivo de montaje: cadena selector / elemento; si no se pasa, es a pantalla completa */
  target?: string | HTMLElement
  /** Mensaje de carga (si no se pasa, se toma del paquete de idioma loading.text) */
  text?: string
  /** Color de fondo de la máscara (valor CSS background) */
  background?: string
  /** Si se bloquea el desplazamiento (la máscara a pantalla completa bloquea body; con objetivo, bloquea el propio objetivo) */
  lock?: boolean
  /** Si se muestra el icono giratorio */
  spinner?: boolean
  sx?: LhSxProps
}
LhLoadingHandle (de @lh-ui/share/core/loading)
ts
/** Manejador del servicio */
export interface LhLoadingHandle {
  close: () => void
}

La belleza de la tradición, el cimiento del código