Vue3.2组件如何封装,以弹窗组件的封装为例

以前一直想,每次封装一个弹窗组件的时候,一直特别复杂,父传子,子传父,各种来回绕,来回修改。
一直想如何才能更加简化,但是一直没时间,今天终于抽时间出来封装了一下
本次封装简化了很多的代码,再也不用父传子,子传父,各种来回绕,来回修改了。
实现功能如下:
js 复制代码
//拆分了表格组件和弹窗组件
//实现在父组件中,控制弹窗的显示与隐藏
//在弹窗子组件中,修改内容后,父组件内容对应更新。
2.所用技术
js 复制代码
//1.defineExpose 用于导出子组件的方法和数据
//2.defineEmits 用于子组件通知父组件执行操作
下面我来说一下,如何利用defineExpose和defineEmits来封装属于自己的组件吧
为了方便演示,这里就不上什么表格了,简单的用父组件和子组件进行演示,直接上代码
父组件代码
js 复制代码
<template>
 <div>
  <a-button type="primary" status="danger" @click="show">showModal</a-button>
  <!-- 为弹窗组件绑定ref  并且绑定子传父的emit事件 -->
  <homeModal ref="homeModalRef" @update="close"></homeModal>
 </div>
</template>

<script setup lang="ts">
import { ref, watch } from 'vue';
import homeModal from './component/homeModal.vue'

const homeModalRef = ref()
const show = () => {
  // 这里是调用了弹窗组件中的方法,实现弹窗的显示 用到了defineExpose方法
  homeModalRef.value.handleClick()
}

// 这里是接受触发事件后,父组件执行函数(各种请求)
const close = () => {
  getInitTable()
}
// 这里是模拟的函数请求方法
const getInitTable = () => {
  console.log('66666')
} 

</script>
<style scoped lang="less">
div{
  margin-top: 20px;
}
</style>
子组件代码
js 复制代码
<template>
  <div>
    <a-modal
      v-model:visible="visible"
      title="Modal Form"
      @cancel="handleCancel"
      @ok="handleOk"
    >
      <a-form :model="form">
        <a-form-item field="name" label="Name">
          <a-input v-model="form.name" />
        </a-form-item>
        <a-form-item field="post" label="Post">
          <a-select v-model="form.post">
            <a-option value="post1">Post1</a-option>
            <a-option value="post2">Post2</a-option>
            <a-option value="post3">Post3</a-option>
            <a-option value="post4">Post4</a-option>
          </a-select>
        </a-form-item>
      </a-form>
    </a-modal>
  </div>
</template>

<script setup lang="ts">
import { reactive, ref } from 'vue';
const visible = ref(false);

const form = reactive({
      name: '',
      post: ''
});

// 绑定emit事件
const emit = defineEmits<{
  (event:'update'):void
}>()

const handleClick = () => {
    visible.value = true;
};

const handleOk = () => {
  if (form.name !== '') {
    handleCancel()
    // 执行
    emit('update')
  }
};
const handleCancel = () => {
  visible.value = false;
}

// 导出方法
defineExpose({
  handleClick
})


</script>
<style scoped lang="less"></style>
相关推荐
工业互联网专业28 分钟前
毕业设计选题:基于ssm+vue+uniapp的校园水电费管理小程序
vue.js·小程序·uni-app·毕业设计·ssm·源码·课程设计
豆豆41 分钟前
为什么用PageAdmin CMS建设网站?
服务器·开发语言·前端·php·软件构建
计算机学姐1 小时前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis
JUNAI_Strive_ving1 小时前
番茄小说逆向爬取
javascript·python
看到请催我学习1 小时前
如何实现两个标签页之间的通信
javascript·css·typescript·node.js·html5
twins35202 小时前
解决Vue应用中遇到路由刷新后出现 404 错误
前端·javascript·vue.js
qiyi.sky2 小时前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js
煸橙干儿~~2 小时前
分析JS Crash(进程崩溃)
java·前端·javascript
哪 吒2 小时前
华为OD机试 - 几何平均值最大子数(Python/JS/C/C++ 2024 E卷 200分)
javascript·python·华为od
安冬的码畜日常2 小时前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺