当前位置: 首页 > news >正文

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

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.fileNameitem.url = item.fileUrlitem.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中标签还有属性名都不可以用驼峰命名,切记!!!!!,驼峰命名的单词改用 ‘-’ 的写法

相关文章:

  • el-upload 上传逻辑和ui解耦,上传七牛
  • Vue里面elementUi-aside 和el-main不垂直排列
  • ClickHouse 中`MergeTree` 和 `ReplicatedMergeTree`表引擎区别
  • 深入理解机器学习:人工智能的核心驱动力
  • OSPF网络协议
  • 【XR手柄交互】Unity 中使用 InputActions 实现手柄控制详解(基于 OpenXR + Unity新输入系统(Input Actions))
  • Windows环境下常用网络命令使用
  • SIEMENS PLC程序解读 ST 语言 车型识别
  • C++面试复习日记(8)2025.4.25,malloc,free和new,delete的区别
  • HDRnet——双边滤波和仿射变换的摇身一变
  • vite+vue构建的网站项目localhost:5173打不开
  • MYSQL之数据类型
  • 从多类缺陷到高良率跃升|公差分析技术重构动力电池装配精度体系
  • Golang | HashMap实现原理
  • electron-builder 打包安装与启动手动安装,最终解决方案,之前的文章与其他的人都不用看了。
  • 面向对象编程核心:封装、继承、多态与 static 关键字深度解析
  • 使用 uv 工具快速创建 MCP 服务(Trae 配置并调用 MCP 服务)
  • 百度Create2025 AI开发者大会:模型与应用的未来已来
  • 【HTTP/2和HTTP/3的应用现状:看不见的革命】
  • Linux驱动开发快速上手指南:从理论到实战
  • 最高法知识产权法庭:6年来新收涉外案件年均增长23.2%
  • 企业称县政府为拆迁开发借款2亿元逾期未还,河北青龙县:开发搁置,将继续沟通
  • 外卖口水战四天,京东美团市值合计蒸发超千亿港元
  • 光线传媒:正与部分重点地区洽谈主题乐园合作,首款3A游戏预计三年左右推出
  • 中国专家组赴缅开展地震灾害评估工作
  • 【社论】高度警惕AI谣言对网络空间的污染