vue+elementui新增/编辑/删除

第一步:要有两个页面(一个主页面,一个form页【新增/编辑】)

第二步:分清父子页面,主页面是父,form是子

第三步:

父页面准备工作:

  1. 父页面,绑定数据,定义tableData=[],(为什么为空?因为数据是从后台获取的,通过调用查询接口)

  1. 弹框部分

子页面准备工作

第四步

新增、编辑

4.1 父页面:点击新增按钮,

4.2 接收子页面的方法,@fathernewFrom="GetCondition",GetCondition是个方法名(上面说过了)

4.3 form页面

4.3.·1 在点击新增/编辑的时候,就调到了这边👇

created和watch里面的作用是:判断传过来的值是不是空(新增时应该是空),如果传过来的值失控,thia.newFrom={},如果传过来的不是空(说明是编辑)就把值给this.newFrom

4.3.2 点击保存时把值传给父组件

第五步:

删除

主页面,点击删除进入这个方法,点击确定,调用删除的方法,再在方法里面的删除接口,接口调用成功后,再调用下查询的方法,刷新页面。

描述不太好,代码如下。

父页面(Sys_DicIndex.vue)

<template>
  <div class="Sys_DictIndex" style="width: 98%; height: 700px">
    <div class="main">
      <el-row :gutter="20">
        <el-col :span="3"
          ><div class="grid-content bg-purple">
            <p>基础类型</p>
            <el-tree
              :data="treeData"
              :props="defaultProps"
              @node-click="handleNodeClick"
              default-expand-all
              highlight-current
              node-key="DictID"
              :key="itemKey"
            ></el-tree></div
        ></el-col>
        <!-- <el-divider direction="vertical">分割线</el-divider> -->
        <el-col :span="21">
          <div class="buttonStyle">
            <el-button size="mini" type="primary" @click="Add">新增</el-button>
            <el-button size="mini" type="success" @click="Update"
              >编辑</el-button
            >
            <el-button size="mini" type="danger" @click="Del">删除</el-button>
            <el-button size="mini" type="danger" @click="returnMain"
              >返回首页</el-button
            >
          </div>
          <div>
            <el-table
              ref="tableRef"
              :data="tableData"
              style="width: 100%; height: 645px"
              border
              @select="newselect"
            >
              <el-table-column align="center" type="selection" width="55">
              </el-table-column>
              <el-table-column
                align="center"
                prop="DataName"
                :label="lable.DataName"
              >
              </el-table-column>
              <el-table-column
                align="center"
                prop="DictIDName"
                :label="lable.DictIDName"
              ></el-table-column>
              <el-table-column
                align="center"
                prop="DataID"
                :label="lable.DataID"
                sortable
              ></el-table-column>
            </el-table>
          </div>
        </el-col>
      </el-row>
    </div>

    <el-dialog
      :visible.sync="dialogVisible"
      :title="dialogTitle"
      width="25%"
      center
      draggable
      destroy-on-close
    >
      <Sys_DictForm
        ref="fromViewRef"
        :form="formData"
        @fathernewFrom="GetCondition"
      />
    </el-dialog>
  </div>
</template>

<script>
import Sys_DictForm from "./Sys_DictForm.vue";
import { API, baseUrl } from "@/API/api.js";
export default {
  components: {
    Sys_DictForm,
  },
  data() {
    return {
      dialogVisible: false, //用于控制form表单显隐
      dialogTitle: "", //用于控制新增、编辑标题
      formData: {}, //定义对象,用于给子组件传值
      selectDictIDName: "", //用于给子组件传 类型 值
      treeData: [
        {
          label: "设备状况",
          DictID: 1,
          ParentID: 0,
          Dsc: "",
          children: [],
        },
        {
          label: "任务性质",
          DictID: 2,
          ParentID: 0,
          Dsc: "",
          children: [],
        },
        {
          label: "保障机型",
          DictID: 3,
          ParentID: 0,
          Dsc: "",
          children: [],
        },
        {
          label: "保障性质",
          DictID: 4,
          ParentID: 0,
          Dsc: "",
          children: [],
        },
        {
          label: "保障任务",
          DictID: 5,
          ParentID: 0,
          Dsc: "",
          children: [],
        },
        {
          label: "装备型号",
          DictID: 6,
          ParentID: 0,
          Dsc: "",
          children: [],
        },
      ], //定义左侧树初始化
      //默认页大小
      pageSize: 20,
      pageNum: 1,
      total: 0,
      itemKey: "", //ces
      selectedDictIDs: 1, //左边树勾选的ID
      selectLabel: "设备状况", //左侧字典项名称
      defaultProps: {
        label: "label",
      },
      lable: {
        DicDataID: "序号",
        DataName: "名称",
        DictIDName: "类型",
        DataID: "排序",
      },

      tableData: [],
      multipleSelection: [], //右侧表格勾选的值
    };
  },
  created() {
    //初始化设置
    //1.获取字典明细列表

    const param = {
      DictID: this.selectedDictIDs,
    };
    this.GetDataFenYe(param);
  },
  mounted() {
    // this.getTableData();
  },
  methods: {
    //获取点击左侧树的数据
    handleNodeClick(data) {
      // data.DictID  点左侧树的时候掉查询方法 设备状况 label
      this.selectedDictIDs = data.DictID;
      this.selectLabel = data.label;
      console.log("点击树的时候===", data);
      let param = { DictID: this.selectedDictIDs };
      this.GetDataFenYe(param);
    },

    newselect(selection, row) {
      // debugger
      // console.log("勾选出来的值== selection=",selection);
      console.log("勾选出来的值== row=", row);
      this.multipleSelection = row;
    },
    //#region  按钮
    Add() {
      this.dialogTitle = "新增用户";
      this.selectDictIDName = this.selectLabel;
      this.formData = {};
      this.dialogVisible = true;
    },
    Update() {
      this.formData = this.multipleSelection;
      this.dialogTitle = "编辑用户";
      this.dialogVisible = true;
    },
    Del() {
      this.$confirm("此操作将永久删除该文件, 是否继续?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          //调用方法
          this.DeleteFormDatas(this.multipleSelection);
        })
        .catch(() => {});
    },
    //返回首页
    returnMain() {
      this.$router.push("/mainIndex");
    },
    //#endregion

    //获取表单组件传递的信息,此处接收的表单乃是数据表格对应的表单
    GetCondition(datas) {
      console.log("获取form表单传过来的数据=====:", datas);
      const param = datas;
      //获取表单组件后,判断是新增/修改
      if (this.dialogTitle.search("新增") != -1) {
        console.log("this.param=====", param);
        //调用新增方法
        this.InsertFormDatas(param);
      }
      if (this.dialogTitle.search("编辑") != -1) {
        this.UpdateFormDatas(param);
      }
    },

    //#region  新增、编辑、删除
    InsertFormDatas(data) {
      console.log("新增====", data);
      API.DicInsertData(data)
        .then((res) => {
          //新增成功之后直接掉查询的接口
          let param = { DictID: this.selectedDictIDs };
          this.GetDataFenYe(param);
        })
        .catch((err) => {});

      this.dialogVisible = false;
    },

    UpdateFormDatas(data) {
      debugger;
      this.dialogVisible = false;
      console.log("编辑==dd=", data);
      API.DicUpdateData(data)
        .then((res) => {
          //新增成功之后直接掉查询的接口
          let param = { DictID: this.selectedDictIDs };
          this.GetDataFenYe(param);
        })
        .catch((err) => {});
    },
    DeleteFormDatas(data) {
      debugger;
      console.log("删除===", data);
      API.DicDelData(data)
        .then((res) => {
          let param = { DictID: this.selectedDictIDs };
          this.GetDataFenYe(param);
        })
        .catch((err) => {});
      // let ar = this.tableData.splice(data.DicDataID - 1, 1);

      // this.tableData=ar;
      // console.log("ar的值==",this.tableData);
      //调接口
    },
    //#endregion

    //查询右侧分页数据
    GetDataFenYe(param) {
      API.GetDictNameById(param)
        .then((res) => {
          //组件渲染
          console.log("查询数据", res.data.Data);
          let newTabelData = [];
          res.data.Data.lstSubset.forEach((item) => {
            newTabelData.push({
              DicDataID: item.DicDataID, //字典Id
              DataName: item.DataName, //字典名称
              DataID: item.DataID, //字典名称
              DictID: item.DictID,
              DictIDName: this.selectLabel,
              Dsc: item.Dsc,
              SortID: item.SortID,
              CreateUserID: item.CreateUserID,
              CreateTime: item.CreateTime,
              ModifyUserID: item.ModifyUserID,
              ModifyTime: item.ModifyTime,
              DelFlag: item.DelFlag,
              DelUserID: item.DelUserID,
              DelTime: item.DelTime,
            });
          });
          this.tableData = newTabelData;
          console.log("最新的tabledata=====", this.tableData);
        })
        .catch((err) => {
          // this.$notify.error({
          //   title: "消息提示",
          //   message: err,
          // });
        });
    },
    //#region  测试
    /**
     * 将TreeDatas绑定的值重新赋值
     * @param {*} GetDataLists
     */
    SetTreeDatas(GetDataLists) {
      //重新渲染,itemKey用于处理Table不渲染的问题
      this.itemKey = Math.random();
      debugger;
      this.treeData = GetDataLists;
      //Tree 树形中 label 标定字段
      labels = GetDataLists[0].sign;
      // this.treeids = GetDataLists[0].DictID;

      //标定
      this.defaultProps.label = GetDataLists[0].sign;
      // this.loading = false;
    },
    //#endregion
  },
};
</script>

<style scoped>
::v-deep .el-button {
  float: left;
}
.buttonStyle {
  height: 39px;
}
.el-divider--vertical {
  display: inline-block;
  width: 1px;
  height: 53em;
  margin: 0 8px;
  vertical-align: middle;
  position: relative;
  border-left: 1px var(--el-border-color) var(--el-border-style);
}
.el-tree-node.is-current > .el-tree-node__content {
  background-color: red !important;
  color: #333 !important;
}
</style>

子页面(form.vue)

<template>
  <div class="userForm">
    <el-form ref="form" :form="form" @change="newFrom" label-position="left">
      <el-form-item label="类型" prop="DictID">
        //DictID 一定要与  value 的类型一致
        <el-select v-model="newFrom.DictID" placeholder="请选择类型">
          <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          >
          </el-option>
        </el-select>
      </el-form-item>
     
      <el-form-item label="名称">
        <el-input v-model="newFrom.DataName" style="width: 216px"></el-input>
      </el-form-item>
      <el-form-item label="排序">
        <el-input v-model="newFrom.DataID" style="width: 216px"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="onSubmit()">确定</el-button>
        <el-button>取消</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>
<script>
export default {
  props: {
    form: {
      type: Object,
      default: {},
    },
  },
  data() {
    return {
      newFrom: {
        DataName: "",
        DictID: "",
        DataID: "",
        Dsc: "",
        SortID: "",
        CreateUserID: "",
        CreateTime: "",
        ModifyUserID: "",
        ModifyTime: "",
        DelFlag: "",
        DelUserID: "",
        DelTime: "",
      },
      options: [
        {
          value: "1",
          label: "设备状况",
        },
        {
          value: "2",
          label: "任务性质",
        },
        {
          value: "3",
          label: "保障机型",
        },
        {
          value: "4",
          label: "保障性质",
        },
        {
          value: "5",
          label: "保障任务",
        },
        {
          value: "6",
          label: "装备型号",
        },
      ],
    };
  },
  created() {
    if (JSON.stringify(this.form) == "{}") {
      this.newFrom = [];
    } else {
      this.newFrom = this.form;
    }
  },
  watch: {
    form(newVal, oldVal) {
      if (newVal && newVal.length == 0) {
        this.newFrom = {};
      } else {
        this.newFrom = newVal;
      }
    },
  },
  mounted() {
    console.log("接受父组件的值==form=====", this.form);
  },

  methods: {
    //保存
    onSubmit() {
      console.log("保存this.newFrom===", this.newFrom);
      this.$emit("fathernewFrom", this.newFrom); //把this.newFrom指传给父组件
    },
  },
};
</script>
<style scoped></style>
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现可编辑动态表格的方法如下: 1. 在 Vue 中引入 Element UI 的 Table 组件,并设置 table 的 columns 和 data 属性。 2. 在 columns 中设置需要编辑的列的 type 属性为 "input"。 3. 在 data 中设置每个单元格的 editable 属性为 true,表示该单元格可以编辑。 4. 绑定 table 的 cell-click 事件,当用户点击单元格时,判断该单元格是否可以编辑,如果可以编辑,则将该单元格的 editable 属性设置为 false,同时保存该单元格的值。 5. 在单元格失去焦点时,将该单元格的 editable 属性设置为 true,同时将修改后的值保存到 data 中。 以下是示例代码: ```html <template> <el-table :data="tableData" @cell-click="handleCellClick"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄" :editable="true" :type="'input'"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18, address: '北京市' }, { name: '李四', age: 20, address: '上海市' }, { name: '王五', age: 22, address: '广州市' } ] } }, methods: { handleCellClick(row, column, cell, event) { if (column.editable) { cell.children[0].setAttribute('contenteditable', true) cell.children[0].focus() cell.children[0].addEventListener('blur', () => { cell.children[0].removeAttribute('contenteditable') row[column.prop] = cell.innerText }) } } } } </script> ``` 在上面的代码中,我们使用了 contenteditable 属性来实现单元格的可编辑。在 cell-click 事件中,当单元格可编辑时,我们将该单元格的 contenteditable 属性设置为 true,并且将焦点设置到该单元格中。当单元格失去焦点时,我们将 contenteditable 属性设置为 false,并且将修改后的值保存到 data 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值