vue输入框粘贴图片并上传

vue输入框粘贴图片并上传

首先需要确认的是 input输入框是无法 粘贴/显示 图片类型的,那怎么实现呢?

既然input用不了,那就模仿一个input,这里用到的是HTML5新增的一个属性contenteditable

​ contenteditable 属性值为Boolean类型,规定元素内容是否可编辑。如果元素未设置 contenteditable 属性,那么元素会从其父元素继承该属性。 即,如果父元素可编辑,该子元素也可编辑。

<div contenteditable="true" 
     class="textareaSty">
</div>
<style>
    .textareaSty {
        width: 160px;
        height: 210px;
        resize: none;
        border: 1px solid #d2d2d2;
        border-radius: 4px;
      }
</style>

是的,只需要加上这么一个属性,就可以创建一个可编辑的区域。(可以粘贴网络复制和屏幕截图的图片, 本地复制的还不行~ 这个问题后面再优化,至少现在实现了图片的粘贴/显示)

核心代码

现在只是在页面上显示出了图片,但是图片数据没有拿到还无法上传,这里可以使用paste方法:

<div contenteditable="true" class="textareaSty" id="pasteContent"
     @paste="pasteImg($event)">
    <!-- vue 可以直接使用@paste 默认参数就是event 如需传其它参数写出$event -->
    <!-- 也可以使用js的addEventListener监听paste -->
</div>
// 粘贴图片并自动提交至接口
const pasteImg = async (e: any) => {
    const { items } = e.clipboardData; // 获取粘贴板文件对象
    if (items.length) {
      for (const item of items) {
        if (item.type.indexOf('image') !== -1) {
          const file = item.getAsFile(); // 获取图片文件
          if (file) {
            const formData = new FormData();
            formData.append('file', file);
            // 接口返回的是图片线上地址
            const res: any = await uploadImg(formData);
            if (res.code === 0) {
              // 本地图片复制粘贴无法显示的 可以在拿到图片地址后用变量暂存起来
              // 替换掉dom 将变量绑定到新dom下img标签的src上
              imgUrl = res.data;
              ElMessage({
                type: 'success',
                message: res.msg,
              });
            } else {
              ElMessage({
                type: 'error',
                message: res.msg,
              });
            }
          }
        }
      }
    }
  };

到这里就实现了粘贴上传图片的功能;

优化

还可以再优化一下,加上自动获取焦点 和 删除按钮

// 点击自动聚焦
clickPaste() {
    const pasteContent = document.getElementById('pasteContent');
    pasteContent?.focus(); // 点击粘贴时 聚焦dom
},
// 在dom添加 x icon 点击删除已导入图片
  const removeImg = () => {
    const div = document.getElementById('pasteContent');
    if (div.childNodes.length) {
      const img: any = div.childNodes;
      div.removeChild(img[0]);
      // 判断 已导入图片的话 清空
      if (imgUrl) {
        imgUrl = '';
      }
    }
  };
以上就是我实现的粘贴获取图片功能 配合element的el-upload组件使用让上传图片方式更全面、便捷
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值