当前位置:   article > 正文

【Elementui】组件库使用Table 表格组件为每一行的按钮添加loading效果_el-button loading

el-button loading

前言

        为了提高页面的观赏性和用户的体验,我们一般会在数据未加载之前添加loading效果来阻塞用户操作;

是什么?

  1. 点击其中一行,所有按钮loading效果都会触发
  2. 复制代码

为什么?

  1. html部分
  2. <el-table-column label="操作">
  3. <template>
  4. <el-button
  5. type="text"
  6. size="small"
  7. :loading="loading"
  8. @click="handleClick">
  9. 编辑
  10. </el-button>
  11. </template>
  12. </el-table-column>
  13. 复制代码

因为每一行的:loading属性都绑定了同一个变量loading;

  1. js部分
  2. data() {
  3. return {
  4. tableData: [], // 数据源
  5. dialogVisible: false, // 编辑模态框
  6. loading: false, // 按钮加载状态
  7. }
  8. },
  9. methods:{
  10. // 编辑按钮点击事件
  11. handleClick() {
  12. // 按钮加载状态开启
  13. this.loading = true
  14. // 模拟请求数据需要2秒,请求成功后展示模态框
  15. setTimeout(() => {
  16. // 模态框开启
  17. this.dialogVisible = true
  18. // 关闭按钮加载状态
  19. this.loading = false
  20. }, 2000);
  21. }
  22. },
  23. 复制代码

并且每一个编辑按钮都会触发同一个handleClick方法,该方法中把唯一的loading变量置为了true;

怎么做?

第一步

  1. 首先确定每一行的:loading属性需要绑定唯一的变量,来控制加载状态的显示与否
  2. 复制代码
  1. js部分
  2. created() {
  3. // 延时模拟获取数据
  4. setTimeout(() => {
  5. // getTableList()方法返回[{name: 'zs', age: 12},{name: 'ls', age: 22},...]数据结构
  6. getTableList().then(res => {
  7. // 获取数据成功后赋值给数据源
  8. this.tableData = res
  9. this.tableData.map(item => {
  10. this.$set(item, 'loading', false)
  11. return item
  12. })
  13. })
  14. }, 500);
  15. }
  16. 复制代码

知识点1:map方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成;参考链接

知识点2:Vue.set( target, propertyName/index, value )向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新; 参考链接

在获取数据成功之后,遍历数组中的数据,为每一项数据添加key为loading,value默认为false

  1. 遍历完成后的数据结构
  2. tableData=[{
  3. date: '2016-05-03',
  4. name: '王小虎',
  5. address: '上海市普陀区金沙江路 1518 弄',
  6. loading: false
  7. },....]
  8. 复制代码

第二步

  1. 经过第一步对数据的处理,每一个数据都有自己唯一的loading为false,通过作用域插槽拿到每一行的数据row,为:loading属性绑定唯一的loading
  2. 复制代码
  1. html部分
  2. <el-table-column label="操作">
  3. <template v-slot="{row}">
  4. <el-button
  5. type="text"
  6. size="small"
  7. :loading="row.loading"
  8. @click="handleClick(row)">
  9. 编辑
  10. </el-button>
  11. </template>
  12. </el-table-column>
  13. 复制代码

如何通过点击事件handleClick()方法控制每一行的loading状态呢?

  1. js部分
  2. // 编辑按钮点击事件
  3. handleClick(row) {
  4. // 按钮加载状态开启
  5. row.loading = true
  6. // 模拟请求数据需要2秒,请求成功后展示模态框
  7. setTimeout(() => {
  8. this.dialogVisible = true
  9. // 关闭按钮加载状态
  10. row.loading = false
  11. }, 2000);
  12. }
  13. 复制代码

结果呢?

问题在于开始使用一个变量控制所有按钮的加载状态,想要的是每一行的按钮状态是独立的,就应该为每一行的数据添加唯一的标识;

路漫漫其修远兮,吾将上下而求索

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/496008
推荐阅读
相关标签
  

闽ICP备14008679号