前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue + Element UI:使table组件的td内容可编辑

Vue + Element UI:使table组件的td内容可编辑

作者头像
Javanx
发布2019-09-04 10:35:05
4.9K0
发布2019-09-04 10:35:05
举报
文章被收录于专栏:web秀web秀

前言

后台管理系统,需要这个功能点的特别多,但Element UI 的table组件本身是不提供的,所以需要自行拓展一下。 在这里,给大家写一个简单的示例,希望对小伙伴们有所帮助。

先看看效果图:

Vue + Element UI:使table组件的td内容可编辑
Vue + Element UI:使table组件的td内容可编辑

el-table

我们直接去Element UI 官网 把 table组件的代码copy过来

Vue + Element UI:使table组件的td内容可编辑
Vue + Element UI:使table组件的td内容可编辑
代码语言:javascript
复制
<template>
  <div>
    <el-table
      ref="filterTable"
      :data="tableData"
      style="width: 100%">
      <el-table-column
        prop="date"
        label="日期"
        width="180"
      >
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        width="180">
      </el-table-column>
      <el-table-column
        prop="address"
        label="地址"
        :formatter="formatter">
      </el-table-column>
      <el-table-column
        prop="tag"
        label="标签"
        width="100"
        :filters="tagList"
        :filter-method="filterTag"
        filter-placement="bottom-end">
        <template slot-scope="scope">
          <el-tag
            :type="scope.row.tag === '家' ? 'primary' : 'success'"
            disable-transitions>{{scope.row.tag}}</el-tag>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        tagList: [{ text: '家', value: '家' }, { text: '公司', value: '公司' }],
        tableData: [{
          date: '2016-05-02',
          name: '张三',
          address: '深圳',
          tag: '家'
        }, {
          date: '2016-05-04',
          name: '李四',
          address: '北京',
          tag: '公司'
        }, {
          date: '2016-05-01',
          name: '王五',
          address: '上海',
          tag: '家'
        }, {
          date: '2016-05-03',
          name: '李六',
          address: '北京',
          tag: '公司'
        }]
      }
    },
    methods: {
      filterTag(value, row) {
        return row.tag === value;
      },
      formatter(row, column) {
        return row.address;
      }
    }
  }
</script>

稍稍的修整了一下,把tags的filters提到data里面作为变量了,后续可以用。

然后我们添加一个按钮,来添加行

table动态插入行

代码语言:javascript
复制
<template>
  <div>
    <el-button @click="add">添加一条</el-button>
    <el-table
      >
      ...
      ...
    </el-table>
  </div>
</template>

<script>
...
methods: {
  add() {
    this.tableData.push({
      date: '2019-4-01',
      name: '默认数据',
      address: '上海',
      tag: '公司',
      status: 1
    });
  }
}
...
</script>

add方法,向el-table的数据源tableData里面push一条新的数据,并且添加一个字段,我这里叫status(名字随便啦)。主要用来区分这条数据的当前状态,是编辑态,还是已经保存了的。1就是编辑态,如果保存了,我们就改为0。

有了status这个状态,我们就去修改el-table组件,根据status这个状态来判断,是显示可以编辑,还是不可编辑。

Vue + Element UI:使table组件的td内容可编辑
Vue + Element UI:使table组件的td内容可编辑

el-table组件修改

这时候,我们就去自定义每列内容

日期列

代码语言:javascript
复制
...
<el-table-column
  prop="date"
  label="日期"
  width="180"
>
  <template slot-scope="scope">
    <el-date-picker
      v-if="scope.row.status"
      v-model="scope.row.date"
      type="date"
      placeholder="选择日期">
    </el-date-picker>
    <span v-else>{{scope.row.date}}</span>
  </template>
</el-table-column>

判断,如果scope.row.status有值(编辑态),我们就用日期组件el-date-picker,否则就用span标签,直接渲染数据。

这里日期组件同样可以直接使用v-model双向绑定。

同理完成其他列

姓名

代码语言:javascript
复制
<el-table-column
  prop="name"
  label="姓名"
  width="180">
  <template slot-scope="scope">
    <el-input v-if="scope.row.status" v-model="scope.row.name"></el-input>
    <span v-else>{{scope.row.name}}</span>
  </template>
</el-table-column>

地址

代码语言:javascript
复制
<el-table-column
  prop="address"
  label="地址"
  :formatter="formatter">
  <template slot-scope="scope">
    <el-select  v-if="scope.row.status" v-model="scope.row.address" placeholder="请选择">
      <el-option
        v-for="item in cityList"
        :key="item"
        :label="item"
        :value="item">
      </el-option>
    </el-select>
    <span v-else>{{scope.row.address}}</span>
  </template>
</el-table-column>

标签

代码语言:javascript
复制
<el-table-column
  prop="tag"
  label="标签"
  width="100"
  :filters="tagList"
  :filter-method="filterTag"
  filter-placement="bottom-end">
  <template slot-scope="scope">
    <el-select  v-if="scope.row.status" v-model="scope.row.tag" placeholder="请选择">
      <el-option
        v-for="item in tagList"
        :key="item.value"
        :label="item.text"
        :value="item.value">
      </el-option>
    </el-select>
    <el-tag
      v-else
      :type="scope.row.tag === '家' ? 'primary' : 'success'"
      disable-transitions>{{scope.row.tag}}</el-tag>
  </template>
</el-table-column>

上面用到了1个变量,用来选择城市的,我们在data里面添加一下

代码语言:javascript
复制
...
data() {
  return {
    cityList: ['北京', '深圳', '上海']
    ...
  }
}

这样就基本完成了第一张图的功能,但是需要新增的时候,同时保存没有保存的功能。

保存

这里我们会用到上面提到过的status,1是编辑态,如果保存了,我们就改为0。

ok,在新增的时候,我们先判断,有没有未保存的数据,也就是有没有数据的status为1,如果是1,我们就将这条数据的status改为0。

代码语言:javascript
复制
...
add() {
  this.tableData.map(item=>{
    if(item.status){
      item.status = 0;
    }
    return item;
  })
  ...
}

是不是超级简单了?

这里我们其实还有一个问题,日期重新选择,保存后,格式不对,这个问题就留给大家了?看看你们有什么办法来解决吧?期待你的答案。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年4月1日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • el-table
  • table动态插入行
  • el-table组件修改
  • 保存
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档