# Upload アップロード
ファイルアップロードです。ライブラリは HTTP クライアントを内蔵せず、request prop が実際の転送を引き受けます(onProgress が進捗を書き戻し、Promise が resolve すれば成功です)。ドラッグ、複数選択、数量 / サイズ / タイプの制約、失敗時の再試行をサポートします。
アップロード
<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">ファイルを選択(最大 3 つ、1 つあたり ≤ 2MB)</LhButton>
</LhUpload>
<LhUpload drag :request="fakeRequest">
<div style="padding: 20px 0">
<p class="demo-note" style="font-size: 14px">ここにファイルをドラッグするか、クリックしてアップロード</p>
<p class="demo-note">ドラッグをサポート(drag モード)</p>
</div>
</LhUpload>
<LhUpload multiple :max-count="5" accept=".png,.jpg" :request="fakeRequest" disabled>
<LhButton disabled>無効状態(accept は配列形式 .png/.jpg)</LhButton>
</LhUpload>
<p class="demo-note">状態:{{ status }}</p>
</div>
</template>
<script>
export default {
data: () => ({
status: '(未アップロード)',
}),
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 = `リストは合計 ${files.length} 個のファイル`
},
onSuccess(file) {
var _a
this.status = `アップロード成功:${(_a = file.name) !== null && _a !== void 0 ? _a : ''}`
},
onError(file, reason) {
var _a
this.status = `アップロード失敗:${(_a = file.name) !== null && _a !== void 0 ? _a : ''}(${String(reason)})`
},
},
}
</script>
# Props
| プロパティ | 説明 | 型 | デフォルト値 |
|---|---|---|---|
| multiple | 複数選択 | boolean | false |
| drag | ドラッグアップロードモード | boolean | false |
| disabled | 無効 | boolean | false |
| accept | 受け付けるファイルタイプ('.png,.jpg' または配列) | string \| string[] | — |
| maxSize | 1 ファイルあたりのサイズ上限(バイト) | number | — |
| maxCount | ファイル数の上限(0 は無制限) | number | 0 |
| request | アップロードリクエスト関数(ライブラリは HTTP クライアントを内蔵しない) | LhUploadRequest | — |
| sx | sx によるレイアウト省略記法 | — | — |
LhUploadRequest のシグネチャ:(options: { file: File; onProgress: (percent: number) => void }) => Promise<{ url?: string }>——
Promise が resolve すると success、reject(または例外の送出)すると error が発火します。
# Events
change (files)、success (file)、error (file, reason)、remove (uid)
# Slots
| スロット | 説明 |
|---|---|
| default | トリガーエリアの内容(省略時は「クリックしてアップロード / ここにドラッグ」のヒントをレンダリング) |
# アクセシビリティ
トリガーエリアは role="button" + tabindex(Enter / Space でファイル選択ダイアログを開くことをサポート)で、aria-disabled が無効状態を示します。
アップロード中のファイル行には role="progressbar" + aria-valuenow が付き、バリデーション失敗のヒントは role="alert" です。
Copyright © 2024-2026 FengMo WenXue