当前位置:   article > 正文

Vue3 组件封装——文件上传_vue3 上传文件

vue3 上传文件

目录

一、 从本地选取文件

1. 默认方法

 2. 设置其他元素

 二、获取上传的文件

1. 文件名获取

 2. 图片渲染

具体代码

问题出现 !!!


组件库地址:欢迎大家到 Github 中 Star

Skybiu-ui | 一个Vue3组件库A VitePress sitehttps://sky0258.github.io/skybiu-ui/

一、 从本地选取文件

1. 默认方法

使用 input 标签 设置 type = file

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <input type="file">
  11. </body>
  12. </html>


 2. 设置其他元素

直接使用 input 标签设置 type = file 进行选取,要改样式的话,就隐藏 input 标签,设置上传按钮点击事件为 input.click() 进行点击上传

  1. <div class="upContain">
  2. <div class="t-uploader" @click="open">
  3. <input type="file" style="display: none"/>
  4. <i class="iconfont">&#xe889;</i><br />
  5. <span>将文件拖到此处,或点击上传</span>
  6. </div>
  7. <span>只能上传图片,且不能超过 500M </span>
  8. </div>
  9. <script>
  10. const open = () => {
  11. const input = document.querySelector('input')
  12. input.click();
  13. };
  14. </script>

效果如下

 二、获取上传的文件

1. 文件名获取

文件信息的获取相对简单,在 input 标签上绑定 change 事件,默认参数中 e.target.files 就是上传文件数组中的详细信息

将文件信息存入全局数组中,在 DOM 中渲染

  1. <div>
  2. <tButton @click="open">点击上传文件</tButton>
  3. <input
  4. type="file"
  5. style="display: none"
  6. @change="getFile"
  7. />
  8. <span class="message">只能上传...文件,且不超过...</span>
  9. // 文件列表渲染
  10. <div class="fileList">
  11. <li v-for="(item, index) in fileList" :key="index">
  12. <span><i class="iconfont">&#xe6cc;</i>{{ item.name }}</span>
  13. <i class="iconfont" @click="deleteFile(index)">&#xe600;</i>
  14. </li>
  15. </div>
  16. </div>
  17. <script>
  18. const open = () => {
  19. const input = document.querySelector('input')
  20. input.click();
  21. };
  22. const fileList = [];
  23. const getFile = (e) => {
  24. // 将新上传的文件加入数组
  25. fileList.unshift(...e.target.files);
  26. };
  27. // 文件删除
  28. const deleteFile = (index) => {
  29. fileList.splice(index, 1);
  30. };
  31. </script>

 2. 图片渲染

  • new 一个 FileReader 实例,并调用 readAsDataURL 方法传入参数 file 来读取选中的图像文件,最后在 onload 事件中,获取到成功读取的文件内容。
  • 最后插入一个 img 节点设置 src = reader.result 显示选中的图片

具体代码

  1. function readFile(file){
  2. var reader = new FileReader();
  3. reader.readAsDataURL(file);
  4. reader.onload = function(e){
  5. // 图片内容
  6. console.log(reader.result);
  7. }
  8. }
'
运行

后台打印

 这些一长串的东西设置成 img 标签的 src 路径值就会显示出你上传的照片了

问题出现 !!!

如果你想把路径都放进一个数组中,然后再组件中,循环渲染出图片的话,你会发现你在全局申请一个变量 imgSrc ,然后在 onload 中设置

imgSrc = reader.result;

结果是无效的,imgSrc 的值并没有发生变化

这是由于 onload 是异步的,所以无法直接赋值,那么只能采取 promise 进行处理

具体代码

  1. // 处理文件函数
  2. function getSrc(file) {
  3. return new Promise(function (resolve, reject) {
  4. var reader = new FileReader();
  5. reader.readAsDataURL(file);
  6. reader.onload = () => {
  7. console.log(reader.result);
  8. resolve(reader.result);
  9. };
  10. });
  11. }
  12. const imgList = [];
  13. // 获取文件路径放入 imgList 数组
  14. const getImgFile = (e) => {
  15. const files = e.target.files;
  16. for(const file of files) {
  17. getSrc(file)
  18. .then((res) => {
  19. imgList.push(res);
  20. })
  21. .catch((err) => {
  22. console.log(err);
  23. });
  24. }
  25. }
'
运行

组件中循环渲染

  1. <ul class="imageList">
  2. <li v-for="(src, index) in imgList" :key="index">
  3. <img :src="src" alt="" />
  4. </li>
  5. </ul>

效果图

这样就可以成功获取图片啦!!!


声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号