Vue动态表格编辑

此处使用iviewui如有需要可自行使用其他组件如element-ui 原理相同

前提

iviewui主题
使用方法见官网↓
iviewui

效果

安装iviewui

  • 此处安装可参考官网

方式一:CDN 引入

<!-- import Vue.js -->
<script src="//vuejs.org/js/vue.min.js"></script>
<!-- import stylesheet -->
<link rel="stylesheet" href="//unpkg.com/view-design/dist/styles/iview.css">
<!-- import iView -->
<script src="//unpkg.com/view-design/dist/iview.min.js"></script>

方式二: NPM

$ npm install view-design --save

mian.js配置

import Vue from 'vue';
import VueRouter from 'vue-router';
import App from 'components/app.vue';
import Routers from './router.js';
import ViewUI from 'view-design';
import 'view-design/dist/styles/iview.css';

Vue.use(VueRouter);
Vue.use(ViewUI);

// The routing configuration
const RouterConfig = {
    routes: Routers
};
const router = new VueRouter(RouterConfig);

new Vue({
    el: '#app',
    router: router,
    render: h => h(App)
});

代码

<template>
    <div>
    <Row>
      <Col span="4" style="padding-right:10px">
        <Input type="text" v-model="name" placeholder="姓名" />
      </Col>
      <Col span="4" style="padding-right:10px">
        <Input type="text" v-model="age" placeholder="地址"/>
      </Col>
      <Col span="4" style="padding-right:10px">
        <Input type="text" v-model="birthday" placeholder="出生年月" />
      </Col>
      <Col span="4" style="padding-right:10px">
        <Input type="text" v-model="address"  placeholder="地址"/>
      </Col>
    </Row>
  <Button @click="add()">
    添加
  </Button>
  <Table :columns="columns" :data="data">
    <template slot-scope="{ row, index }" slot="name">
      <Input type="text" v-model="editName" v-if="editIndex === index" />
      <span v-else>{{ row.name }}</span>
    </template>

    <template slot-scope="{ row, index }" slot="age">
      <Input type="text" v-model="editAge" v-if="editIndex === index" />
      <span v-else>{{ row.age }}</span>
    </template>

    <template slot-scope="{ row, index }" slot="birthday">
      <Input type="text" v-model="editBirthday" v-if="editIndex === index" />
      <span v-else>{{ getBirthday(row.birthday) }}</span>
    </template>

    <template slot-scope="{ row, index }" slot="address">
      <Input type="text" v-model="editAddress" v-if="editIndex === index" />
      <span v-else>{{ row.address }}</span>
    </template>

    <template slot-scope="{ row, index }" slot="action">
      <div v-if="editIndex === index">
        <Button @click="handleSave(index)">保存</Button>
        <Button @click="editIndex = -1">取消</Button>
      </div>
      <div v-else>
        <Button @click="handleEdit(row, index)">操作</Button>
        <Button type="error"  @click="remove(index)">Delete</Button>
      </div>
    </template>
  </Table>
 </div>
</template>
<script>
  export default {
    data () {
      return {
         name:'',
        age:'',
        birthday:'',
        address:'',
        columns: [
          {
            title: '姓名',
            slot: 'name'
          },
          {
            title: '年龄',
            slot: 'age'
          },
          {
            title: '出生日期',
            slot: 'birthday'
          },
          {
            title: '地址',
            slot: 'address'
          },
          {
            title: '操作',
            slot: 'action'
          }
        ],
        data:[],
        editIndex: -1,  // 当前聚焦的输入框的行数
        editName: '',  // 第一列输入框,当然聚焦的输入框的输入内容,与 data 分离避免重构的闪烁
        editAge: '',  // 第二列输入框
        editBirthday: '',  // 第三列输入框
        editAddress: '',  // 第四列输入框
      }
    },
    methods: {
      add(){
       var _this=this
        _this.data.push({
         
          name:_this.name,
          age:_this.age,
          birthday:_this.birthday,
          address:_this.address
          
        })
       console.log(this.data)
      },
      handleEdit (row, index) {
        this.editName = row.name;
        this.editAge = row.age;
        this.editAddress = row.address;
        this.editBirthday = row.birthday;
        this.editIndex = index;
      },
      handleSave (index) {
        this.data[index].name = this.editName;
        this.data[index].age = this.editAge;
        this.data[index].birthday = this.editBirthday;
        this.data[index].address = this.editAddress;
        this.editIndex = -1;
      },
      getBirthday (birthday) {
        const date = new Date(parseInt(birthday));
        const year = date.getFullYear();
        const month = date.getMonth() + 1;
        const day = date.getDate();
        return `${year}-${month}-${day}`;
      },
       remove(index) {
            this.data.splice(index, 1);
      }
    }
  }
</script>
posted @ 2020-04-19 01:19  PoetryAndYou  阅读(2169)  评论(0编辑  收藏  举报