Appearance
UploadFile 上传
文件选择上传控件。
何时使用
上传是指将压缩包、图片、视频、文档等通过网页或者上传工具发布到远程服务器上的过程。
- 当需要上传一个或多个文件时。
- 当需要对上传的文件进行多种形态的预览时。
代码演示
1. 经典样式
上传
经典样式
默认样式
<template>
<z-upload-file v-model="fileList" @upload="uploadChange"></z-upload-file>
</template>
<script setup lang="ts">
import { ref } from "vue";
import {uploadEvFn, uploadEvtCe} from "@d7ee/z-base-ui";
const fileList = ref<Array<{name: string, path: string}>>([]);
const uploadChange = (e: uploadEvtCe, fn: uploadEvFn) => {
// 上传回调,获取文件列表,进行异步上传
console.log(e.file);
// 版本 >= 1.0.1单个文件可传入SRC地址,多个文件可通过Array<{name, path}>
fn("https://xxx.com/img/xxx.png");
};
</script>2. 已上传的文件列表


上传
已上传的文件列表
使用value设置已上传的内容。
<template>
<z-upload-file v-model="fileList"></z-upload-file>
</template>
<script setup lang="ts">
import { ref } from "vue";
const fileList = ref<any[]>([{
name: "xxx.png",
path: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
}, {
name: "小熊.png",
path: "http://7dee.com/img/user.png"
}]);
</script>3. 受控制的上传


上传
受控制的上传
使用num控制上传的数量。当你超过数量时你将通过@reject收到警告回调。
<template>
<z-upload-file v-model="fileList" :num="2" @reject="errChange"></z-upload-file>
</template>
<script lang="ts" setup>
import {ref} from "vue"
const fileList = ref<any[]>([
{
name: "xxx.png",
path: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
}, {
name: "小熊.png",
path: "http://7dee.com/img/user.png"
}
])
const errChange = (e: any) => {
console.log(e, "异常消息");
}
</script>4. 失败的图片上传


上传
无法被预览的链接
当你的列表存在一张无法被访问的图片时,超过请求时间后,它的Border将会变红。
<template>
<z-upload-file v-model="fileList"></z-upload-file>
</template>
<script lang="ts" setup>
import {ref} from "vue"
const fileList = ref<any[]>([
{
name: "xxx.png",
path: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
}, {
name: "小熊.png",
path: "http://xxx.com/img/user.png"
}
])
</script>4. list 列表
上传
列表模式
type=list时,预览效果将会以列表呈现。
<template>
<z-upload-file type="list" v-model="fileList"></z-upload-file>
</template>
<script lang="ts" setup>
import {ref} from "vue"
const fileList = ref<any[]>([
{
name: "xxx.png",
path: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
}
])
</script>5. list-simple 列表极简
上传
列表极简模式
type=list-simple时,它就会变得非常简洁。
<template>
<z-upload-file type="list-simple" v-model="fileList"></z-upload-file>
</template>
<script lang="ts" setup>
import {ref} from "vue"
const fileList = ref<any[]>([
{
name: "xxx.png",
path: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
}
])
</script>6. card-inner 隐藏删除

上传
隐藏外部删除,指向时浮现
type=card-inner时,右下角的删除会被隐藏,只有当你鼠标指向它时才会出现。
<template>
<z-upload-file type="card-inner" v-model="fileList"></z-upload-file>
</template>
<script lang="ts" setup>
import {ref} from "vue"
const fileList = ref<any[]>([
{
name: "xxx.png",
path: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
}
])
</script>7. single 单文件上传

上传
单文件模式
type=single时,上传按钮和预览将会叠加在一起。
<template>
<z-upload-file type="single" v-model="fileList"></z-upload-file>
</template>
<script lang="ts" setup>
import {ref} from "vue"
const fileList = ref<any[]>([
{
name: "xxx.png",
path: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
}
])
</script>8. slot 自定义上传按钮和预览列表

自定义功能的实现
如果现有的样式不能满足你,或许可以考虑使用自定义插槽,默认插槽用于定义上传按钮,具名插槽fileRender用于定义渲染预览列表,当然你也可以自定义其中的一种。
<template>
<z-upload-file type="list" v-model="fileList">
<a-button>自定义上传按钮</a-button>
<template #fileRender="{files}">
<img v-for="item in files" :key="item.id" :src="item.path" alt=""/>
</template>
</z-upload-file>
</template>
<script lang="ts" setup>
import {ref} from "vue"
const fileList = ref<any[]>([
{
name: "xxx.png",
path: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
}
])
</script>
<style scoped>
img{
margin-top: 20px;
width: 50px;
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.5);
border-radius: 50%;
}
</style>9. 完全受控制的上传

上传
完全受控制的上传
在上传时,你可以选择什么都不做,不调用回调函数也不更新value,以此来拦截上传。
<template>
<z-upload-file v-model="fileList" @upload="uploadChange"/>
</template>
<script lang="ts" setup>
import {ref} from "vue"
import {uploadEvFn, uploadEvtCe} from "@d7ee/z-base-ui";
const fileList = ref<any[]>([
{
name: "xxx.png",
path: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
}
])
const uploadChange = async (e: uploadEvtCe, fn: uploadEvFn) => {
// 操作.....
console.log(e);
/**
* @function fn
* - 对于不满足条件的文件,你可以不向fn或绑定数据进行追加,它就会被拦截
* - 对于需要异步上传的数据,在上传完成后调用fn返回一个Array<{name: "文件名", path: "文件url地址"}>用于更新文件列表、
* */
fn(false);
// fn([{name: "xx.png", path: "xxxxxx"}]);
}
</script>10. 拖拽上传
上传
拖拽上传
通过设置drag来允许用户进行拖拽上传,版本>=0.0.12
<template>
<z-upload-file v-model="fileList" @upload="uploadChange" drag></z-upload-file>
</template>
<script setup lang="ts">
import { ref } from "vue";
import {uploadEvFn, uploadEvtCe} from "@d7ee/z-base-ui";
const fileList = ref<Array<{name: string, path: string}>>([]);
const uploadChange = (e: uploadEvtCe, fn: uploadEvFn) => {
// 上传回调,获得File数据,可在此处进行异步上传
console.log(e);
fn(false);
};
</script>APi
props
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| num | 上传数量控制 | number | 9 | >= 0.0.8 |
| limit | 文件大小控制,单位mb | number | 10MB | >= 0.0.8 |
| accept | 文件类型约束,用于约束用户能上传的文件,详见accept | string | string[] | * | >= 0.0.8 |
| type | 预览列表效果,支持五种基本样式,详见type | string | card | >= 0.0.8 |
| repeat | 重名校验,启用后不允许出现同名文件 | boolean | true | >= 0.0.8 |
| checksums | 关闭所有校验规则 | boolean | false | >= 0.0.8 |
| preview | 关闭文件预览列表 | boolean | false | >= 0.0.8 |
| value | 默认值,通过v-model=""绑定 | Array<{name: string, path: string}> | [] | >= 0.0.8 |
| drag | 拖拽上传 | boolean | false | >= 0.0.12 |
props-type
| 类型 | 说明 | 类型 | 版本 |
|---|---|---|---|
| card | 卡片效果,删除在右下角 | string | >= 0.0.8 |
| card-inner | 卡片效果,删除隐藏在内部,鼠标指向时出现 | string | >= 0.0.8 |
| single | 单文件上传,适用于只上传一个文件,预览效果和上传按钮重叠 | string | >= 0.0.8 |
| list-simple | 列表模式,非常简洁 | string | >= 0.0.8 |
| list | 列表模式 | string | >= 0.0.8 |
props-accept
- 何时使用:对文件类型有约束条件时
- 报错信息:除了在控制台打印警告信息外,同时触发reject事件
- 注意事项:当你想只允许上传jpg格式时,最好同时允许上传jpeg格式,经测试在网上下载到后缀名为jpg的图片,读取到的类型大多为jpeg
- string:string类型更适合约束单文件类型或范围约束如,accept='png',accept='image/*'
- string[]:数组形适合约束不同类型文件,如:accept=['jpg', 'jpeg', 'zip']
自定义插槽
- 何时使用:当现有样式无法满足需求时使用
- 插槽携带一个返回值
files,为文件数组,通过path可获取到文件的url地址
| 插槽名 | 说明 | 参数 | 版本 |
|---|---|---|---|
| default | 默认插槽,用于自定义上传按钮 | files | >= 0.0.8 |
| fileRender | 渲染插槽,用于自定义文件列表的展示形态 | files | >= 0.0.8 |
自定义上传按钮
vue
<template>
<z-upload-file>
<button>我是自定义上传按钮</button>
</z-upload-file>
</template>自定义文件预览
vue
<template>
// 在组件内渲染
<z-upload-file>
<template #fileRender="{files}">
<img v-for="item in files" :key="item.id" :src="item.path"/>
</template>
</z-upload-file>
// 在组件外渲染,使用preview关闭默认效果
<div>
<img v-for="item in fileArr" :key="item.id" :src="item.path"/>
</div>
<z-upload-file v-model="fileArr" :preview="true"></z-upload-file>
</template>
<script setup lang="ts">
import { ref } from "vue";
const fileArr = ref<any>([]);
</script>常见问题:我使用了type='single',进行单个文件上传时如何自定义呢?
示列代码
vue
<template>
<z-upload-file type="single">
<template #default={files}>
<button v-if="files.length > 0">上传</button>
<img v-else :src="files[0].path"/>
</template>
</z-upload-file>
</template>事件
| 事件 | 说明 | 类型 | 版本 |
|---|---|---|---|
| upload | 上传时回调,详见upload | function(e, fn) | >= 0.0.8 |
| remove | 删除时回调,详见remove | function(e) | >= 0.0.8 |
| reject | 异常状况时回调,详见reject | function(e) | >= 0.0.8 |
| removeFile | 手动删除文件,通过ref获取实列后进行调用,需要传入被删文件的下标,详见removeFile | function(e) | >= 0.1.2 |
upload
选择文件后触发回调,接收一个参数和一个回调函数
- 参数:{type: 类型, file:文件列表}
- 回调函数:Array<{name:文件名, path:src}> | {name:文件名, path:src} | string
- 注意:回调函数中的Object和String类型需要版本 >=
1.0.1
代码演示
vue
<template>
<z-upload-file @upload="uploadChange"/>
</template>
<script lang="ts" setup>
import {uploadEvFn, uploadEvtCe} from "@d7ee/z-base-ui";
const uploadChange = async (e: uploadEvtCe, fn: uploadEvFn) => {
console.log(e);
fn(false); // 阻止上传
// fn([{name: "测试.png", path: "src地址"}]); // 多文件上传或单文件
// fn("src地址") // 单文件返回
// fn({name: "测试.png", path: "src地址"}) // 单文件
}
</script>参数
{
type: "upload", // 类型
file: File[], // 本次上传的文件列表
}remove
当有文件从列表被删除时会调用这个函数
remove(e: uploadEvtRm)
代码演示
vue
<template>
<z-upload-file @remove="uploadRemove"/>
</template>
<script lang="ts" setup>
import {uploadEvtRm} from "@d7ee/z-base-ui";
const uploadRemove = async (e: uploadEvtRm) => {
console.log(e);
}
</script>返回值
{
type: "remove", // 类型
file: File[], // 被删除的的文件
}reject
上传文件失败或出现其它异常情况时触发该函数
- 版本 >=
1.0.1,增加msg字段,用于直接获取错误信息。
reject(e: uploadEvtRj)
代码演示
vue
<template>
<z-upload-file @reject="uploadReject"/>
</template>
<script lang="ts" setup>
import {uploadEvtRj} from "@d7ee/z-base-ui";
const uploadReject = async (e: uploadEvtRj) => {
console.log(e);
}
</script>返回值: 场景1,通常出现在上传时
{
type: "reject",
mgs: "错误原因",
info: {
repeatName: [], // 重名文件
tooBig: [], // 文件过大,0.0.15以前字段为oversized,你仍然可以使用它
refuseType: [], // 文件类型不符
}
}返回值: 场景2,通常出现在发生其它异常情况时
{
type: "reject",
info: "错误原因",
mgs: "错误原因",
}removeFile
主动删除文件,通过
ref获取组件实列,调用removeFile函数,传入待删除文件的下标removeFile(e: number)
代码演示
vue
<template>
<z-upload-file ref="rUpload">
<template #fileRender="{files}">
<img v-for="(item, index) in files" :key="index" :src="item.path" alt="" @click="removeItem(index)"/>
</template>
</z-upload-file>
</template>
<script lang="ts" setup>
import { ref } from "vue";
const rUpload = ref<any>();
// 删除文件
const removeItem = async (e: number) => {
rUpload.value.removeFile(e);
};
</script>