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>

效果图:

相关推荐
如果超人不会飞10 小时前
脉络清晰的业务演进:TinyVue Timeline 时间线组件全方位实战指南
vue.js
如果超人不会飞10 小时前
从扁平到立体:掌握 TinyVue Grid 树形表格的高级实战指南
vue.js
用户21366100357213 小时前
Vue2组件化开发与父子通信
前端·vue.js
用户21366100357213 小时前
Vue2事件系统与指令进阶
前端·vue.js
逸铭17 小时前
Day 5:三栏布局——左账号 / 中聊天 / 右工具
vue.js·electron
用户17335980753718 小时前
Vue 3 SPA 首屏优化:从 3s 到 1.2s 的 5 个实践
前端·vue.js
锋行天下1 天前
我试图优化 Vite 的拆包,结果首屏慢了 10 倍
前端·vue.js·架构
ZhengEnCi2 天前
Q02-Vue-React-index.html完全指南
vue.js·react.js·html
晴虹2 天前
vue3-scroll-more:横向滚动条-元素或页签过多滚动显示处理的组件
前端·vue.js
Forever7_2 天前
尤雨溪转发:Vue-tui 0.1 发布!Vue 终于杀进终端!
vue.js