element-ui dialog form 弹框表单组件封装

在使用 element-ui 进行后端管理系统开发时,在封装弹框表单时,遇到两个问题,这里进行简单记录:

1、问题一:点击关闭按钮及遮罩层关闭弹框时,页面报错,如下:

子组件封装:

html 复制代码
<template>
  <el-dialog title="dialog form" :visible.sync="visible" width="432px">
    <el-form ref="formRef" :model="form">
      <el-form-item label="姓名" prop="username">
        <el-input placeholder="请输入姓名" v-model="form.username"> </el-input>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="handleCancel">取消</el-button>
      <el-button type="primary" @click="handleSubmit">提交</el-button>
    </div>
  </el-dialog>
</template>

<script>
export default {
  name: 'DialogForm',
  props: {
    visible: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      form: {
        username: ''
      }
    };
  },
  methods: {
    // 关闭弹框
    handleCancel() {
      this.$emit('update:visible', false);
    },

    // 提交
    handleSubmit() {
      this.$refs.formRef.validate((valid) => {
        if (valid) {
          console.log('this.form::', this.form);
          this.handleCancel();
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    }
  }
};
</script>

父组件使用:

html 复制代码
<template>
  <div>
    <el-button type="primary" @click="handleOpen">dialog form</el-button>
    <!-- 弹框表单-->
    <dialog-form :visible.sync="visible"></dialog-form>
  </div>
</template>

<script>
import DialogForm from './DialogForm.vue';

export default {
  name: 'Header',
  components: { DialogForm },
  data() {
    return {
      visible: false
    };
  },
  methods: {
    handleOpen() {
      this.visible = true;
    }
  }
};
</script>

解决之后,父组件代码不变,子组件代码修改如下:

html 复制代码
<template>
  <el-dialog title="dialog form" :visible.sync="dialogVisible" width="432px">
    <el-form ref="formRef" :model="form">
      <el-form-item label="姓名" prop="username">
        <el-input placeholder="请输入姓名" v-model="form.username"> </el-input>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="handleCancel">取消</el-button>
      <el-button type="primary" @click="handleSubmit">提交</el-button>
    </div>
  </el-dialog>
</template>

<script>
export default {
  name: 'DialogForm',
  props: {
    visible: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      dialogVisible: this.visible,
      form: {
        username: ''
      }
    };
  },
  watch: {
    visible(newVal) {
      this.dialogVisible = newVal;
    }
  },
  methods: {
    // 关闭弹框
    handleCancel() {
      this.dialogVisible = false;
      this.$emit('update:visible', this.dialogVisible);
    },

    // 提交
    handleSubmit() {
      this.$refs.formRef.validate((valid) => {
        if (valid) {
          console.log('this.form::', this.form);
          this.handleCancel();
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    }
  }
};
</script>

产生原因,子组件通过 update 的方式直接修改了 props 传递的属性,解决方法,在子组件中使用一个变量 dialogVisible 接收父组件传递过来的 props 属性 visible,子组件内部 dialog 通过 dialogVisible 这个变量来控制。

2、问题二:点击关闭按钮和遮罩层关闭弹框之后,再次进行打开弹框时,弹框未打开,页面未报错,如下:

父组件代码保持不变,子组件代码修改如下:

html 复制代码
<template>
  <el-dialog
    title="dialog form"
    :visible.sync="dialogVisible"
    width="432px"
    @close="handleClose"
  >
    <el-form ref="formRef" :model="form">
      <el-form-item label="姓名" prop="username">
        <el-input placeholder="请输入姓名" v-model="form.username"> </el-input>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="handleCancel">取消</el-button>
      <el-button type="primary" @click="handleSubmit">提交</el-button>
    </div>
  </el-dialog>
</template>

<script>
export default {
  name: 'DialogForm',
  props: {
    visible: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      dialogVisible: this.visible,
      form: {
        username: ''
      }
    };
  },
  watch: {
    visible(newVal) {
      this.dialogVisible = newVal;
    }
  },
  methods: {
    // 弹框关闭的回调
    handleClose() {
      this.handleCancel();
    },

    // 关闭弹框
    handleCancel() {
      this.dialogVisible = false;
      this.$emit('update:visible', this.dialogVisible);
    },

    // 提交
    handleSubmit() {
      this.$refs.formRef.validate((valid) => {
        if (valid) {
          console.log('this.form::', this.form);
          this.handleCancel();
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    }
  }
};
</script>

产生原因,在点击关闭图标和遮罩层关闭时,子组件未更新父组件的 visible 状态,解决方法,在子组件内通过 close 方法,即 dialog 关闭回调函数来更新父组件状态。

相关推荐
晴空万里藏片云1 小时前
elment Table多级表头固定列后,合计行错位显示问题解决
前端·javascript·vue.js
曦月合一1 小时前
html中iframe标签 隐藏滚动条
前端·html·iframe
奶球不是球1 小时前
el-button按钮的loading状态设置
前端·javascript
kidding7231 小时前
前端VUE3的面试题
前端·typescript·compositionapi·fragment·teleport·suspense
Σίσυφος19003 小时前
halcon 条形码、二维码识别、opencv识别
前端·数据库
学代码的小前端3 小时前
0基础学前端-----CSS DAY13
前端·css
css趣多多4 小时前
案例自定义tabBar
前端
姑苏洛言6 小时前
DeepSeek写微信转盘小程序需求文档,这不比产品经理强?
前端
林的快手6 小时前
CSS列表属性
前端·javascript·css·ajax·firefox·html5·safari
匹马夕阳6 小时前
ECharts极简入门
前端·信息可视化·echarts