vue之弹框

实现如下需求,点击新增或者行中的编辑按钮,弹出弹框编辑数据。

列表中的操作栏:通过slot-scope="scope"来接收作用域插槽的数据(添加属性slot-scope,并且定义对象scope),scope.row拿到对应行的数据;

<el-table-column label="操作" width="180" align="center">
          <template slot-scope="scope">
            <el-button
              type="primary"
              size="mini"
              icon="el-icon-edit"
              @click="editRolesB(scope.row)"
            ></el-button>
            <el-button
              type="danger"
              size="mini"
              icon="el-icon-delete"
              @click="delRolesB(scope.row)"
            ></el-button>
          </template>
        </el-table-column>

弹框的“新增/修改角色”标题根据states的值来控制,编辑时,“人员名称”处于禁用状态;由于弹框的参数(只有id)满足不了(少于)请求接口的参数(id和name),通过@change="pickDepartment2"事件来操作数据;

<el-dialog
        :title="states ? '新增角色' : '修改角色'"
        :visible.sync="dialogFormVisible"
        v-if="dialogFormVisible"
        width="600px"
      >
        <el-form :model="form" :rules="rules" ref="form">
          <el-form-item
            label="部门名称"
            :label-width="formLabelWidth"
            prop="dpt_name"
          >
            <el-select
              @change="pickDepartment2"
              v-model="form.dpt_name"
              placeholder="请选择部门"
            >
              <el-option
                v-for="item in options[0]"
                :key="item.id"
                :label="item.name"
                :value="item"
              >
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item
            label="人员名称"
            :label-width="formLabelWidth"
            prop="tester_name"
          >
            <el-select
              @change="pickPerson2"
              v-model="form.tester_name"
              placeholder="请选择人员"
              :disabled="!states"
            >
              <el-option
                v-for="item in options[1]"
                :key="item.id"
                :label="item.name"
                :value="item"
              >
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item
            label="人员角色"
            :label-width="formLabelWidth"
            prop="tester_role"
          >
            <el-select
              @change="pickRoles2"
              v-model="form.tester_role"
              placeholder="请选择角色"
            >
              <el-option
                v-for="item in options[2]"
                :key="item.id"
                :label="item.name"
                :value="item"
              >
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item
            label="备注"
            :label-width="formLabelWidth"
            prop="desc_msg"
          >
            <el-col :span="18">
              <el-input v-model="form.desc_msg" autocomplete="off"></el-input>
            </el-col>
          </el-form-item>
        </el-form>
        <div slot="footer" class="dialog-footer">
          <el-button type="primary" @click="sureDia('form')">提 交</el-button>
          <el-button @click="cancelDia('form')">取 消</el-button>
        </div>
      </el-dialog>

methods:接口的字段定义不规范,id对应多个XXX_id,作了个兼容😔


    pickDepartment2(val) {
      this.form.dpt_name = val.name;
      //兼容不同接口定义的部门id
      this.form.department_id = val.id;
      this.form.dpt_id = val.id;
    },
    pickPerson2(val) {
      this.form.tester_name = val.name;
      //兼容不同接口定义的部门id
      this.form.id = val.id;
      this.form.person_id = val.id;
    },
    pickRoles2(val) {
      this.form.tester_role = val.name;
      //兼容不同接口定义的角色id
      this.form.person_role_id = val.id;
      this.form.tester_role_id = val.id;
    },

 确定/取消/编辑/取消按钮的方法:

    sureDia(form) {
      this.$refs[form].validate((valid) => {
        if (valid) {
          if (this.states) {
            //新增角色入口
            auth
              .createRoles({
                department_id: this.form.dpt_id || "",
                person_name: this.form.tester_name || "",
                person_id: this.form.person_id || "",
                person_role_id: this.form.tester_role_id || "",
                desc_msg: this.form.desc_msg || "",
              })
              .then((res) => {
                if (res.code === 200) {
                  this.rolesDepartmentPersonShow();
                  this.dialogFormVisible = false;
                  this.$refs[form].resetFields();
                  this.$message({ message: "新增角色成功", type: "success" });
                } else if (res.code === 605) {
                  this.dialogFormVisible = true;
                  this.$message({ message: "重复操作", type: "warning" });
                } else if (res.code === 705) {
                  this.dialogFormVisible = true;
                  this.$message({ message: "值不存在", type: "warning" });
                } else {
                  this.dialogFormVisible = true;
                  this.$message({ message: "值无效", type: "warning" });
                }
              });
          } else {
            //编辑角色入口
            auth
              .updateRoles({
                department_id: this.form.dpt_id || "",
                person_name: this.form.tester_name || "",
                person_id: this.form.id || "",
                person_role_id: this.form.tester_role_id || "",
                desc_msg: this.form.desc_msg || "",
              })
              .then((res) => {
                if (res.code === 200) {
                  this.rolesDepartmentPersonShow();
                  this.dialogFormVisible = false;
                  this.$refs[form].resetFields();
                  this.$message({ message: "修改角色成功", type: "success" });
                } else if (res.code === 605) {
                  this.dialogFormVisible = true;
                  this.$message({ message: "重复操作", type: "warning" });
                } else if (res.code === 705) {
                  this.dialogFormVisible = true;
                  this.$message({ message: "值不存在", type: "warning" });
                } else {
                  this.dialogFormVisible = true;
                  this.$message({ message: "值无效", type: "warning" });
                }
              });
          }
        }
      });
    },

    cancelDia(form) {
      this.$refs[form].resetFields();
      this.dialogFormVisible = false;
    },

    editRolesB(rows) {
      this.states = false;
      this.form = { ...rows };
      this.dialogFormVisible = true;
    },

    delRolesB(rows) {
      this.$confirm("你确定删除该条数据吗?", "提示", {
        distinguishCancelAndClose: true,
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          auth.delRoles({ person_id: rows.id }).then((res) => {
            if (res.code === 200) {
              this.rolesDepartmentPersonShow();
              this.$message({ message: "删除成功", type: "success" });
            }
          });
        })
        .catch(() => {
          this.$message({ message: "取消删除", type: "info" });
        });
    },

默认情况下,当用户触发取消(点击取消按钮)和触发关闭(点击关闭按钮或遮罩层、按下 ESC 键)时,Promise 的 reject 回调和callback回调的参数均为 ‘cancel’(普通弹出框中的点击取消时的回调参数)。如果将distinguishCancelAndClose属性设置为 true,则上述两种行为的参数分别为 ‘cancel’ 和 ‘close’。(注意:如果没有设置distinguishCancelAndClose为true,则都默认为取消),这样就可以在catch中拿到回调参数action进行判断做什么操作了。这里没有做取消和关闭判断,都视为取消操作。
 

省略其它代码......

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Vue应用程序中实现全局弹框的控制,你可以使用Vue.js提供的全局事件总线(Event Bus)机制。 以下是一个简单的实现: 1.在Vue实例中创建一个事件总线: ``` // main.js import Vue from 'vue' export const EventBus = new Vue() ``` 2.在需要弹出框的组件中,通过事件总线触发一个事件: ``` // MyComponent.vue import { EventBus } from '@/main' methods: { showModal () { EventBus.$emit('show-modal') } } ``` 3.在包含弹出框的组件中,监听事件并控制弹出框的显示与隐藏: ``` // ModalComponent.vue import { EventBus } from '@/main' data () { return { showModal: false } }, created () { EventBus.$on('show-modal', () => { this.showModal = true }) }, methods: { closeModal () { this.showModal = false } } ``` 通过这种方式,你可以在任何组件中触发事件并控制全局弹出框的显示与隐藏。当然,你也可以通过传递参数来实现更复杂的逻辑。 ### 回答2: Vue全局弹框JS控制主要包括以下几个步骤: 第一步,导入Vue和第三方弹框插件,可以使用import语句导入。 第二步,创建一个Vue实例,用于管理全局弹框相关的数据和方法。 第三步,定义全局弹框的属性和方法,如弹框的显示状态、标题、内容、确认按钮、取消按钮等。 第四步,将全局弹框挂载到Vue实例上,并使用Vue的插件机制将该实例注册为全局组件。 第五步,使用组件的方式来调用全局弹框,可以直接在Vue实例中使用该组件,或者通过事件触发、计算属性、方法等方式来控制弹框的显示和隐藏。 第六步,根据实际需求,可以在全局弹框中添加一些自定义配置项,如弹框的宽度、高度、位置等。 第七步,封装全局弹框的方法,使其支持链式调用,方便在代码中使用。 第八步,对全局弹框的样式进行自定义,可以通过CSS样式文件或者内联样式灵活地修改弹框的样式。 总而言之,通过上述步骤,我们可以在Vue中实现全局弹框的JS控制,方便在整个项目中管理和调用弹框组件,提高开发效率和代码复用性。 ### 回答3: Vue全局弹框JS控制是通过Vue.js的全局对象$emit和$on来实现的。为了实现统一的弹框控制,可以借助Vue的事件总线机制。 首先,在main.js中创建一个Vue实例,作为事件总线: ``` import Vue from 'vue' export const EventBus = new Vue() Vue.prototype.$bus = EventBus ``` 然后,在需要弹框的组件中,可以通过以下方式触发一个全局事件: ``` this.$bus.$emit('show-dialog', dialogData) ``` 其中,'show-dialog'是自定义的事件名称,dialogData是传递给弹框的数据。 接着,在根组件或全局组件中监听该事件,并根据需求进行处理。可以通过以下方式在组件中监听事件: ``` this.$bus.$on('show-dialog', (dialogData) => { // 处理弹框逻辑,比如弹出一个全局弹框组件,并将dialogData传递给它 }) ``` 在监听到事件后,在组件中进行相应的处理,比如将dialogData传递给全局弹框组件,并弹出。 通过以上步骤,就可以实现Vue全局弹框的控制了。无论在哪个组件中需要弹框,只需要触发全局事件,然后在根组件或全局组件中进行监听和处理,实现了弹框的统一控制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值