在html中如何创建vue自定义组件(以自定义文件上传组件为例,vue2+elementUI)

news2025/4/26 5:30:31

1、先上代码:vueUpload.js

var dom = `<div class="upload-file">
        <el-upload :action="uploadFileUrl" :before-upload="handleBeforeUpload" :file-list="fileList" :limit="limit"
            :on-error="handleUploadError" :on-exceed="handleExceed" :on-success="handleUploadSuccess"
            :show-file-list="false" :headers="headers" class="upload-file-uploader" ref="upload">
            <!-- 上传按钮 -->
            <el-button size="mini" type="primary">选取文件</el-button>
            <!-- 上传提示 -->
            <div class="el-upload__tip" slot="tip" v-if="showTip">
                请上传
                <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
                <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
                的文件
            </div>
        </el-upload>

        <!-- 文件列表 -->
        <div>
            <div :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in list"
                v-if="file.url != null" style="display:flex;justify-content:space-between;align-item:center;max-width:300px;over-flow:hidden;text-overflow:ellipsis;white-space:nowrap;border: 1px solid #ddd;padding: 0 10px;cursor: pointer;">
                <el-link :href="file.url" :underline="false" target="_blank">
                    <span class="el-icon-document"> {{ file.name }} </span>
                </el-link>
                <div class="ele-upload-list__item-content-action">
                    <el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>
                </div>
            </div>
        </div>
    </div>`

    var demoComponent = Vue.extend({
        template:dom,
        props: {
            // 值
            value: [String, Object, Array],
            // 大小限制(MB)
            fileSize: {
                type: Number,
                default: 5,
            },
            // 文件类型, 例如['png', 'jpg', 'jpeg']
            fileType: {
                type: Array,
                default: () => ["doc", "xls", "ppt", "txt", "pdf"],
            },
            // 是否显示提示
            isShowTip: {
                type: Boolean,
                default: true
            },
            limit: {
                type: Number,
                default: 9
            }
        },
        data:function(){
          return {
            uploadFileUrl: '/file/rest/common/upload', // 上传的图片服务器地址
            headers: {
                Authorization: 'Bearer 123'
            },
            fileList: [],
          }
        },
        created() {
            this.fileList = this.list;
        },
        mounted() {
            console.log(this);
        },
        computed: {
            // 是否显示提示
            showTip() {
                return this.isShowTip && (this.fileType || this.fileSize);
            },
            // 列表
            list() {
                let temp = 1;
                if (this.value) {
                    const list = this.value;
                    return list.map((item) => {
                        item.name = item.fileName
                        item.url = item.fileUrl
                        item.uid = item.uid || new Date().getTime() + temp++;
                        return item;
                    });
                } else {
                    this.fileList = [];
                    return [];
                }
            },
        },
        methods:{
          // 上传前校检格式和大小
            handleBeforeUpload(file) {
                // 校检文件类型
                if (this.fileType) {
                    let fileExtension = "";
                    if (file.name.lastIndexOf(".") > -1) {
                        fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
                    }
                    const isTypeOk = this.fileType.some((type) => {
                        if (file.type.indexOf(type) > -1) return true;
                        if (fileExtension && fileExtension.indexOf(type) > -1) return true;
                        return false;
                    });
                    if (!isTypeOk) {
                        this.$message.error(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
                        return false;
                    }
                }
                // 校检文件大小
                if (this.fileSize) {
                    const isLt = file.size / 1024 / 1024 < this.fileSize;
                    if (!isLt) {
                        this.$message.error(`上传文件大小不能超过 ${this.fileSize} MB!`);
                        return false;
                    }
                }
                return true;
            },
            // 文件个数超出
            handleExceed(e) {
                if(this.limit == 1) {
                    this.$message.error(`只能上传一个文件,请先删除原文件后重新上传!`);
                } else {
                    this.$message.error(`上传文件数量不能超过 ${props.limit} 个!`);
                }
            },
            // 上传失败
            handleUploadError(err) {
                this.$message.error("上传失败, 请重试");
            },
            // 上传成功回调
            handleUploadSuccess(res, file) {
                this.fileList.push({name:res.data.name, url:res.data.url, fileName:res.data.name, fileUrl:res.data.url})
                this.$message.success("上传成功");
                this.$emit("input", this.fileList);
            },
            // 删除文件
            handleDelete(index) {
                this.fileList.splice(index, 1);
                this.$emit("input", this.fileList);
            },
            // 获取文件名称
            getFileName(name) {
                if (name.lastIndexOf("/") > -1) {
                    return name.slice(name.lastIndexOf("/") + 1).toLowerCase();
                } else {
                    return "";
                }
            }
        },
       })
       
       Vue.component('vue-upload',demoComponent)
       

2、在html中使用,在html中引入上面的vueUpload.js自定义组件文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
    <script src="https://unpkg.com/vue@2/dist/vue.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <!-- 引入自定义上传组件 -->
    <script src="./vueUpload.js"></script>
</head>
<body>
    <div id="app">
      <vue-upload v-model="fileList" :limit="1" :file-type="['doc','docx','pdf']" :file-size="50"></vue-upload>        
    </div>
    <script>
      var app = new Vue({
        el: '#app',
        data () {
          return {
           fileList:[{fileName:'测试.pdf',fileUrl:'http://www.baidu.com/img/bd_logo1.png'}],
          }
        },
        mounted () {
         
        },
        methods: {
        }
      })
    </script>
</body>
</html>

3、展示效果

总结:在html中使用vue创建自定义组件和在vue中创建自定义组件基本一样,只不过写在js里最后记得把自定义组件通过Vue.component('vue-upload',demoComponent),挂载到vue上,还有在html中标签还有属性名都不可以用驼峰命名,切记!!!!!,驼峰命名的单词改用 ‘-’ 的写法

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

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

相关文章

《使用 Cesium 加载静态热力图显示的实现步骤》

Cesium——使用cesium 加载静态热力图显示 实现思路 要在 Cesium 中加载静态热力图&#xff0c;我们需要完成以下几个主要步骤&#xff1a; 1、计算热力图数据的四至范围和中心点。 2、初始化热力图并设置相关参数。 3、将数据添加到热力图中。 4、定位到热力图的位置并刷…

mfc学习(一)

mfc为微软创建的一个类qt框架的客户端程序&#xff0c;只不过因为微软目前有自己 的亲身儿子C#&#xff08;.net&#xff09;,所以到2010没有进行维护。然后一些的工业企业还在继续进行维护相关的内容。我目前就接手一个现在这样的项目&#xff0c;其实本质与qt的思路是差不多的…

ThreadLocal详解与实战指南

目录 1. ThreadLocal基本概念 1.1 核心原理 1.2 主要特性 2. ThreadLocal API详解 2.1 核心方法 2.2 基本使用方式 3. ThreadLocal使用场景与实战 3.1 场景一&#xff1a;用户身份信息传递 实现步骤 1.创建用户上下文类 2.创建过滤器或拦截器来设置和清理用户信息 …

【含文档+PPT+源码】基于微信小程序的校园快递平台

项目介绍 本课程演示的是一款基于微信小程序的校园快递平台&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带…

【CODEMATE】进制转换(transform) 粤港澳青少年信息学创新大赛 C/C++/Python 解题思路

目录 问题描述做题思路&#xff0c;解决过程思路&#xff1a;踩过的坑&#xff1a;核心代码C 语言 / C 切片&#xff1a;C 语言 / C 判断 ‘A’ 数量&#xff1a;Python 切片&#xff1a;Python 判断 ‘A’ 数量&#xff1a; 完整代码C 语言 完整代码C 完整代码Python 完整代码…

2025 Java 开发避坑指南:如何避免踩依赖管理的坑?

在 Java 开发的世界里&#xff0c;依赖管理就像是一座看不见的桥梁&#xff0c;连接着项目所需的各种第三方库和框架。然而&#xff0c;这座桥梁并非总是稳固&#xff0c;稍有不慎就可能掉入 “依赖地狱”&#xff0c;导致项目编译失败、运行异常。2025 年&#xff0c;随着开源…

ARM服务器与X86服务器核心区别分析

ARM服务器与X86服务器核心区别分析 一、架构设计与指令集差异 指令集本质‌ ARM‌&#xff1a;基于RISC&#xff08;精简指令集&#xff09;&#xff0c;指令定长且简单&#xff0c;单周期执行效率高&#xff0c;硬件设计复杂度低&#xff0c;适合低功耗场景。 X86‌&#xf…

人口老龄化丨AI健康小屋如何实现防病于未然​

随着全球老龄化加剧&#xff0c;“银发浪潮” 对医疗资源、养老护理和健康管理提出了严峻挑战。 由此智绅科技应运而生&#xff0c;七彩喜智慧养老系统构筑居家养老安全网。 AI 健康小屋作为银发科技的创新载体&#xff0c;通过智能化健康监测、精准化风险预警、便捷化医疗衔…

记录搭建自己应用中心

记录搭建自己应用中心 应用架构主应用-管理中心系统文件系统子应用 日志系统日志系统前端日志系统后端 用户系统接入使用暂未完成 研发管理需求面板消息推送任务分配应用发布 应用架构 一直想做个试试&#xff0c;这是一个简易版的&#xff0c;主要是整合下知识的&#xff0c;…

git版本回退 | 远程仓库的回退 (附实战Demo)

目录 前言1. 基本知识2. Demo3. 彩蛋 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器&#xff0c;无代码爬取&#xff0c;就来&#xff1a;bright.cn 本身暂存区有多个文件&#xff0c;但手快了&…

STM32 的 GPIO和中断

GPIO的简单介绍 内部结构 施密特触发器&#xff08;TTL肖特基触发器&#xff09; 的工作原理&#xff1a; 施密特触发电路&#xff08;简称&#xff09;是一种波形整形电路&#xff0c;当任何波形的信号进入电路时&#xff0c;输出在正、负饱和之间跳动&#xff0c;产生方波或…

【因果推断】(二)CV中的应用

文章目录 因果表征学习因果图 (Causal Diagram)“后门准则”&#xff08;backdoor criterion&#xff09;和“前门准则”&#xff08;frontdoor criterion&#xff09;后门调整Visual Commonsense R-CNNCausal Intervention for Weakly-Supervised Semantic SegmentationCausal…

分享Matlab成功安装Support Package硬件支持包的方法

分享Matlab成功安装Support Package硬件支持包的方法 文章目录 分享Matlab成功安装Support Package硬件支持包的方法一、 引言二、 操作步骤三、 附件资料四、总结 一、 引言 最近&#xff0c;我想学习基于Matlab simscape & Arduino实现硬件在环仿真&#xff0c;其中物理…

电子级甲基氯硅烷

电子级甲基氯硅烷是一类高纯度有机硅化合物&#xff0c;主要用于半导体制造、光伏产业及高端电子材料领域。以下从技术特性、应用场景、生产工艺、市场动态及安全规范等方面展开分析&#xff1a; 一、核心特性与技术标准 高纯度要求 电子级甲基氯硅烷的纯度通常需达到99.99% 以…

【金仓数据库征文】- 深耕国产数据库优化,筑牢用户体验新高度

目录 引言 一、性能优化&#xff1a;突破数据处理极限&#xff0c;提升运行效率 1.1 智能查询优化器&#xff1a;精准优化数据检索路径 1.2 并行处理技术&#xff1a;充分释放多核计算潜力 1.3 智能缓存机制&#xff1a;加速数据访问速度 二、稳定性提升&#xff1a;筑牢…

热度大幅度下降,25西电经济与管理学院(考研录取情况)

1、经济与管理学院各个方向 2、经济与管理学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、应用经济及学25年相较于24年下降25分&#xff0c;为325分 2、管理科学与工程25年相较于24年保持不变&#xff0c;为375分 3、工商管理学25年相较于24年下降5分…

DeepSeek+Mermaid:轻松实现可视化图表自动化生成(附实战演练)

目录 一、引言&#xff1a;AI 与图表的梦幻联动二、DeepSeek&#xff1a;大语言模型新星崛起2.1 DeepSeek 全面剖析2.2 多场景应用示例2.2.1 文本生成2.2.2 代码编写 三、Mermaid&#xff1a;代码式图表绘制专家3.1 Mermaid 基础探秘3.2 语法与图表类型详解3.2.1 流程图&#x…

今日行情明日机会——20250425

指数依然在震荡&#xff0c;等待方向选择&#xff0c;整体量能不搞但个股红多绿少。 2025年4月25日涨停板行业方向分析如下&#xff1a; 一、核心行业方向及驱动逻辑 一季报增长&#xff08;17家涨停&#xff09; 核心个股&#xff1a;惠而浦、鸿博股份、卫星化学驱动逻辑&am…

一道MySQL索引题

复合索引基础 MySQL中的复合索引(Composite Index)是指由多个列组成的索引。与单列索引不同、复合索引的结构更为复杂&#xff0c;但使用得当可以大幅提升查询性能。 复合索引的工作原理 复合索引的本质是一种有序的数据结、每个列是建立在那个索引前一列存在的情况下、那一…

【linux】设置邮件发送告警功能

当服务器内存不足或者其他故障时&#xff0c;可以通过自动发送故障到邮箱进行提醒。 步骤&#xff1a; 以qq邮箱为例&#xff1a; 登录qq邮箱点击设置 点击账号后&#xff0c;往下翻 找到POP3/IMAP...开启服务 复制授权码 安装邮箱功能 编辑/etc/s-nail.rc 验证 …