cc-uploadSomePic图片上传组件:快速开发与用户体验的提升

news2025/2/25 11:58:05

cc-uploadSomePic图片上传组件:快速开发与用户体验的提升

摘要:
在前端开发中,图片上传功能是一个常见的需求。为了提高开发效率和用户体验,我们开发了一个名为cc-uploadSomePic的图片上传组件。该组件支持单个或多个文件上传,具有自定义上传数量、图片压缩、限制大小等功能。本文将详细介绍cc-uploadSomePic组件的实现原理和使用方法,以及如何通过它快速实现图片上传功能。

一、引言

随着移动互联网的普及,用户上传图片的需求日益增长。为了满足这一需求,许多应用和网站都提供了图片上传功能。然而,实现一个稳定、高效且用户体验良好的图片上传组件并不容易。为了简化这一过程,我们开发了cc-uploadSomePic组件,它封装了图片选择、显示和上传的逻辑,使开发者能够快速实现强大的图片上传功能。

二、cc-uploadSomePic组件介绍

cc-uploadSomePic是一个基于Vue的自定义组件,它提供了以下功能:

  1. 图片选择及预览:用户可以通过点击事件选择图片,并实时预览选择的图片。

  2. 自定义上传数量:开发者可以根据需要设置上传的图片数量限制。

  3. 图片压缩:支持对选择的图片进行压缩,以适应不同的需求和上传限制。

  4. 限制大小:可以限制上传的图片大小,确保不会因过大而导致性能问题。

  5. 事件处理:通过事件机制,开发者可以轻松处理图片选择、上传等事件。

截图如下:

  1. 图片

    图片

    图片

三、使用方法

使用cc-uploadSomePic非常简单,只需在页面中引入并使用该组件即可。以下是使用cc-uploadSomePic的基本步骤:

  1. 安装cc-uploadSomePic:使用npm或yarn将cc-uploadSomePic添加到项目中。

  2. 在页面中引入cc-uploadSomePic:在需要使用图片上传的页面中引入cc-uploadSomePic组件。

  3. 配置属性:根据需求配置cc-uploadSomePic的属性,如:photoList(用于存储已选择的图片数组)等。

  4. 监听事件:根据需要监听cc-uploadSomePic的事件,如click(图片选择事件)等。

  5. 处理事件:在事件处理函数中编写逻辑,处理用户的选择事件和上传事件。

  6. 渲染组件:将cc-uploadSomePic渲染到页面中,即可看到图片上传组件。

四、示例代码

以下是一个简单的示例代码,演示了如何使用cc-uploadSomePic组件:

 
使用方法
复制代码
 <!-- photoList:选择的图片数组  @click:图片选择事件-->
<cc-uploadSomePic  :photoList="photoList" @click="addPhotoClick"></cc-uploadSomePic>

// 添加多张图片(少于6张)
addPhotoClick() {

                uni.hideLoading();

                let myThis = this;
                if (myThis.photoList.length >= 6) {
                    myThis.photoList = [];
                }
                uni.chooseImage({
                    count: 6,
                    sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
                    sourceType: ['album'], //从相册选择
                    success: function(res) {

                        for (let j = 0; j < res.tempFilePaths.length; j++) {

                            // name:服务端文件接受key  filePath: 需与服务端文件接收字段保持一致
                            let tmpdict = {
                                'name': 'image',
                                'filePath': res.tempFilePaths[j]
                            };
                            myThis.photoList.push(tmpdict);

                        }

                        console.log('选择图片 =' + JSON.stringify(myThis.photoList));
                    }
                });
            }
HTML代码部分
复制代码
<template>
    <view class="content" v-if="seen">

        <form @submit="formSubmit" @reset="formReset">

            <view class="inputView">
                <text class="leftTitle">交通指引</text>
            </view>

            <textarea class="rightTextarea" name="direct" placeholder=" 请输入交通指引" />

            <view class="inputView">
                <text class="leftTitle">房屋介绍</text>
            </view>

            <textarea class="rightTextarea" name="village" placeholder=" 请输入房屋介绍" />

            <view class="inputView">
                <text class="leftTitle">添加房源照片(最多可添加6张)</text>

            </view>

            <!-- photoList:选择的图片数组  @click:图片选择事件-->
            <cc-uploadSomePic  :photoList="photoList" @click="addPhotoClick"></cc-uploadSomePic>

            <view class="uni-btn-v">
                <button class="botBtn" type="primary" form-type="submit">提交</button>
                <view class="tipText"> 注意事项: 请确保您填写的房屋信息真实无误 </view>

            </view>
        </form>
    </view>
</template>
JS代码 (引入组件 填充数据)
复制代码
<script>
    import Vue from 'vue';

    export default {

        data() {

            return {
                photoList: [],
                seen: true,
                myParamData: {},
                isClick: false,

            };
        },

        onLoad: function(e) {

            if (typeof(e.myParamData) === 'string') {
                this.myParamData = JSON.parse(e.myParamData);
                console.log('页面3 数据 = ' + JSON.stringify(e));

            }

        },
        methods: {

            formSubmit: function(e) {
                console.log('form发生了submit事件,携带数据为:' + JSON.stringify(e.detail.value));

                if (this.isClick) {
                    let that = this;
                    setTimeout(function() {
                        that.isClick = false;
                    }, 600)
                    return;
                }
                this.isClick = true;

                var formdata = e.detail.value;
                this.myParamData = Object.assign(this.myParamData, formdata);

                console.log('页面3 myParamData=' + JSON.stringify(this.myParamData));

                if (formdata['direct'].length < 2) {
                    uni.showModal({
                        content: '请输入交通指引',
                        showCancel: false
                    });
                    return;
                }
                if (formdata['village'].length < 2) {
                    uni.showModal({
                        content: '请输入所在小区介绍',
                        showCancel: false
                    });
                    return;
                }
                if (this.photoList.length < 1) {
                    uni.showModal({
                        content: '请添加房源照片',
                        showCancel: false
                    });
                    return;
                }
                if (this.photoList.length > 6) {
                    uni.showModal({
                        content: '最多只能选择提交6张图片',
                        showCancel: false
                    });
                    return;
                }

                uni.showLoading({
                    title: '上传中'
                })

                // 服务器地址上传地址 仅为示例,非真实的接口地址
                let baseUrl = "http://gzcc.com/cc//appSc/up"
                console.log('图片资源 = ' + JSON.stringify(this.photoList))
                console.log('请求参数 = ' + JSON.stringify(this.myParamData));
                uni.uploadFile({
                    url: baseUrl, //仅为示例,非真实的接口地址
                    files: this.photoList, //请求图片数组
                    formData: this.myParamData, //请求参数
                    success: (uploadFileRes) => {

                        uni.hideLoading();
                        console.log('上传成功 = ' + uploadFileRes.data);
                    }
                });

            },
            // 添加多张图片(少于6张)
            addPhotoClick() {

                uni.hideLoading();

                let myThis = this;
                if (myThis.photoList.length >= 6) {
                    myThis.photoList = [];
                }
                uni.chooseImage({
                    count: 6,
                    sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
                    sourceType: ['album'], //从相册选择
                    success: function(res) {

                        for (let j = 0; j < res.tempFilePaths.length; j++) {

                            // name:服务端文件接受key  filePath: 需与服务端文件接收字段保持一致
                            let tmpdict = {
                                'name': 'image',
                                'filePath': res.tempFilePaths[j]
                            };
                            myThis.photoList.push(tmpdict);

                        }

                        console.log('选择图片 =' + JSON.stringify(myThis.photoList));
                    }
                });
            }

        }
    };
</script>

下载完整组件地址:请关注我的微信技术公众号: 前端组件开发

d848d5658a07453c843277846948c608.png

欢迎加入前端组件开发学习交流群,一起学习成长!可关注  “前端组件开发” 公众号后,私信后可申请入群。

图片

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

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

相关文章

Linux下使用ntpdate进行时间同步

1.简介 ntpdate是Linux下用于从NTP服务器同步时间的命令行工具。 2.安装 大多数Linux发行版已预装ntpdate。未安装的可使用以下命令&#xff1a; # Ubuntu/Debian sudo apt-get install ntpdate # CentOS/Fedora/RHEL sudo yum install ntpdate 3.手工同步网络时间 执行以下命…

JavaScript中的继承方式详细解析

什么是继承 继承是面向对象编程中的一个重要概念&#xff0c;它指的是一个对象&#xff08;或类&#xff09;可以获得另一个对象&#xff08;或类&#xff09;的属性和方法。在继承中&#xff0c;被继承的对象通常称为父类&#xff08;或基类、超类&#xff09;&#xff0c;继…

prince2和Pmp哪个含金量高?

一&#xff0c;认证情况 1、PMP(项目管理专业人士资格认证)是PMI( 美国项目管理协会 )最有影响力的证书&#xff0c;PMBOK( 项目管理知识体系指南 )是PMP的认证标准&#xff0c;是美国国家项目管理标准&#xff0c;PMI会员有70%集中在北美&#xff0c;PMP认证在北美地区很受欢…

基础乱炖来吧

1,SSH框架和SSM区别 SSH&#xff1a;structspringhibernate&#xff0c;SSM&#xff1a;MVCspringmybatis struct入口是filter级别&#xff0c;对action类进行请求&#xff0c;一个action类对应一个请求、类拦截&#xff1b;spring-mvcservlet级别&#xff0c;方法级别请求&…

【ESP32 IDF】ESPTIMER定时器

文章目录 前言一、ESPTIMER定时器的介绍1.1 定时器是什么1.2 ESPTIMER定时器的介绍 二、ESPTIMER的使用2.1 简单使用过程2.2 停止定时器2.3 删除定时器 三、示例代码总结 前言 在ESP32 IDF开发框架中&#xff0c;ESPTIMER是一个功能强大的定时器模块&#xff0c;用于实现定时任…

武汉星起航引领跨境电商风潮,五对一服务体系助力卖家飞跃成长

在全球贸易蓬勃发展的背景下&#xff0c;跨境电商行业迎来了前所未有的机遇与挑战。在这一领域中&#xff0c;武汉星起航电子商务有限公司以其专业的运营团队和优质的服务&#xff0c;成为众多跨境卖家的首选合作伙伴。 武汉星起航自2020年创立以来&#xff0c;始终致力于为跨…

前端项目ip做域名映射

1、在阿里云、腾讯云购买域名 SSL 证书和私钥生成 阿里云生成证书详解 /path/to/your/ssl_certificate1.crt和/path/to/your/ssl_certificate1.key 生成私钥&#xff08;key&#xff09;&#xff1a; 使用 OpenSSL 工具生成一个私钥文件。执行以下命令&#xff1a; openss…

基于python高校选课系统设计与实现flask-django-nodejs-php

随着互联网技术的不断发展&#xff0c;高校选课系统的建设和应用已成为当前高校教育改革的重要方向。选课系统作为高校教务管理的重要组成部分&#xff0c;对于提高教学质量、提高学生的学习效率、优化教学资源配置具有重要的意义。本论文旨在探讨高校选课系统的设计与实现。随…

StringTable(字符串常量池)

目录 String的基本特性 String的内存分配 字符串拼接操作 intern()的使用 String的基本特性 String&#xff1a;字符串&#xff0c;使用一对""引起来表示 String声明为final的&#xff0c;不可被继承 String实现了Serializable接口&#xff1a;表示字符串是支持…

TIMESNET: TEMPORAL 2D-VARIATION MODELINGFOR GENERAL TIME SERIES ANALYSIS

本文整理至https://zhuanlan.zhihu.com/p/606575441这里是清华大学软件学院机器学习组官方公众号(THUML-LAB)&#xff0c;欢迎关注我们&#xff0c;获取最新资讯&#xff01; 本文介绍本组ICLR2023时间序列分析方向的最新工作&#xff1a;TimesNet: Temporal 2D-Variation Mode…

Python 实现1~100之间的偶数求和

result0 for i in range(101):if i%20:result result i print(result) 或者 result0 for i in range(2,101,2):result result i print(result)

从零开始学习如何使用 Postman 请求头

当你在使用 Postman 发送请求时&#xff0c;请求头&#xff08;Headers&#xff09;是你可以包含在 HTTP 请求中的重要部分之一。请求头包含了关于请求的元数据信息&#xff0c;这些信息对于服务器来处理请求是非常重要的。下面是一份详细的图文介绍&#xff0c;说明了如何在 P…

BUUCTF-Misc10

秘密文件1 1.打开附件 是一个流量包 2.Wireshark 用Wireshark打开 右键追踪tcp追踪流&#xff0c;发现一个以.rar结尾的压缩包 3.foremost 用foremost分离文件 发现有一个rar的文件夹 文件夹内有个加密的压缩包 4.ARCHPR 用ARCHPR工具对压缩包进行解密 5.得到flag [BJDCTF2…

【C语言进阶篇】自定义类型:结构体(上)

目录 1. 结构体类型的声明 ​编辑 1.1 结构体的创建和初始化 1.2 结构体的特殊声明 1.3 结构体的自引用 2. 结构体内存对齐 2.1 对齐规则 2.2 为什么存在内存对齐 2.3 修改默认对齐数 在我们描述简单对象的时候&#xff0c;使用已有的类型就足够了&#xff0c;比如: 但是当我们…

数据结构从入门到精通——排序的概念及运用

排序的概念及运用 前言一、排序的概念排序稳定性内部排序外部排序 二、排序运用三、常见的排序算法四、排序性能检测代码srand()clock() 五、oj排序测试代码 前言 排序是将数据按照一定规则重新排列的过程&#xff0c;常见规则有升序、降序等。排序算法如冒泡排序、快速排序等…

基于php健身房管理系统flask-django-python

根据现实需要&#xff0c;此系统我们设计出一下功能&#xff0c;主要有以下功能模板。 &#xff08;1&#xff09;前台功能&#xff1a;首页、运动器材、教练信息、营业信息、公告栏、在线留言、后台管理、个人中心。 &#xff08;2&#xff09;会员功能&#xff1a;首页、个人…

力扣700 二叉搜索树中的搜索 Java版本

文章目录 题目描述代码 题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,…

C++_day6:2024/3/18

作业1&#xff1a;编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在…

一文读懂Partisia区块链的MOCCA 方案:让资产管理可信且可编程

在今年 1 月&#xff0c;Partisia Blockchain 在参加了达沃斯世界经济论坛时&#xff0c;宣布推出一种全新的链上资产管理方案 MOCCA &#xff08;MPC On-Chain Custody Advanced&#xff09;&#xff0c;即多方计算链上托管高级解决方案。据悉该方案建立在 Partisia Blockchai…