AntDesign可编辑表格+VUX

2019-12-24  本文已影响0人  叶叶阿姨

在项目中我本来写的AntDesign正常的表格就是编辑会弹出模态框的那种 如下[图片上传中...(07BB190F-EC08-4D3F-B5C6-38C11F39474A.png-b23752-1577156129260-0)]


72D4053C-0938-4C0D-ACCA-16DDA8B7CEEC.png
但是呢 产品经理觉得这样模态框中数据不多 没有必要整这么多模态框 弹来弹去眼睛花 所以呢让我改成可编辑表格如下图 07BB190F-EC08-4D3F-B5C6-38C11F39474A.png

首先说一下数据的渲染方法,这两种表格的数据都是挂载到vux上面的之所以挂到vux上面也是为了方便数据的实时更新,(比如:添加、编辑、删除都需要实时更新)
OK 今天我就来说一下这个东西怎么弄
先放全部代码

<template>
  <a-table :columns="columns" :dataSource="data" rowKey="id" bordered>
    <template
      v-for="col in ['article_column', 'abstract', 'time']"
      :slot="col"
      slot-scope="text, record, index"
    >
      <div :key="col">
        <a-input
          v-if="record.editable"
          style="margin: -5px 0"
          :value="text"
          @change="e => handleChange(e.target.value, record.editor_id, col)"
        />
        <template v-else>{{text}}</template>
      </div>
    </template>
    <template slot="operation" slot-scope="text, record, index">
      <div class="editable-row-operations">
        <span v-if="record.editable">
          <a @click="() => save(record.editor_id)" class="btn ok_btn">确认</a>
          <a-popconfirm
            title="确认取消本次操作?"
            @confirm="() => cancel(record.editor_id)"
            okText="确定"
            cancelText="关闭"
          >
            <a class="btn no_btn">取消</a>
          </a-popconfirm>
        </span>
        <span v-else>
          <a-button type="primary" @click="() => edit(record.editor_id)">编辑</a-button>
          <a-popconfirm
            placement="topRight"
            title="确认删除本条数据?"
            okText="确定"
            cancelText="关闭"
            @confirm="() => dell(record.editor_id)"
          >
            <a-icon slot="icon" type="question-circle-o" style="color: red" />
            <a-button class="btn del" type="danger">删除</a-button>
          </a-popconfirm>
        </span>
      </div>
    </template>
  </a-table>
</template>
<script>
import { dellColumn, editorColumn } from "@/api/news";

const columns = [
  {
    title: "ID",
    dataIndex: "id",
    width: "10%",
    scopedSlots: { customRender: "id" }
  },
  {
    title: "文章栏目",
    dataIndex: "article_column",
    width: "25%",
    scopedSlots: { customRender: "article_column" }
  },
  {
    title: "摘要",
    dataIndex: "abstract",
    width: "25%",
    scopedSlots: { customRender: "abstract" }
  },
  {
    title: "创建时间",
    dataIndex: "time",
    width: "20%",
    scopedSlots: { customRender: "time" }
  },
  {
    title: "操作",
    dataIndex: "operation",
    scopedSlots: { customRender: "operation" }
  }
];
export default {
  data() {
    return {
      columns
    };
  },
  // 渲染表格
  created() {
    this.$store.dispatch("get_article_column");
  },
  methods: {
    // 编辑状态中的input值
    handleChange(value, key, column) {
      const newData = [...this.data];
      const target = newData.filter(item => key === item.editor_id)[0];
      console.log(target, "handleChange中的值");
      if (target) {
        target[column] = value;
        this.data = newData;
      }
    },
    // 编辑
    edit(key) {
      const newData = [...this.data];
      const target = newData.filter(item => key === item.editor_id)[0];
      if (target) {
        target.editable = true;
        this.data = newData;
      }
    },
    // 编辑确认
    save(key) {
      console.log(key, "确认编辑的key");
      const newData = [...this.data];
      const target = newData.filter(item => key === item.editor_id)[0];
      if (target) {
        // 删除editable=true这条
        delete target.editable;
        // 更新到表格实现实时渲染
        this.data = newData;
        // 发送编辑请求
        // 发送编辑修改请求
        const param_q = new URLSearchParams(target);
        editorColumn(param_q).then(resp => {
          this.$store.dispatch("get_article_column");
        });
        // 弹框提示
        this.$message({ type: "success", message: "编辑成功!" });
      }
    },
    // 确认取消
    cancel(key) {
      const newData = [...this.data];
      const target = newData.filter(item => key === item.editor_id)[0];
      if (target) {
        delete target.editable;
        this.data = newData;
      }
      this.$message({ type: "info", message: "已取消编辑" });
    },
    // 删除确认(在vux中直接删)
    dell(key) {
      // console.log(key, "dell的key");
      // 删除请求
      dellColumn(key).then(resp => {
        this.$store.dispatch("get_article_column");
      }),
        this.$message({ type: "success", message: "删除成功!" });
    }
  },
  computed: {
    data: {
      // 先获取带article_column_data
      get() {
        const data1 = this.$store.getters.article_column_data;
        return this.$store.getters.article_column_data;
      },
      // 有set这个方法才可以修改article_column_data
      set(article_column_data) {
        this.$store.commit("SET_DATA", article_column_data);
      }
    }
  }
};
</script>
<style lang="scss" scoped>
.ok_btn {
  color: #28b78d;
  border: 1px solid #28b78d;
}

.no_btn {
  color: #ccc;
  border: 1px solid #ccc;
}
</style>

化重点啦!! 你们看这里有用到get()和set()data

  computed: {
    data: {
      // 先获取带article_column_data
      get() {
        const data1 = this.$store.getters.article_column_data;
        return this.$store.getters.article_column_data;
      },
      // 有set这个方法才可以修改article_column_data
      set(article_column_data) {
        this.$store.commit("SET_DATA", article_column_data);
      }
    }
  }

为什么呢? 因为呀和普通的deta return不同如下图

 computed: {
    data() {
      return this.$store.getters.label_data;
    }
  }
因为这种是直接把vux中的data给赋值做改变 但是呢我们要改变data中的值需要把指定的那条数据中增加一条editable = true然后做if 判断 如果editable = true就出现input的输入框进入编辑状态 73690DB6-1945-4687-B39D-87011C9E2453.png

所以呢 我们要先get()到当前表格需要的data在需要修改指定的数据时候在set()中提交修改 因为想修改data就一定要写set()也一定要提交 不然没有提交修改操作那么vux中的数据就不会修改,
所以一定要修改!!!


B4D5A70F-C7B9-4AE5-B4FC-54782CECA17D.png
然后就可以啦~~~
上一篇下一篇

猜你喜欢

热点阅读