Element上传组件监听fileList导致图片闪烁

7 篇文章 3 订阅
4 篇文章 0 订阅

场景:

在这里插入图片描述
如图所示,上传图片后图片先出现在右侧,然后才显示正常。很多人遇到这个bug是因为,在上传成功回调种用的push,改为直接赋值就好了。

    handleSuccess(res, file, fileList) {
      // this.fileList.push(file)
      this.fileList = fileList
    },

分析:

我的场景是:父子组件传值,监听了fileList,重新计算赋值了fileList导致了闪烁。切换表格,子组件中获取当前图片列表,子组件修改图片传值给父组件(用于缓存)。


解决:

父子组件传值时,子组件不要使用computed或者watch来监听fileList,用bus或者props传值即可。

  //父组件
  rowClick(row) {
    //this.SET_ROWDATA(row);

	bus.$emit('fankui', row);
  }

  //子组件
  // computed: {
  //   ROWDATA: function () {
  //     let ROWDATA = this.$store.state.wentifankui.ROWDATA
  //     let fileList = []
  //     if (ROWDATA && ROWDATA.fileList)
  //       fileList = ROWDATA.fileList.map(element => element = { url: this.imgHost + element });
  //     this.fileList = fileList
  //     return ROWDATA;
  //   },
  // },
  mounted() {
    //此处不用计算属性原因:保存时更新ROWDATA.fileList会重新计算改变fileList,造成闪烁
    bus.$off('fankui');
    bus.$on('fankui', (data) => {
      this.ROWDATA = data
      let fileList = []
      if (data && data.fileList)
        fileList = data.fileList.map(element => element = { url: this.imgHost + element });
      this.fileList = fileList
    });
  },
  methods: {
    handleSuccess(res, file, fileList) {
      this.fileList = fileList
      
      let fileLists = fileList.map(item => item.response && item.response.data || item.url.replace(this.imgHost, ""))
      this.ROWDATA.fileList = fileLists
    },
  }

参考:https://segmentfault.com/q/1010000021772862

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Element UI 中,你可以使用 `el-upload` 组件来实现图片上传,并通过监听相关事件来获取上传状态和上传成功后的图片地址。 首先,在 HTML 中使用 `el-upload` 组件,设置相应的属性和事件监听: ```html <el-upload class="upload-demo" action="/your-upload-url" :on-success="handleSuccess" :before-upload="beforeUpload" :auto-upload="false" > <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过2MB</div> </el-upload> ``` 在以上示例中,`action` 属性指定了上传文件的接口地址,`on-success` 属性绑定了上传成功后的回调方法 `handleSuccess`,`before-upload` 属性绑定了上传前的回调方法 `beforeUpload`,`auto-upload` 属性设置为 `false` 表示不自动上传。 然后,在 Vue 实例中定义这两个回调方法: ```javascript methods: { handleSuccess(response, file, fileList) { // 上传成功后的回调函数 console.log('上传成功'); console.log(response); // 服务器返回的数据 console.log(file); // 上传的文件对象 console.log(fileList); // 文件列表数组 }, beforeUpload(file) { // 上传前的回调函数 const isJPG = file.type === 'image/jpeg'; const isPNG = file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG && !isPNG) { this.$message.error('只能上传 JPG/PNG 格式的图片'); return false; } if (!isLt2M) { this.$message.error('上传图片大小不能超过 2MB'); return false; } r

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qsya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值