Vue2中 Modal 对话框调用 FormModel 表单

今天使用 Modal 对话框 调用 FormModel 表单怎么也获取不到表单的数据,以为是对话框的问题,搞了半天,最后发现是加了prop校验字段,但是点保存时没有校验表单,直接console.log输出得不到表单数据,也不报错,真是吐血!Vue2中 Modal 对话框调用 FormModel 表单

Vue2中 Modal 对话框调用 FormModel 表单

首先看下 Modal 对话框的使用,为了方便使用封装了一下。

<template>
  <div>
    <a-modal
      :zIndex="config.zIndex || 1001"
      :width="config.width || 520"
      :title="config.title"
      :visible="visible"
      :confirm-loading="confirmLoading"
      @ok="handleOk"
      @cancel="close"
      class="xm-modal"
      :footer="config.hideFooter ? null : undefined"
    >
      <a-skeleton active v-if="contentLoading" />
      <slot v-else></slot>
    </a-modal>
  </div>
</template>

<script>
export default {
  props: {
    config: {
      type: Object,
      required: true,
    },
  },
  data() {
    return {
      confirmLoading: false,
      contentLoading: false,
      visible: false,
    };
  },
  watch: {
    visible() {
      if (this.visible) {
          this.handleOpen();
      }
    }
  },
  methods: {
    show() {
      this.visible = true;
    },
    close() {
      this.visible = false;
      if (this.config.onClose) this.config.onClose();
    },
    async handleOk() {
      try {
        this.confirmLoading = true;
        if (this.config.onConfirm) await this.config.onConfirm();
        this.close();
        this.confirmLoading = false;
      } catch (error) {
        console.error(error);
        this.confirmLoading = false;
      }
    },
    async handleOpen() {
      this.contentLoading = true;
      if (this.config.onOpen) await this.config.onOpen();
      this.contentLoading = false;
    },
  },
};
</script>

<style scoped>
.xm-modal {
  .ant-modal-body {
    padding: 15px;
  }
}
</style>

然后直接在 Modal 里调用自定义的 FormModel 表单,

// 点击链接
<a style="margin-right: 6px" @click="addTaskProgress(record)">
    <a-icon type="profile" />进展
</a>


<!-- Model 调用自定义 FormModel 表单 -->
<xm-modal ref="taskProgressRef" :config="taskProgressConfig">
  <a-form-model ref="frm" :model="taskProgressModel" :label-col="{ span: 6 }"
    :wrapper-col="{ span: 18 }">
    <a-form-model-item class="mb12" ref="progress" label="进展" 
      :style="{ display: 'inline-block', width: 'calc(30% - 5px)', marginLeft: '24px' }">
      <a-input-number v-model="taskProgressModel.progress" style="width: 60%; margin-left: 4px;" :default-value="0"
        :step="5" :min="0" :max="100" :formatter="value => `${value}%`" :parser="value => value.replace('%', '')" />
    </a-form-model-item>
    <a-form-model-item class="mb12" ref="risk" label="风险指数" 
      :style="{ display: 'inline-block', width: 'calc(70% - 12px)', marginLeft: '-40px' }">
      <a-radio-group style="width: 100%" v-model="taskProgressModel.risk">
        <a-radio value="1">
          无风险
        </a-radio>
        <a-radio value="2">
          中风险
        </a-radio>
        <a-radio value="3">
          高风险
        </a-radio>
      </a-radio-group>
    </a-form-model-item>
    <a-form-model-item class="mb12" ref="expend" label="消耗" 
      :style="{ display: 'inline-block', width: 'calc(50% - 5px)' }">
      <a-input-number :min="1" :max="100"
        v-model="taskProgressModel.expend" style="width: 85%" />
    </a-form-model-item>
    <a-form-model-item class="mb12" ref="remain" label="剩余" prop="remain"
      :style="{ display: 'inline-block', width: 'calc(50% - 12px)', marginLeft: '-24px' }">
      <a-input suffix='小时' disabled v-model="taskProgressModel.remain" style="width: 85%" />
    </a-form-model-item>
    <a-form-model-item class="mb12" ref="desc" label="进展描述" labelAlign="left" :label-col="{ span: 3 }">
      <a-textarea v-model="taskProgressModel.desc" style="{ width: 100%; minWidth: 160px;}"
        :autoSize="{ minRows: 6, maxRows: 24 }" />
    </a-form-model-item>
    <xm-center class="mb28">
      <xm-btn type="primary" @click.native="handleProgressSubmit">保存</xm-btn>
      <xm-btn style="margin-left: 16px" @click.native="resetProgressForm" ghost>取消</xm-btn>
    </xm-center>
  </a-form-model>
</xm-modal>


// 模拟数据
<script>
import moment from 'moment';
import { XmTable } from '~comp';

export default {
  components: {
    XmTable,
  },
  data() {
    return {
      // 添加进展弹窗数据
      taskProgressModel: {
        progress: '',
        risk: [],
        expend: '',
        remain: '',
        desc: '',
      },
      taskProgressConfig: {
        title: "添加进展",
        // hideFooter: true,
        width: "600px",
        onOpen: () => {
          // 可以在此处初始化数据
          console.log("modal is opened");
        },
        onClose: () => {
          // 清空表单
          this.taskProgressModel = this.$options.data.call(this).taskProgressModel;
          this.$refs.frm.resetFields();
          console.log("modal is closed");
        },
      },
    };
  },
  methods: {
    // 添加任务进展
    addTaskProgress(row) {
      console.log(row);
      this.taskProgressModel.expend = row.elapsedTime;
      this.taskProgressModel.remain = row.remainingTime;
      this.$refs.taskProgressRef.show();
      console.log(this.taskProgressModel);
    },
    handleProgressSubmit() {
      console.log(this.taskProgressModel);
      this.$ms("添加进展成功")
      this.taskProgressModel = this.$options.data.call(this).taskProgressModel;
      this.$refs.frm.resetFields();
      this.$refs.taskProgressRef.close();
    },
    resetProgressForm() {
      this.taskProgressModel = this.$options.data.call(this).taskProgressModel;
      this.$refs.frm.resetFields();
      this.$refs.taskProgressRef.close();
    }
  }
};
</script>

查看效果:

Vue2中 Modal 对话框调用 FormModel 表单

Vue2中 Modal 对话框调用 FormModel 表单


参考:


anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/5379.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注