利用Element-UI的upload组件实现文件的上传以及样式变化

最近在做项目的时候遇到在浏览器中上传视频的需求,使用Element-UI的upload组件。具体效果如下

总的来说是很简单的,但一定要仔细对照官方文档,并且因为我使用了typescript,其中也遇到了一个坑。

对照了一下官方文档,所需要注意的部分:

  1. 只能上传一个视频并且禁止多选 :limit="1"accept="video/*":multiple="false"
  2. 当重复上传时弹出错误弹窗 :on-exceed="exceed"
  3. 当有文件被选中时,样式会如图发生变化
  4. 同时实现选择上传与拖拽上传
  5. 手动上传,即用户选中上传按钮之后才进行上传:auto-upload="false"
  6. 上传中后台返回进度,并利用<el-progress>显示实时进度(因为目前还没有后台数据所以这部分还是静态的)

具体代码如下:

<div class="upload" v-show="!uploadTrue">
    <el-upload ref="upload" drag action="https://jsonplaceholder.typicode.com/posts/" accept="video/*" :multiple="false" :limit="1" :on-remove="remove" :on-change="handleChange" :file-list="fileList" :on-exceed="exceed" :auto-upload="false" :on-progress="uploading">
        <img src="../../../static/imgs/upload_img_file.png" alt="" class="uploadImg">
        <p class="text1">拖拽文件至此区域</p>
        <p class="text2" id="text2"></p>
        <p class="text3" id="text3">浏览本地文件</p>
    </el-upload>
</div>
methods: {
    uploading() {
        //上传中
        console.log("uploading")
        if (this.uploadProgress == 100) {
            //上传完成
            this.uploadStatus = true
        }
    },
    handleChange() {
        //添加文件(样式变化)
        var el:any = document.getElementById("text2")
        var ele:any = document.getElementById("text3")
        if(this.fileList != null) {
            el.style.display = "none"
            ele.style.display = "none"
        }
    },
    remove() {
        //删除视频的钩子
        var el:any = document.getElementById("text2")
        var ele:any = document.getElementById("text3")
        el.style.display = "inline-block"
        ele.style.display = "inline-block"
    },
    exceed() {
        //重复选择文件,弹出错误弹窗
        this.$alert("最多仅支持上传一个视频文件")
    },
    uploadVideo() {
        //上传文件
        let element:any = this.$refs.upload
        element.submit();
        //
        //开始上传
        //服务端返回进度uploadProgress
        this.uploadTrue = true
    }
}

使用typescript中遇到的坑

根据官方文档,当使用手动上传时在<el-upload> 中 使用 ref="upload",并在上传的函数中使用this.$refs.upload.submit()。但是,一直报错

  Property 'submit' does not exist on type 'Vue | Element | Vue[] | Element[]'.
  Property 'submit' does not exist on type 'Vue'.

上网查了很久,发现是在typescript中无法识别vue中的$refs并且ts使用强类型,必须先使用any来进行声明

    let element:any = this.$refs.upload
    element.submit();
全部评论

相关推荐

对空六翼:你真幸运,碰见这么好的人,不像我,秋招的时候被室友骗进cx了
实习好累,可以辞职全力准...
点赞 评论 收藏
分享
01-30 09:45
燕山大学 Java
喵_coding:这种直接跑就完事了 哪有毕业了才签合同 任何offer和三方都没有的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
10946次浏览 94人参与
# 你的实习产出是真实的还是包装的? #
1942次浏览 42人参与
# 米连集团26产品管培生项目 #
6022次浏览 216人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7623次浏览 43人参与
# 简历第一个项目做什么 #
31733次浏览 339人参与
# 重来一次,我还会选择这个专业吗 #
433530次浏览 3926人参与
# 巨人网络春招 #
11360次浏览 223人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187188次浏览 1122人参与
# 牛客AI文生图 #
21445次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152437次浏览 888人参与
# 研究所笔面经互助 #
118956次浏览 577人参与
# 简历中的项目经历要怎么写? #
310344次浏览 4217人参与
# AI时代,哪些岗位最容易被淘汰 #
63796次浏览 826人参与
# 面试紧张时你会有什么表现? #
30508次浏览 188人参与
# 你今年的平均薪资是多少? #
213127次浏览 1039人参与
# 你怎么看待AI面试 #
180118次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64331次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76533次浏览 374人参与
# 我的求职精神状态 #
448118次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363485次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160671次浏览 1112人参与
# 校招笔试 #
471119次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务