uni-app+uView实现多图上传功能。

news2024/10/3 2:24:09

最近使用uni-app开发一个多平台的小项目,项目需要多图上传,uni-app前端UI框架使用了uView UI。结合uView的Upload组件,实现了多图上传功能,多图上传可以限制上传的个数,以及选择设为封面功能。

目录

  • 效果图
  • uView Upload组件
  • view部分
  • script部分
  • 样式
  • 总结

效果图

上传初始状态:
在这里插入图片描述
上传图片:
在这里插入图片描述

uView Upload组件

先来认识一下uView的Upload组件。Upload组件用于图片上传场景。Upload组件支持如下平台

  • APP
  • H5
  • 各家小程序
    Upload组件支持手动上传自动上传,可以限制图片大小以及图片数量。可以配置上传前的钩子与删除文件前的钩子,灵活性还是比较大的。有兴趣的可以去看下相关的组件文档,这里就不多做介绍了。

view部分

不多废话,来到正文:

图片上传一般可以单独使用,也可以跟其他form组件放在一起,示例中其他组件的使用不在本篇内容范畴内,所以一行代码用以表示。只展示主要代码。

<view class="container">
	<view class="font-size-16 text-9B9B9B margin-top-10">上传图片</view>
    <view class="text-9B9B9B">图片宽度和高度都不能低于500像素,至少3张,最多15张!</view>
	<u-form-item label="" v-show="false" :border-bottom="false" prop="coverImage">
		<u-input v-model="form.coverImage" :disabled="false" placeholder=""></u-input>
	</u-form-item>
</view>

这段代码定义了上传图片的提示文字,以及封面图!

<view class="container padding-vertical-15">
    <view class="pre-box">
        <block v-for="(item, index) in imageList" :key="index">
            <view class="pre-item">
                <image class="pre-item-image" :src="item.url" mode="aspectFill"></image>
                <view class="u-delete-icon" @click="deleteItem(index)">
                    <u-icon name="close" size="20" color="#ffffff"></u-icon>
                </view>
                <view class="default-image-box">
                    <u-checkbox shape="circle" v-model="item.checked" labelColor="#FFFFFF" active-color="#19be6b" label-size="24" :name="index" size="24"
                     @change="setDefault(index)">设为封面</u-checkbox>
                </view>
                <view class="default-image-box-mask"></view>
            </view>
        </block>
        <view class="pre-item">
            <u-upload ref="imageUpload" :action="imageUploadUrl" :show-tips="false" :disabled="hiddImageUpload" :auto-upload="true"
            :max-count="imageMaxCount" :upload-text="imageUploadText" :show-upload-list="false" @on-success="imageUploadSuccess"
            @on-error="uploadError">
                <view slot="addBtn" class="slot-btn" hover-class="slot-btn__hover" hover-stay-time="150">
                    <u-icon name="camera" size="60" :color="$u.color['lightColor']"></u-icon>
                    <view>{{imageUploadText}}</view>
                </view>
            </u-upload>
        </view>
    </view>
</view>

这段代码中,定义了上传成功后的图片预览、以及上传组件的展示。图片列表里,还有设为封面的功能。
完整代码:

<template>
    <view>
        <u-form :model="form" ref="uForm" :rules="rules" :error-type="errorType">
            <u-form-item label="表单项" label-width="160rpx" :border-bottom="true">
                        //...	
            </u-form-item>
            <!--图片上传-->
            <view class="container">
                <view class="font-size-16 text-9B9B9B margin-top-10">上传图片</view>
                <view class="text-9B9B9B">图片宽度和高度都不能低于500像素,至少3张,最多15张!</view>
                <u-form-item label="" v-show="false" :border-bottom="false" prop="coverImage">
					<u-input v-model="form.coverImage" :disabled="false" placeholder=""></u-input>
				</u-form-item>
            </view>
            <view class="container padding-vertical-15">
                <view class="pre-box">
                    <block v-for="(item, index) in imageList" :key="index">
                        <view class="pre-item">
                            <image class="pre-item-image" :src="item.url" mode="aspectFill"></image>
                            <view class="u-delete-icon" @click="deleteItem(index)">
                                <u-icon name="close" size="20" color="#ffffff"></u-icon>
                            </view>
                            <view class="default-image-box">
								<u-checkbox shape="circle" v-model="item.checked" labelColor="#FFFFFF" active-color="#19be6b" label-size="24" :name="index" size="24"
								 @change="setDefault(index)">设为封面</u-checkbox>
							</view>
							<view class="default-image-box-mask"></view>
                        </view>
                    </block>
                    <view class="pre-item">
                        <u-upload ref="imageUpload" :action="imageUploadUrl" :show-tips="false" :disabled="hiddImageUpload" :auto-upload="true"
                        :max-count="imageMaxCount" :upload-text="imageUploadText" :show-upload-list="false" @on-success="imageUploadSuccess"
                        @on-error="uploadError">
                            <view slot="addBtn" class="slot-btn" hover-class="slot-btn__hover" hover-stay-time="150">
                                <u-icon name="camera" size="60" :color="$u.color['lightColor']"></u-icon>
                                <view>{{imageUploadText}}</view>
                            </view>
                        </u-upload>
                    </view>
                </view>
            </view>
            <!--/图片上传-->
            <u-form-item label="表单项" label-width="160rpx" :border-bottom="true">
                        //...	
            </u-form-item>
        </u-form>
    </view>
</template>

上传代码片段前后都定义了一个form-item组件,你可跟实际需要增加或者删除就可以了。

script部分

<script>
export default{
    data(){
        return{
            //form提交表单
            form:{
                coverImage:""
            },
            rules:{},//表单校验规则
            imageMaxCount: 10,//最多上传多少张
			imageList: [],//上传完成后的图片列表
            imageUploadText: "",//上传组件的文字
            hiddImageUpload: false,//是否隐藏上传组件
            imageIndex: 0,//图片索引
            imageUploadUrl: this.$settings.uploadUrl,//上传图片的API地址
            errorType: ['border-bottom', 'toast'],//出差提示,参考uView的form组件
        }
    },
    onReady() {
        this.$refs.uForm.setRules(this.rules);
    },
    onLoad(){
        this.initUploadText();
    },
    methods(){
        initUploadText(){
            this.imageUploadText = this.imageMaxCount - this.imageList.length + "/" + this.imageMaxCount;
			this.hiddImageUpload = (this.imageMaxCount - this.imageList.length) == 0 ? true : false;
        },
        deleteItem(index) {
            this.imageList.splice(index, 1);
            this.$refs.imageUpload.remove(index);
            this.initUploadText()
        },
        uploadError() {
            this.$u.toast('上传失败!');
        },
        imageUploadSuccess(data, index, lists, name) {
            let that = this;
            if (data.status == 200) {
                let itemData = data.data;
                itemData.url = itemData.url;
                itemData.index = index;
                that.imageList.push(itemData);
                that.initUploadText();
            } else {
                that.$u.toast('上传失败!');
            }
        },
        setDefault(index) {
            let that = this;
            that.imageList = that.imageList.map(function(item, _index, arr) {
                if (index == _index) {
                    item.checked = true;
                    that.form.coverImage = item.url;
                } else {
                    item.checked = false;
                }
                return item;
			});
		},
    }
}
</script>

data部分已经有了注释了,不做特别说明。
上传组件定义了ref="imageUpload",可以通过ref手动操作图片的upload(手动上传图片)clear(清空内部文件列表)reUpload(重新上传)remove(index):删除某张图片,index为imageList的索引。这个看实际需要,自己实现一下就可以了。

onReadythis.$refs.uForm.setRules(this.rules); 主要功能是设置表单验证,根据实际需要自行决定,非必须的哦!
initUploadText:方法是设置上传的文字,也就是那个15/15。
deleteItem:方法是删除图片列表中的某张图片。这里就用到了ref="imageUpload"的手动方法this.$refs.imageUpload.remove(index);
uploadError:上传图片出错的提示。
imageUploadSuccess:图片上传成功要做的一些事情。
setDefault:设置封面图。

样式

<style>
.container{padding:0 30rpx}
.font-size-16{font-size:32rpx;}
.text-9B9B9B{color:#9B9B9B}
.margin-top-10{margin-top:2orpx;}
.padding-vertical-15{padding:30rpx 0;}
.pre-box {display: flex;align-items: center;justify-content: flex-start;flex-wrap: wrap;}
.pre-item {width: 160rpx;height: 160rpx;overflow: hidden;position: relative;margin-right: 10rpx;margin-bottom: 20rpx;}
.pre-item-image {width: 100%;height: 160rpx;}
.u-delete-icon {position: absolute;top: 0rpx;right: 0rpx;z-index: 10;background-color: #fa3534;border-radius: 100rpx;width: 44rpx;height: 44rpx;display: flex;align-items: center;justify-content: center;}
.slot-btn {width: 160rpx;height: 160rpx;display: flex;justify-content: center;align-items: center;background: rgb(244, 245, 246);border-radius: 10rpx;flex-direction: column;}
.slot-btn__hover {background-color: rgb(235, 236, 238);}
</style>

总结

暂无,下次再会!


点击下方公众号卡片,关注我!一起学习,一起进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html简洁漂亮的个人简历,个人主页,个人简介网页版(源码)

文章目录1.设计来源1.1 主界面1.2 基本资料1.3 专业技能1.4 教育经历1.5 工作经验2.效果和源码2.1 动态效果2.2 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/128349160 html简洁漂亮的个人简历,个人主页…

[深度学习基础]2.pycharm联合annaconda生成虚拟环境测试yoloV7

“戏过曼巴晃过神”1. 环境说明2. yoloV7的准备和说明2.1 yoloV7源码2.2 权重文件3. anaconda生成配套虚拟环境4. Pycharm联合conda虚拟环境1. 环境说明 承接上一篇&#xff0c;我们的软件如下&#xff08;我拿笔记本跑&#xff09;&#xff1a; python:3.9pycharm: 22.3GPU:…

【C语言进阶】参加面试怎能不会结构体?进来学,手把手教会你结构体的原理与使用

目录 &#x1f929;前言&#x1f929;&#xff1a; &#x1f92f;正文&#xff1a;结构体&#x1f92f;&#xff1a; 1.结构概述&#x1f357;&#xff1a; 2.结构的声明&#x1f354;&#xff1a; 3.特殊声明&#x1f35f;&#xff1a; 4.结构的自引用&#x1f363;&#xf…

32位处理器中,通过汇编指令实现64位数据的加减运算

32位处理器一次可以处理的数据是32bit&#xff0c;但如果是64bit的数据&#xff0c;依然可以运算&#xff0c;只是不能一步到位。下面以加法为例。 目录 1、基本思路 2、具体实现 (1) 将数据保存到寄存器 (2) 低32位相加 (3) 高32位相加 3、完整汇编代码 1、基本思路 一…

ODN 2006丨艾美捷CpG ODN系列说明书

艾美捷CpG ODN系列——ODN 2006&#xff1a;具有硫代磷酸酯骨架的CpG寡脱氧核苷酸&#xff08;B型&#xff09;。人和小鼠TLR9&#xff08;Toll样受体9&#xff09;的特异性配体。 艾美捷CpG ODN 丨ODN 2006化学性质&#xff1a; 序列&#xff1a;5-tcgtcttttgtcgttttgtgtcgtt…

非零基础自学Golang 第8章 包管理 8.8 Go语言命名规范 8.9 小结 8.10 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第8章 包管理8.8 Go语言命名规范8.8.1 驼峰式命名法8.8.2 导出标识符8.9 小结8.10 知识拓展8.10.1 标准包简介第8章 包管理 8.8 Go语言命名规范 对于Go语言命名规范&#xff0c;每一家公司根据自己的实际情况可能都有不同。 一…

仅仅上线一小时,下载量就破10W!阿里内部Java性能优化实战手册

当时看完这&#xff08;Java程序性能优化实战&#xff09;的时候&#xff0c;感到首先就Java的方方面面讲得比较全&#xff0c;但是不乱。而且每个点都讲得比较清楚&#xff0c;读下来也没有什么盲点。干货非常多。国内少有的能写得这么好的。我看了收获很多。所以这会推荐给朋…

HCIP-Cloud+Service+DevOps+Engineer+V2.0第一章华为端到端 DevOps 概览

HCIP-CloudServiceDevOpsEngineerV2.0第一章华为端到端 DevOps 概览 学习总结&#xff0c;思维导图整理&#xff0c;免费分享。侵权删除 本博文为HCIP-Cloud Service DevOps Engineer V2.0培训系列内容&#xff0c;[完整学习路径](https://education.huaweicloud.com/programs…

M.2、PCIe 和 NVMe 的定义和区别

资料来源&#xff1a;维基百科&#xff0c;电商平台等 文章目录结论M.2PCIeNVMe结论 基于阅读的资料&#xff0c;对三者之间的关系&#xff0c;总结为如下层次结构&#xff1a; M.2 M.2定义了计算机内部扩展卡的外观尺寸和电气接口规范。 外观尺寸&#xff1a; M.2模块的外…

艾美捷西妥昔单抗Cetuximab方案及相关研究

西妥昔单抗Cetuximab属于嵌合型IgG1单克隆抗体&#xff0c;分子靶点为表皮生长因子受体&#xff08;EGFR&#xff09;。EGFR信号途径参与控制细胞的存活&#xff0c;增殖、血管生成、细胞运动、细胞的入侵及转移等。 本品可以以高出内源配体约5到10倍的亲和力与EGFR特异结合&am…

BellmanFord算法与SPFA算法

​​​​​​ BellmanFord算法与SPFA算法 展开 Bellman-Ford Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径&#xff08;SSSP&#xff1a;Single-Source Shortest Path&#xff09;的算法。该算法由 Richard Bellman 和 Lester Ford 分别发表于 1958 年和 1956 年…

nodejs+vue校园用车辆校车管理系统

本项目的应用场景描述如下&#xff1a;为减少学生等待校车的时间&#xff0c;合理安排校车调度&#xff0c;设计并开发一个校车预约系统&#xff0c;系统由手机端、服务器端、车载刷卡端三部分组成。学生通过手机应用&#xff08;或微信应用&#xff09;查看校车运行时段&#…

webpack系列之webpack打包图片多生成空白图片且图片不能正常加载的解决方式

文章の目录参考写在最后我用的是webpack的V5.75.0版本&#xff0c;下面是正确的配置方法 module.exports {...// 所有第三方文件模块的匹配规则module: {rules: [{test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,use: {loader: "url-loader",options: {limit:…

【火热报名中】2022“博客之星”年度总评选重磅启动!

技术人看过来~~2022 这一年&#xff0c;我们遇见了太多的曲折和磨砺&#xff0c;但大家依然保持初心、砥砺向前&#xff0c;用技术人的拳拳之心&#xff0c;抵挡来自时代浪潮的冲击与挑战。为嘉奖勤勉了一年的技术人&#xff0c;也为这一年的种种努力画上圆满的句号&#xff0c…

线性代数之行列式

矩阵的行列式&#xff0c;determinate&#xff08;简称det&#xff09;&#xff0c;是基于矩阵所包含的行列数据计算得到的一个标量。是为求解线性方程组而引入的。 1 行列式的定义 1.1 二阶行列式 对于二阶线性方程组 若b1b2都为0&#xff0c;则称齐次线性方程组&#xff0c;否…

Flutter - PageView(1) 基本用法

如果要实现页面切换和 Tab 布局&#xff0c;我们可以使用 PageView 组件。需要注意&#xff0c;PageView 是一个非常重要的组件&#xff0c;因为在移动端开发中很常用&#xff0c;比如大多数 App 都包含 Tab 换页效果、图片轮动以及抖音上下滑页切换视频功能等等&#xff0c;这…

【10秒在圣诞节做出温馨的圣诞树】

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…

1年就晋升了3级,全靠这份阿里大牛赠送的这份堪称神级架构师手册

又逢“金九银十”&#xff0c;年轻的毕业生们满怀希望与忐忑&#xff0c;去寻找、竞争一个工作机会。已经在职的开发同学&#xff0c;也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而&#xff0c;面试人群众多&#xff0c;技术市场却相对冷淡&#xff0c;…

spring教程

spring 1.spring ioc ​ IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 ​ Spring 通过 Io…

[附源码]Python计算机毕业设计Django葡萄酒销售管理系统论文

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…