elementui 的 dialog 常用逻辑总结

菜鸟最近写后台管理系统,发现不管是弹窗、还是编辑、查看、添加等功能,真的代码都差不多,但是每次都要重新写里面的关闭逻辑等,菜鸟就感觉不如搞一个模版,后面只关注于逻辑,其他都直接来这里复制了!

在编辑、查看、添加等功能中,编辑中的逻辑是包含查看和添加的,所以菜鸟就总结一个编辑的!

文章目录

出现情况

html 复制代码
<el-table
  :data="dicList"
  style="width: 100%"
>
  <el-table-column type="index" width="65" label="序号"></el-table-column>
  <el-table-column
    prop="label"
    label="接口字段"
  ></el-table-column>
  <el-table-column
    prop="value"
    label="值"
  ></el-table-column>
  <el-table-column
    prop="updateDate"
    label="更新时间"
  ></el-table-column>
  <el-table-column label="操作" align="left">
    <template slot-scope="scope">
      <el-tooltip effect="dark" content="查看" placement="top">
        <i class="el-icon-tickets" @click="seedetail(scope.row)"></i>
      </el-tooltip>
      <el-tooltip effect="dark" content="编辑" placement="top">
        <i class="el-icon-edit-outline" @click="openEditFun(scope.row)"></i>
      </el-tooltip>
      <el-popconfirm
        title="这是一段内容确定删除吗?"
        @confirm="deleteFun(scope.row)"
      >
        <el-tooltip slot="reference" effect="dark" content="删除" placement="top">
          <i class="iconfont iconshanchu"></i>
        </el-tooltip>
      </el-popconfirm>
    </template>
  </el-table-column>
</el-table>

父界面

引入

js 复制代码
import Edit from './dialog/edit.vue';

界面

html 复制代码
<edit
  v-if="editshow"
  :dialogVisible="editshow"
  :editdata="editdata"
  @closeEvent="hideEdit"
></edit>

变量 和 函数

js 复制代码
export default {
  data() {
    return {
      dicList: null,
      // 编辑
      editshow: false,
      editdata: {},
    }
  },
  components: {
    Edit,
  },
  created: {
  	// 请求 dicList
  },
  methods: {
    // 打开编辑
    openEditFun(scope) {
      // table 里面的scope
      this.editshow = true;
      this.editdata = scope;
    },
    // 关闭编辑  第一种
    hideedit(msg) {  // 这里msg就是为了区分 直接点关闭 和 保存后的关闭 做区分 [查看弹窗可不要]
      if (msg == false) {
        this.editshow = false;
      } else if (msg == true) {
        // TODO:保存后,重新请求  --》 最好是成功直接修改前端数据,并提示成功
        请求逻辑
        this.editshow = false;
      }
    },
    // 关闭编辑  第二种
    hideedit(msg, data) {
      if (msg == false) {
        this.editshow = false;
      } else if (msg == true) {
        this.dicList = data;
        this.editshow = false;
      }
    },
  },
}

子界面

界面

html 复制代码
<template>
  <div class="dialogWrapper">
    <el-dialog
      :title="title"
      :visible.sync="dialogVisible"
      width="710px"
      ref="dialogBox"
      class="dialogBox"
      :before-close="handleClose"
      @close="closeDialog"
      :destroy-on-close="true"
    >
      <el-form ref="form" :model="form" :rules="rules">
        <el-form-item label="xxxx1" prop="aaaa">
          <el-input v-model="form.aaaa"></el-input>
        </el-form-item>
        <el-form-item label="xxxx2" prop="bbbb">
          <el-select v-model="form.bbbb" placeholder="请选择">
            <el-option
              v-for="item in recogTypeArr"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            ></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="handleClose">关闭</el-button>
        <el-button @click="saveFun" type="primary">保存</el-button>
      </div>
    </el-dialog>
  </div>
</template>

变量 和 函数

js 复制代码
<script>
// 引入api
import {
  api,
} from "@/api/api.js";

// 引入验证规则
import {
  validateNumInEight2,
} from "@/tools/Validate.js";

export default {
  props: {
    dialogVisible: {
      type: Boolean,
      default: false
    },
    editdata: {
      type: Object,
      default: function () {
        return {}
      }
    }
  },
  data() {
    return {
      // 弹窗标题
      title: "算法编辑",
      // 绑定数据
      form: null,
      // 验证规则
      rules: {
        aaaa: [
          { required: true, message: "xxxx1", trigger: "blur" },
          { validator: validateNumInEight2, trigger: "blur" },
        ],
        bbbb: [
          { required: true, message: "xxxx2", trigger: "blur" },
        ],
      },
      // 下拉框
      recogTypeArr: [
        {
          value: 'value1',
          label: 'label1'
        },
        {
          value: 'value2',
          label: 'label2'
        }
      ],
    }
  },
  created() {
    this.form = _.cloneDeep(this.editdata); // 防止修改,改变父界面数据
  },
  methods: {
    // 关闭弹窗
    handleClose() {
      this.$emit("closeEvent", false);
    },
    closeDialog() {
      this.$refs.dialogBox.resetFields();
    },
    // 编辑保存
    saveFun() {
      // api
      api({}).then(res => {
        if (res.status == '200') {
          // 第一种
          this.$emit("closeEvent", true);
          // 第二种 --》 性能更好
          this.$emit("closeEvent", true, this.form);
        } else {
          this.$message({
            showClose: true,
            message: res.msg,
            type: 'error'
          });
        }
      }).catch(err => {
        console.log(err);
      })
    }
  }
}
</script>
相关推荐
前端小怪兽zmy6 小时前
Vue3实现纯前端语音输入成文字显示
前端·javascript·elementui
Aotman_8 小时前
Vue.directive:自定义指令及传参
前端·javascript·vue.js·elementui·ecmascript·es6
我这一生如履薄冰~3 天前
element-plus去除el-dropdown组件当鼠标移入文本时会出现边框
前端·elementui·vue
D_C_tyu5 天前
Vue3 + Element Plus | el-table 表格获取排序后的数据
javascript·vue.js·elementui
i_am_a_div_日积月累_5 天前
el-tree半选回显问题;el-tree获取半选节点id
javascript·vue.js·elementui
自然 醒5 天前
elementUI的select下拉框如何下拉加载数据?
前端·javascript·elementui
码农秋7 天前
Element Plus DatePicker 日期少一天问题:时区解析陷阱与解决方案
前端·vue.js·elementui·dayjs
招风的黑耳8 天前
基于 Axure 与 Element UI 风格的拖动行排序表格设计
elementui·axure·表格·拖动
我是小路路呀9 天前
element级联选择器:已选中一个二级节点,随后又点击了一个一级节点(仅浏览,未确认选择),此时下拉框失去焦点并关闭
javascript·vue.js·elementui
暴富的Tdy9 天前
【使用 Vue2 脚手架创建项目并实现主题切换功能涵盖Ant-Design-Vue2/Element-UI】
vue.js·elementui·anti-design-vue·vue切换主题