# Carga de archivos
Carga de archivos. La biblioteca no incorpora un cliente HTTP: el prop request gestiona la transmisión real (onProgress comunica el progreso; la resolución de la Promise equivale al éxito). Admite el arrastre, la selección múltiple, las restricciones de cantidad / tamaño / tipo y el reintento tras un fallo.
<template>
<div class="demo-col">
<LhUpload
multiple
:max-count="3"
:max-size="2097152"
accept="image/*"
:request="fakeRequest"
@change="onChange"
@success="onSuccess"
@error="onError"
>
<LhButton type="primary">Seleccionar archivos (máx. 3, cada uno ≤ 2 MB)</LhButton>
</LhUpload>
<LhUpload drag :request="fakeRequest">
<div style="padding: 20px 0">
<p class="demo-note" style="font-size: 14px">Arrastra los archivos aquí o pulsa para cargarlos</p>
<p class="demo-note">Admite el arrastre (modo drag)</p>
</div>
</LhUpload>
<LhUpload multiple :max-count="5" accept=".png,.jpg" :request="fakeRequest" disabled>
<LhButton disabled>Estado desactivado (accept en forma de arreglo .png/.jpg)</LhButton>
</LhUpload>
<p class="demo-note">Estado: {{ status }}</p>
</div>
</template>
<script>
export default {
data: () => ({
status: '(sin cargas)',
}),
methods: {
fakeRequest(opts) {
const { file, onProgress } = opts
return new Promise((resolve) => {
let percent = 0
const timer = setInterval(() => {
percent += 25
if (percent >= 100) {
clearInterval(timer)
onProgress(100)
resolve({ url: `/assets/${file.name}` })
} else {
onProgress(percent)
}
}, 200)
})
},
onChange(files) {
this.status = `La lista contiene ${files.length} archivos`
},
onSuccess(file) {
var _a
this.status = `Carga correcta: ${(_a = file.name) !== null && _a !== void 0 ? _a : ''}`
},
onError(file, reason) {
var _a
this.status = `Error de carga: ${(_a = file.name) !== null && _a !== void 0 ? _a : ''} (${String(reason)})`
},
},
}
</script>
# Props
| Prop | Descripción | Tipo | Predeterminado |
|---|---|---|---|
| multiple | Selección múltiple | boolean | false |
| drag | Modo de carga por arrastre | boolean | false |
| disabled | Desactivado | boolean | false |
| accept | Tipos de archivo aceptados ('.png,.jpg' o un arreglo) | string \| string[] | — |
| maxSize | Tamaño máximo por archivo (bytes) | number | — |
| maxCount | Número máximo de archivos (0: sin límite) | number | 0 |
| request | Función de solicitud de carga (la biblioteca no incorpora un cliente HTTP) | LhUploadRequest | — |
| sx | Prop abreviada de maquetación | — | — |
La firma de LhUploadRequest es (options: { file: File; onProgress: (percent: number) => void }) => Promise<{ url?: string }>:
la resolución de la Promise dispara success, y el rechazo (o una excepción) dispara error.
# Events
change (files)、success (file)、error (file, reason)、remove (uid)
# Slots
| Slot | Descripción |
|---|---|
| default | Contenido del área de activación (si se omite, se renderiza el aviso predeterminado «点击上传 / 拖到此处») |
# Accesibilidad
El área de activación usa role="button" + tabindex (abre el selector de archivos con Enter / barra espaciadora), y aria-disabled indica el estado desactivado;
las filas de los archivos en carga llevan role="progressbar" + aria-valuenow, y los avisos de error de validación usan role="alert".
Copyright © 2024-2026 FengMo WenXue