Admin 元件
Image
圖片純展示。視覺態:loading/loaded/error。
安裝
Terminal
pnpm dlx shadcn-vue add @admin/imageimport { AdminImage, AdminImageFallback, AdminImageImg, AdminImagePlaceholder,} from '@/components/admin/image'用法
<script setup lang="ts">import { AdminImage, AdminImageFallback, AdminImageImg, AdminImagePlaceholder} from '@/components/admin/image'</script><template> <admin-image class="aspect-video w-80 rounded-md"> <admin-image-img alt="風景照" src="https://picsum.photos/seed/admin-image/800/450" /> <admin-image-placeholder /> <admin-image-fallback /> </admin-image></template>場景
自訂版面與裁切
<script setup lang="ts">import { AdminImage, AdminImageFallback, AdminImageImg, AdminImagePlaceholder} from '@/components/admin/image'const SRC_LANDSCAPE = 'https://picsum.photos/seed/admin-image-landscape/800/450'const SRC_PORTRAIT = 'https://picsum.photos/seed/admin-image-portrait/600/800'const SRC_SQUARE = 'https://picsum.photos/seed/admin-image-square/600/600'</script><template> <div class="flex flex-col gap-6"> <section class="flex flex-col gap-2"> <span class="typo-caption-small text-text-50">aspect:video / square / [4/3]</span> <div class="grid grid-cols-3 gap-4"> <admin-image class="aspect-video rounded-md"> <admin-image-img alt="aspect-video" :src="SRC_LANDSCAPE" /> <admin-image-placeholder /> <admin-image-fallback /> </admin-image> <admin-image class="aspect-square rounded-md"> <admin-image-img alt="aspect-square" :src="SRC_SQUARE" /> <admin-image-placeholder /> <admin-image-fallback /> </admin-image> <admin-image class="aspect-4/3 rounded-md"> <admin-image-img alt="aspect-4/3" :src="SRC_LANDSCAPE" /> <admin-image-placeholder /> <admin-image-fallback /> </admin-image> </div> </section> <section class="flex flex-col gap-2"> <span class="typo-caption-small text-text-50">object-fit:預設 cover / object-contain</span> <div class="grid grid-cols-2 gap-4"> <admin-image class="aspect-video rounded-md bg-bg-80"> <admin-image-img alt="cover" :src="SRC_PORTRAIT" /> <admin-image-placeholder /> <admin-image-fallback /> </admin-image> <admin-image class="aspect-video rounded-md bg-bg-80"> <admin-image-img alt="contain" class="object-contain" :src="SRC_PORTRAIT" /> <admin-image-placeholder /> <admin-image-fallback /> </admin-image> </div> </section> <section class="flex flex-col gap-2"> <span class="typo-caption-small text-text-50">rounded:rounded-md / rounded-full</span> <div class="flex gap-4"> <admin-image class="aspect-square w-32 rounded-md"> <admin-image-img alt="rounded-md" :src="SRC_SQUARE" /> <admin-image-placeholder /> <admin-image-fallback /> </admin-image> <admin-image class="aspect-square w-32 rounded-full"> <admin-image-img alt="rounded-full" :src="SRC_SQUARE" /> <admin-image-placeholder /> <admin-image-fallback /> </admin-image> </div> </section> </div></template>錯誤態 fallback
故意傳入無效 src 觸發 error,顯示預設 fallback。
<script setup lang="ts">import { AdminImage, AdminImageFallback, AdminImageImg, AdminImagePlaceholder} from '@/components/admin/image'</script><template> <admin-image class="aspect-video w-80 rounded-md"> <admin-image-img alt="無法載入的圖片" src="/_does-not-exist.png" /> <admin-image-placeholder /> <admin-image-fallback /> </admin-image></template>自訂 placeholder 與 fallback
子元件渲染條件
admin-image-placeholder 僅在 loading 狀態渲染,admin-image-fallback 僅在 error 狀態渲染;不放對應子元件即無該狀態的視覺。
<script setup lang="ts">import { IconAlertTriangle, IconRefresh } from '@tabler/icons-vue'import { computed, ref } from 'vue'import { AdminButton } from '@/components/admin/button'import { AdminImage, AdminImageFallback, AdminImageImg, AdminImagePlaceholder} from '@/components/admin/image'import { AdminLoading } from '@/components/admin/loading'const reloadKey = ref(0)const customSrc = computed( () => `https://picsum.photos/seed/admin-image-custom-${reloadKey.value}/800/450`)</script><template> <div class="flex flex-col gap-3"> <div> <admin-button size="small" variant="outline" @click="reloadKey++"> <icon-refresh class="size-4" /> 重新載入 </admin-button> </div> <div class="flex gap-4"> <admin-image class="aspect-video w-80 rounded-md"> <admin-image-img alt="客製 placeholder" :src="customSrc" /> <admin-image-placeholder> <admin-loading mode="inline" /> </admin-image-placeholder> <admin-image-fallback /> </admin-image> <admin-image class="aspect-video w-80 rounded-md"> <admin-image-img alt="客製 fallback" src="/_does-not-exist.png" /> <admin-image-placeholder /> <admin-image-fallback class="flex flex-col gap-2 bg-primary-10 text-error-40"> <icon-alert-triangle class="size-6" /> <span class="typo-caption-small">圖片暫時無法顯示</span> </admin-image-fallback> </admin-image> </div> </div></template>API 參考
組成
<template> <admin-image> <admin-image-img alt="..." src="..." /> <admin-image-placeholder /> <admin-image-fallback /> </admin-image></template>admin-image
Props
| 名稱 | 型別 | 預設值 | 說明 |
|---|---|---|---|
class | ClassValue | — | 根元素之自訂 class |
Slots
| 名稱 | Bindings | 說明 |
|---|---|---|
default | {} | — |
admin-image-img
Props
| 名稱 | 型別 | 預設值 | 說明 |
|---|---|---|---|
src* | string | — | 圖片 URL(必填) |
alt* | string | — | 圖片替代文字(必填) |
loading | "eager" | "lazy" | undefined | — | 原生 `<img>` 之 `loading` 屬性 |
decoding | "auto" | "async" | "sync" | undefined | — | 原生 `<img>` 之 `decoding` 屬性 |
srcset | string | undefined | — | 響應式圖片之 `srcset` 候選清單 |
sizes | string | undefined | — | 響應式圖片之 `sizes` 描述 |
referrerpolicy | HTMLAttributeReferrerPolicy | undefined | — | 原生 `<img>` 之 `referrerpolicy` 屬性 |
crossorigin | "" | "anonymous" | "use-credentials" | undefined | — | 原生 `<img>` 之 `crossorigin` 屬性 |
class | ClassValue | — | 根元素之自訂 class |
* 代表必填
Events
| 名稱 | Payload | 說明 |
|---|---|---|
error | Event | 圖片載入失敗時觸發 |
load | Event | 圖片載入成功時觸發 |
admin-image-placeholder
Props
| 名稱 | 型別 | 預設值 | 說明 |
|---|---|---|---|
class | ClassValue | — | 根元素之自訂 class |
Slots
| 名稱 | Bindings | 說明 |
|---|---|---|
default | {} | — |
admin-image-fallback
Props
| 名稱 | 型別 | 預設值 | 說明 |
|---|---|---|---|
class | ClassValue | — | 根元素之自訂 class |
Slots
| 名稱 | Bindings | 說明 |
|---|---|---|
default | {} | — |
注意事項
- CDN 同 URL 不同檔:若
src字串完全相同但內容換了(CDN 快取),<img>不會自動重抓。父層應在 URL 後加 query string 強制更新。 - 純展示用
admin-image;頭像場景改用admin-avatar;表單上傳改用admin-image-upload。
更新紀錄
此元件尚無更新紀錄。