vue中新增和编辑两个功能共用一个弹窗和弹窗确定按钮,调用接口的处理方式(二)---父子vue页面

目标:点击增加按钮出现弹窗,弹窗中多选框的名称是通过其他接口获取的;点击编辑按钮出现弹窗,且该行的数据已被传递到该弹窗中,增加和编辑接口均是点击弹窗中的确定按钮进行调用的。

1.api的js接口文件中:

// 编辑
export function rulesUpdate(param) {
    return request({
        url: "/xxx/xxxx/update",
        method: "post",
        headers: {
            "Content-Type": "application/json" // 如果写成contentType会报错
        },
        data: param
    });
}
// 增加
export function rulesInsert(param) {
    return request({
        url: "/xxx/xxx/insert",
        method: "post",
        headers: {
            "Content-Type": "application/json" // 如果写成contentType会报错
        },
        data: param
    });
}

2.后端的swagger中:

3.前端页面

父页面--整个表单数据的页面

子页面--弹窗,(点击新增时出现的也是该弹窗,所有数据为空)

 4.vue文件--父页面

父页面中包含弹窗子页面,在template中体现


        <RulesAdd
          v-if="showAddRulesData"
          :formFieldArr="propArr"
          ref="dMRulesAddDialog"
          :tableName="$route.query.md5num"
          @refreshRulesData="refreshRulesData"
          :editRuleDataObj="editRuleDataObj"
          :ifRuleEdit="ifRuleEdit"
        />
import RulesAdd from "../xxx/RulesAdd";
components: { RulesAdd },

data中:

showAddRulesData: false,
rulesMultipleSelection: [],
editRuleDataObj: {},
ifRuleEdit: 0 // 1表示添加,0表示编辑

methods中:

// 点击增加按钮
    addRulesData(row) {
      if (row) {
        this.ifRuleEdit = 0;
        this.editRuleDataObj = row;
      } else {
        this.ifRuleEdit = 1;
        this.editRuleDataObj = {};
      }
      this.$refs.dMRulesAddDialog.dialogVisible = true;
    },
// 刷新页面
    refreshRulesData() {
      this.listRuleChange();
    },

5.vue文件--子页面

<template>
  <div class="rules-dialog-wrap">
    <el-dialog
      :title="'添加规则'"
      :visible.sync="dialogVisible"
      :show-close="true"
      width="38%"
      :close-on-click-modal="false"
      center
    >
      <div class="dialog-main">
        <div class="main-row">
          <div class="add-field">
            规则名称:
            <span class="add-field-input"
              ><el-input
                v-model="nameValue"
                placeholder="请输入规则名称"
              ></el-input
            ></span>
          </div>
          <div class="not-null-check">
            <div class="not-null-check-title">必填项:</div>
            <div class="checkboxs">
              <el-checkbox-group
                v-model="selArr"
                style="margin-right: 15px;width:520px"
              >
                <el-checkbox
                  v-for="(item, index) in newArr"
                  :label="item.field"
                  :key="index"
                ></el-checkbox>
              </el-checkbox-group>
            </div>
          </div>
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button size="small" @click="confirmDataInfo">确定</el-button>
        <el-button size="small" @click="dialogVisible = false">取消</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import { rulesInsert, rulesUpdate } from "@/api/cimApi/rules";

export default {
  props: {
    formFieldArr: {
      type: Array,
      default() {
        return [];
      }
    },
    tableName: {
      type: String,
      default: ""
    },
    editRuleDataObj: {
      type: Object,
      default() {
        return {};
      }
    },
    ifRuleEdit: {
      type: Number,
      default: 1
    }
  },
  data() {
    return {
      dialogVisible: false,
      input: "",
      newArr: [],
      nameValue: "",
      selArr: []
    };
  },
  mounted() {
    this.formFieldArr.forEach(item => {
      if (
        item.field !== "序号" &&
        item.field !== "创建人" &&
        item.field !== "创建时间" &&
        item.field !== "修改时间"
      ) {
        let obj = item;
        this.$set(obj, "value", ""); //给obj对象的新增value属性赋值
        this.newArr.push(obj);
      }
    });
  },

  watch: {
    dialogVisible(newValue) {
      if (newValue) {
        if (this.ifRuleEdit == 0) {
          // 如果为编辑,将数据写入
          this.nameValue = this.editRuleDataObj.name;
          // split(",")将字符串用逗号隔开后赋值给数组
          this.selArr = this.editRuleDataObj.notNull.split(",");
        } else {
          this.nameValue = "";
          this.selArr = [];
        }
      }
    }
  },

  methods: {
    confirmDataInfo() {
      // 将数组重组为字符串,并以 , 进行分割
      let notnulls = this.selArr.join(",");
      // 整理参数
      let param = {
        name: this.nameValue,
        notNull: notnulls,
        tableName: this.tableName
      };
      if (this.ifRuleEdit == 1) {
        // 增加规则
        rulesInsert(param).then(res => {
          if (res.data.code == 200) {
            this.$message.success("规则增加成功");
            this.dialogVisible = false;
            // 刷新页面
            this.$emit("refreshRulesData");
          } else {
            this.$message.error("规则增加失败");
          }
        });
      } else {
        // 编辑规则
        param.id = this.editRuleDataObj.id;
        rulesUpdate(param).then(res => {
          if (res.data.code == 200) {
            this.$message.success("规则编辑成功");
            this.dialogVisible = false;
            //刷新页面
            this.$emit("refreshRulesData");
          } else {
            this.$message.error("规则编辑失败");
          }
        });
      }
    }
  }
};
</script>

这样就实现在父子vue页面中新增和编辑两个功能共用一个弹窗和弹窗确定按钮并调用接口。若在同一个vue页面中实现这个功能,可参考:vue中新增和编辑两个功能共用一个弹窗和弹窗确定按钮,调用接口的处理方式(一)--- 同一个vue页面_刚刚好ā的博客-CSDN博客

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设你已经拥有一个名为 `DialogForm.vue` 的框组件,可以按照以下步骤实现新增编辑的共用: 1. 在 `DialogForm.vue` 定义 `props` 属性,用于接收父组件传递的数据。 ```javascript <template> <el-dialog :visible.sync="visible" title="框标题" @close="handleClose"> <!-- 表单内容 --> </el-dialog> </template> <script> export default { props: { visible: { type: Boolean, required: true }, formData: Object // 用于传递表单数据 }, setup(props) { // setup代码 } } </script> ``` 2. 在父组件引入 `DialogForm.vue` 组件,并在父组件定义 `visible` 和 `formData` 数据。 ```javascript <template> <div> <el-button @click="handleAdd">新增</el-button> <el-button @click="handleEdit(row)">编辑</el-button> <dialog-form :visible="visible" :form-data="formData" /> </div> </template> <script> import DialogForm from './DialogForm.vue' export default { components: { DialogForm }, data() { return { visible: false, formData: {} } }, methods: { handleAdd() { this.visible = true // 清空表单数据 this.formData = {} }, handleEdit(row) { this.visible = true // 将当前行数据传递给子组件 this.formData = row } } } </script> ``` 3. 在 `DialogForm.vue` 的 `setup` 方法使用 `watch` 监听 `props` 属性的变化,根据 `formData` 是否为空来判断是新增还是编辑。 ```javascript <script> import { ref, watch } from 'vue' export default { props: { visible: { type: Boolean, required: true }, formData: Object // 用于传递表单数据 }, setup(props) { const formRef = ref(null) watch(() => props.visible, (val) => { if (val) { if (props.formData) { // 编辑 // 将表单数据初始化为props传递的数据 formRef.value.resetFields() formRef.value.setFieldsValue(props.formData) } else { // 新增 // 清空表单数据 formRef.value.resetFields() } } }) const handleClose = () => { // 关闭框时重置表单数据 formRef.value.resetFields() } return { formRef, handleClose } } } </script> ``` 这样就可以实现使用同一个框组件来进行新增编辑操作了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值