Element UI中el-dialog作为子组件如何由父组件控制显示/隐藏~

1、这里介绍的是将el-dialog作为组件封装便于复用,如何通过父组件控制子组件dialog的显示与隐藏。

2、思路:首先el-dialog是通过dialogVisible的值是否为true或false来控制显示与隐藏的。那么我们可以通过父传子props来将true(即showFlag的值)传递给dialog子组件,然后在子组件中监听showFlag值的变化,一旦出现变化就将showFlag的值赋值给dialogVisible,以此来实现dialog组件的显示。

如何控制隐藏呢?或者说如何实现二次点击显示?

思路:首先我们通过子传父$emit传递一个自定义事件hiddenFlag给父组件,然后在父组件中触发该方法,将showFlag的值变为false即可。

3、还有一种方法就是通过给子组件添加v-if来控制,根据个人爱好来选择吧。

4、封装dialog子组件。

javascript 复制代码
<template>
  <el-dialog
    title="添加商品"
    :visible.sync="dialogVisible"
    width="40%"
    :before-close="handleClose"
    style="text-align: center; line-height: 20px"
  >
    <el-form
      :model="ruleForm"
      :rules="rules"
      ref="ruleForm"
      label-width="100px"
      class="demo-ruleForm"
    >
      <el-form-item label="活动名称" prop="newName">
        <el-input v-model="ruleForm.newName"></el-input>
      </el-form-item>
      <el-form-item label="活动日期" required>
        <el-form-item prop="newData">
          <el-date-picker
            type="date"
            placeholder="选择活动日期"
            v-model="ruleForm.newData"
            style="width: 100%"
          ></el-date-picker>
        </el-form-item>
      </el-form-item>
      <el-form-item label="活动地址" prop="newAddress">
        <el-input v-model="ruleForm.newAddress"></el-input>
      </el-form-item>
      <el-form-item label="爱好" prop="newLikes">
        <el-input v-model="ruleForm.newLikes"></el-input>
      </el-form-item>
    </el-form>

    <span slot="footer" class="dialog-footer">
      <el-button @click="Cancel()">取 消</el-button>
      <el-button type="primary" @click="determine()">确 定</el-button>
    </span>
  </el-dialog>
</template>
<script>
export default {
  name: "diaLog",
  data() {
    return {
      dialogVisible: false,
      ruleForm: {
        newName: "",
        newAddress: "",
        newData: "",
        newLikes: "",
      },
      rules: {
        newName: [
          { required: true, message: "请输入活动名称", trigger: "blur" },
        ],
        newAddress: [
          { required: true, message: "请选择活动区域", trigger: "blur" },
        ],
        newData: [
          {
            type: "date",
            required: true,
            message: "请选择日期",
            trigger: "change",
          },
        ],
        newLikes: [{ required: true, message: "请输入爱好", trigger: "blur" }],
      },
    };
  },
  props: ["showFlag"],
  watch: {
    // 监听父组件传递过来的showFlag的变化,控制dialog的显示
    showFlag() {
      this.dialogVisible = this.showFlag;
    },
  },
  methods: {
    // 关闭弹窗
    handleClose(done) {
      done();
      this.$emit("hiddenFlag");
    },
    //   取消
    Cancel() {
      this.$emit("hiddenFlag");
    },
    //   确定
    determine() {
      this.$emit("hiddenFlag");
    },
  },
};
</script>

<style></style>

5、使用子组件。

javascript 复制代码
<template>
  <div>
      <el-button type="primary" @click="addGoods()">添加商品</el-button>
      <!-- 对话框 -->
      <diaLog :showFlag="showFlag" @hiddenFlag="hidden()"></diaLog>
  </div>
</template>

<script>
import diaLog from "../components/dialog.vue";
export default {
  name: "newUser",
  data() {
    return {
      showFlag: false,

    };
  },
  components: {
    diaLog,
  },
  methods: {
    // 添加商品
    addGoods() {
      // 展示弹窗
      this.showFlag = true;
    },
    // 接收dialog组件传递过来的隐藏弹窗信息
    hidden() {
      this.showFlag = false;
    }
  },
};
</script>

<style></style>

效果图:

相关推荐
Forever7_2 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
不会敲代码12 小时前
前端组件化样式隔离实战:React CSS Modules、styled-components 与 Vue scoped 对比
css·vue.js·react.js
Angelial2 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
SuperEugene4 小时前
Vue状态管理扫盲篇:如何设计一个合理的全局状态树 | 用户、权限、字典、布局配置
前端·vue.js·面试
阿懂在掘金4 小时前
defineModel 是进步还是边界陷阱?双数据源组件的选择逻辑
vue.js·源码阅读
李剑一4 小时前
要闹哪样?又出现了一款新的格式化插件,尤雨溪力荐,速度提升了惊人的45倍!
前端·vue.js
阿虎儿5 小时前
React Context 详解:从入门到性能优化
前端·vue.js·react.js
滕青山7 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js
时光不负努力7 小时前
ts+vue3开发规范
vue.js·typescript
梦想CAD控件8 小时前
在线CAD开发包结构与功能说明
前端·javascript·vue.js