最近写项目遇到一个问题就是表格里的按钮加载状态设置,就是表格里的按钮在进行操作时,显示相应的加载状态,操作完成后,恢复正常状态。
在这里插入图片描述

解决思路

  • 方案一:data中设置一个对象,里面放很多个btnloading{ btnLoading1: false, btnLoading2: false,... }
    缺点:不知道会列表里会有多少条数据(鸡肋,不建议采用,本篇文章不再介绍)
  • 方案二:按钮直接设置 v-loading="scope.row.MarkUpPirceLoading"
    可行,建议使用,下面介绍这种解决方案

解决方案

<el-table-column v-if="isStudy === 0" label="操作">
   <template slot-scope="scope">
     <!-- 提醒按钮 -->
     <el-button
       :loading="scope.row.remindLoading"
       icon="el-icon-message-solid"
       size="mini"
       type="primary"
       @click="remind(scope.row)"
     />
   </template>
 </el-table-column>
remind(row) {
  this.$set(row, 'remindLoading', true)
  console.log('remind....')
  setTimeout(() => {
    this.$message.success('提醒成功')
    this.$set(row, 'remindLoading', false)
  }, 2000)
}

大功告成,现在每个按钮点击时都有自己的加载状态了

详解

这里使用了this.$set(row, 'remindLoading', true),对vue不太了解的童鞋可能会感到疑问,这是什么方法?为什么要使用这个方法?直接修改rowremindLoading的值不就好了嘛,即row.remindLoading = true/false

那么我们来看看这样写的话,会怎样?

remind(row) {
  row.remindLoading = true
  console.log('remind....')
  setTimeout(() => {
    this.$message.success('提醒成功')
   	row.remindLoading = false
  }, 2000)
  console.log(row)
}

这样写的话,发现按钮的加载状态并未出现,查看一下控制台输出的row
在这里插入图片描述
属性设置到了 ob 外面,vue监听不到变化,也就是说我们进行改变后dom不会更新

在这里我们发现虽然这个对象身上已经有了remindLoading属性,但是视图层并没有更新该数据,是什么造成的呢?由于受JavaScript的限制,vue.js不能监听对象属性的添加和删除,因为在vue组件初始化的过程中,会调用gettersetter方法,所以该属性必须是存在在data中,视图层才会响应该数据的变化

关于这个问题的解决方案就是使用this.$set(row, 'remindLoading', true),即

remind(row) {
  this.$set(row, 'remindLoading', true)
  console.log('remind....')
  setTimeout(() => {
    this.$message.success('提醒成功')
    this.$set(row, 'remindLoading', false)
  }, 2000)
  console.log(row)
}

在这里插入图片描述
我们发现,通过这这种方式为对象添加属性之后,它的对象身上多了getset方法,所以,此时我们再次操作该属性的时候,就会引起视图的更新啦

GitHub 加速计划 / eleme / element
54.06 K
14.63 K
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:3 个月前 )
c345bb45 7 个月前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 7 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐