vue+element的table组件学习模板

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    </head>
    <body>
        <div id="app">
              <el-table v-loading="tableLoading" border :data="tableData" style="width: 60%" fit>
                <el-table-column
                  type="index"
                  :index="indexMethod">
                </el-table-column>
                <el-table-column label="日期" header-align="center" align="center">
                  <template slot-scope="scope">
                      <i class="el-icon-time"></i>
                      <span style="margin-left: 10px">{{ scope.row.date }}</span>
                  </template>
                </el-table-column>
                <el-table-column label="姓名" header-align="center" align="center">
                  <template slot-scope="scope">
                      <span v-if="!scope.row.isEdit">{{ scope.row.name }}</span>
                      <el-input v-else v-model="scope.row.newName"></el-input>
                  </template>
                </el-table-column>
                <el-table-column prop="address" label="地址" width="220">
                  </el-table-column>
                <el-table-column label="操作"header-align="center" align="center">
                  <template slot-scope="scope">
                    <el-button type="text" size="small" v-if="!scope.row.isEdit"
                      @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
                    <div v-else>
                        <el-button type="text" size="small" @click="save(scope.row)">
                          保存
                        </el-button>
                        <el-button type="text" size="small" @click="cancel(scope.row)">
                          取消
                      </el-button>
                    </div>
                  </template>
                </el-table-column>
              </el-table>
        </div>
    </body>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script type="text/javascript">
        new Vue({
            el: '#app',
            data() {
                return {
                    tableData: [{
                        date: '2016-05-02',
                        name: '王小虎',
                        address: '上海市普陀区金沙江路 1518 弄'
                      }, {
                        date: '2016-05-04',
                        name: '王小虎',
                        address: '上海市普陀区金沙江路 1517 弄'
                      }, {
                        date: '2016-05-01',
                        name: '王小虎',
                        address: '上海市普陀区金沙江路 1519 弄'
                      }, {
                        date: '2016-05-03',
                        name: '王小虎',
                        address: '上海市普陀区金沙江路 1516 弄'
                      }],
                    tableLoading: false
                }
            },
            created:function(){
                //一开始模拟获取数据,使v-loading=true,获取数据之后再把v-loading复制为false
               setTimeout(() => {
                 this.tableLoading = false;
               }, 2000);
            },
            methods: {
               indexMethod(index) {
                   return index * 2;
               },
               handleEdit(index, row) {

                // row.isEdit = true;  // 不能这样写

                this.$set(row, "isEdit", true);     // 设置对象的属性。
                if(!row.newName){
                  //第一次赋值
                  this.$set(row, "newName", row.name);
                }else{
                  this.$set(row, "newName", row.newName);
                }
                console.log(index, row);
              },
              save(row){
                row.name = row.newName;
                row.isEdit = false;
              },
              cancel(row){
                row.isEdit = false;
              }
            }
        })
    </script>
</html>

  在线演示

  在渲染表格之前,需要先获取数据再填充到表格里面,这时候可以先对<el-table>标签设置属性v-loading='true',这样表格就会有一个加载的动态动画,直到获取到想要的数据之后便可以通过v-loading='false'取消加载动画,这时候表格已经渲染完毕。

  为<el-table>标签添加 borderfit 属性可以使表格带有纵向边框和使表格的列的宽度是否自撑开
  通过:data="tableData"设置表格的数据,表格的数据可以直接使用prop="address"来设置对应列内容的字段名,也可以使用自定义列模板,通过 Scoped slot 可以获取到 row, column, $index 和 store(table 内部的状态管理)的数据。
  通过给 type=index 的列传入 index 属性,可以自定义索引。该属性传入数字时,将作为索引的起始值。也可以传入一个方法,它提供当前行的行号(从 0 开始)作为参数,返回值将作为索引展示。
  给<el-table-column> 标签设置header-align="center"align="center"可使表头和各列内容居中。
  为当前行的对象(scope.row)设置一个 isEdit 属性并配合 v-ifv-else可巧妙地实现组件之间的切换,但是直接使用row.isEdit = true;赋值发现数据视图并没有更新,即对象的属性不是响应式的,因为 Vue 不能检测对象属性的添加或删除 以及 Vue 不能检测以下变动的数组

  1. 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
  2. 当你修改数组的长度时,例如:vm.items.length = newLength

  于是采用Vue.set( target, key, value )或者vm.$set( target, key, value )。如果对象是响应式的,确保属性被创建后也是响应式的,同时触发视图更新。这个方法主要用于避开 Vue 不能检测属性被添加的限制。

注意对象不能是 Vue 实例,或者 Vue 实例的根数据对象。

关于 Vue 的注意事项可以看看这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值