当前位置: 首页 > article >正文

vue3 父组件调用子组件 el-drawer 抽屉

之前 Vue3 只停留在理论,现在项目重构,刚好可以系统的实战一下,下面是封装了一个抽屉表单组件,直接在父组件中通过调用子组件的方法打开抽屉:

父组件:

<template>
  <div id="app">
    <div @click="getChildValue">open</div>
    <custom-form
      ref="childRef"
      :fields="fields"
      :form="form"
      :rules="rules"
      :saveForm="saveForm"
    ></custom-form>
  </div>
</template>

<script setup>
import CustomForm from "@/components/CustomModelForm";
import { reactive } from "vue";

const formData = reactive({
  form: {
    name: "",
    email: "",
    date: "",
    password: "",
  },
  fields: [
    {
      prop: "name",
      label: "Name",
      component: "el-input",
      props: { placeholder: "Enter your name" },
    },
    {
      prop: "email",
      label: "Email",
      component: "el-input",
      props: { placeholder: "Enter your email" },
    },
    {
      prop: "date",
      label: "Date",
      component: "el-date-picker",
      props: {
        placeholder: "Enter your date",
        format: "YYYY-MM-DD",
        valueFormat: "YYYY-MM-DD",
      },
    },
    {
      prop: "password",
      label: "Password",
      component: "el-input",
      props: { placeholder: "Enter your password", type: "password" },
    },
  ],
  rules: {
    name: [
      { required: true, message: "Please input your name", trigger: "blur" },
    ],
    email: [
      { required: true, message: "Please input your email", trigger: "blur" },
    ],
    password: [
      {
        required: true,
        message: "Please input your password",
        trigger: "blur",
      },
    ],
  },
});
const { form, fields, rules } = toRefs(formData);
const childRef = ref(null);

function getChildValue() {
  childRef.value?.open();
}

function saveForm() {
  console.log(form.value);
}
</script>

子组件:

<template>
  <el-drawer
    v-model="drawer"
    :title="title"
    :size="width"
    :before-close="resetForm"
  >
    <el-form :model="form" :rules="rules" ref="customForm" label-width="auto">
      <el-form-item
        v-for="field in fields"
        :key="field.prop"
        :label="field.label"
        :prop="field.prop"
      >
        <component
          :is="field.component"
          v-bind="field.props"
          v-model="form[field.prop]"
        />
      </el-form-item>
    </el-form>
    <template #footer>
      <div style="flex: auto">
        <el-button type="primary" @click="submitForm">保存</el-button>
        <el-button @click="resetForm">取消</el-button>
      </div>
    </template>
  </el-drawer>
</template>

<script setup>
const props = defineProps({
  // 抽屉标题
  title: {
    type: String,
    default: "标题",
  },
  // 表单元素 JSON
  fields: {
    type: Array,
    required: true,
  },
  // 表单数据
  form: {
    type: Object,
    required: true,
  },
  // 表单校验规则
  rules: {
    type: Object,
    default: () => ({}),
  },
  // 设置抽屉宽
  width: {
    type: String,
    default: "30%",
  },
  // 保存表单方法
  saveForm: {
    type: Function,
    default: () => {},
  },
});

const drawer = ref(false); // 控制抽屉显隐
const customForm = ref(null); // 表单 ref

// 提交表单
const submitForm = () => {
  customForm.value.validate((valid) => {
    if (valid) {
      props.saveForm();
      resetForm();
    } else {
      console.log("error submit!!");
      return false;
    }
  });
};

// 打开抽屉
function open() {
  drawer.value = true;
}

// 关闭抽屉
const resetForm = () => {
  customForm.value.resetFields();
  drawer.value = false;
};

defineExpose({
  open,
});
</script>

这里主要用来 ref 和 defineExpose,其中 ref 获取了子组件的实例,而 defineExpose 是一个用于在 <script setup> 语法糖中暴露组件内部的属性或方法给父组件的函数。通过使用 defineExpose,你可以控制哪些属性和方法可以被外部访问,从而增强组件的封装性和安全性。


http://www.kler.cn/a/441216.html

相关文章:

  • Java---猜数字游戏
  • 知识管理系统塑造企业文化与学习型组织的变革之路
  • NoSQL与SQL比较
  • Baklib揭示内容中台与人工智能技术的创新协同效应
  • Vue.js `setup()` 函数的使用
  • 区块链的数学基础:核心原理与应用解析
  • linux 串口调试工具minicom使用详解
  • CSS基础与应用详解
  • 王佩丰24节Excel学习笔记——第十五讲:条件格式与公式
  • 浅谈Java注解之CachePut
  • springboot城镇保障性住房管理系统(代码+数据库+LW)
  • go语言使用websocket发送一条消息A,持续接收返回的消息
  • 代码随想录day21 | leetcode 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 二叉树总结篇
  • 【JavaEE】网络(4)
  • 无人机节气门控制技术概述!
  • 基础数据结构---栈
  • 微积分复习笔记 Calculus Volume 2 - 4.2 Direction Fields and Numerical Methods
  • spring循环依赖深度源码解析
  • 开发小技巧之GIT版本回退
  • Linux在Ubuntu系统下安装MySQL数据库(全网最详细)
  • 二十四、Qt之使用动态库
  • 学习笔记070——Java中【泛型】和【枚举】
  • 如何获取抖音item_get_app接口
  • 【Linux】—简单实现一个shell(myshell)
  • 快速掌握源码部署Filebeat
  • 浅谈基于单片机的计步器设计