hookehuyr

✨ feat: 新增图片上传组件

1 +<!--
2 + * @Date: 2022-08-31 16:16:49
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-08-31 16:39:08
5 + * @FilePath: /data-table/src/components/ImageUploaderField/index.vue
6 + * @Description: 文件描述
7 +-->
8 +<template>
9 + <div class="image-uploader-field">
10 + <div class="label">{{ item.label }}<span v-if="item.required">&nbsp;*</span></div>
11 + <div style="padding: 1rem;">
12 + <van-uploader upload-icon="add" :before-read="beforeRead" :after-read="afterRead" v-model="fileList" multiple />
13 + </div>
14 + </div>
15 +</template>
16 +
17 +<script setup>
18 +import { Toast } from 'vant';
19 +
20 +const props = defineProps({
21 + item: Object
22 +})
23 +
24 +// 上传前置处理
25 +const beforeRead = (file) => {
26 + if (file.type !== 'image/jpeg' && file.type !== 'image/png') {
27 + Toast('请上传 jpg/png 格式图片');
28 + return false;
29 + }
30 + return true;
31 +};
32 +
33 +const afterRead = (file) => {
34 + // 此时可以自行将文件上传至服务器
35 + console.log(file);
36 +};
37 +
38 +const fileList = ref([
39 + { url: 'https://fastly.jsdelivr.net/npm/@vant/assets/leaf.jpeg' },
40 + // Uploader 根据文件后缀来判断是否为图片文件
41 + // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明
42 + // { url: 'https://cloud-image', isImage: true },
43 +]);
44 +</script>
45 +
46 +<style lang="less" scoped>
47 +.image-uploader-field {
48 + .label {
49 + padding: 1rem 1rem 0 1rem;
50 + font-size: 0.9rem;
51 + font-weight: bold;
52 +
53 + span {
54 + color: red;
55 + }
56 + }
57 +}
58 +</style>
...@@ -7,6 +7,7 @@ import CheckboxField from '@/components/CheckboxField/index.vue' ...@@ -7,6 +7,7 @@ import CheckboxField from '@/components/CheckboxField/index.vue'
7 import PickerField from '@/components/PickerField/index.vue' 7 import PickerField from '@/components/PickerField/index.vue'
8 import AreaPickerField from '@/components/AreaPickerField/index.vue' 8 import AreaPickerField from '@/components/AreaPickerField/index.vue'
9 import DatePickerField from '@/components/DatePickerField/index.vue' 9 import DatePickerField from '@/components/DatePickerField/index.vue'
10 +import ImageUploaderField from '@/components/ImageUploaderField/index.vue'
10 11
11 /** 12 /**
12 * 生成自定义组件类型 13 * 生成自定义组件类型
...@@ -18,6 +19,7 @@ import DatePickerField from '@/components/DatePickerField/index.vue' ...@@ -18,6 +19,7 @@ import DatePickerField from '@/components/DatePickerField/index.vue'
18 * @type picker 单列选择器 PickerField 19 * @type picker 单列选择器 PickerField
19 * @type area_picker 省市区选择器 AreaPickerField 20 * @type area_picker 省市区选择器 AreaPickerField
20 * @type date_picker 日期选择器 DatePickerField 21 * @type date_picker 日期选择器 DatePickerField
22 + * @type image_uploader 图片上传 ImageUploaderField
21 */ 23 */
22 export function createComponentType(data) { 24 export function createComponentType(data) {
23 // 判断类型和使用组件 25 // 判断类型和使用组件
...@@ -58,5 +60,8 @@ export function createComponentType(data) { ...@@ -58,5 +60,8 @@ export function createComponentType(data) {
58 if (item.component_props.name === 'date_picker') { 60 if (item.component_props.name === 'date_picker') {
59 item.component = DatePickerField; 61 item.component = DatePickerField;
60 } 62 }
63 + if (item.component_props.name === 'image_uploader') {
64 + item.component = ImageUploaderField;
65 + }
61 }) 66 })
62 } 67 }
......
...@@ -124,6 +124,13 @@ onMounted(() => { ...@@ -124,6 +124,13 @@ onMounted(() => {
124 min_date: new Date(), 124 min_date: new Date(),
125 columns_type: ['year', 'month'] 125 columns_type: ['year', 'month']
126 }, 126 },
127 + }, {
128 + key: 'imageUploader',
129 + value: '',
130 + label: '图片上传',
131 + component_props: {
132 + name: 'image_uploader'
133 + }
127 }]; 134 }];
128 // 生成自定义组件 135 // 生成自定义组件
129 createComponentType(mockData.value) 136 createComponentType(mockData.value)
......