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


    以前一直想,每次封装一个弹窗组件的时候,一直特别复杂,父传子,子传父,各种来回绕,来回修改。
    一直想如何才能更加简化,但是一直没时间,今天终于抽时间出来封装了一下
    本次封装简化了很多的代码,再也不用父传子,子传父,各种来回绕,来回修改了。
    实现功能如下:
    //拆分了表格组件和弹窗组件
    //实现在父组件中,控制弹窗的显示与隐藏
    //在弹窗子组件中,修改内容后,父组件内容对应更新。
    
    • 1
    • 2
    • 3
    2.所用技术
    //1.defineExpose 用于导出子组件的方法和数据
    //2.defineEmits 用于子组件通知父组件执行操作
    
    • 1
    • 2
    下面我来说一下,如何利用defineExpose和defineEmits来封装属于自己的组件吧
    为了方便演示,这里就不上什么表格了,简单的用父组件和子组件进行演示,直接上代码
    父组件代码
    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    子组件代码
    <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>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 相关阅读:
    springboot小区疫苗接种管理系统设计与实现毕业设计源码021530
    场景应用:设计一个论坛的评论回复功能
    详解LockSupport的使用
    Leetcode(347)——前 K 个高频元素
    深度神经网络是谁发明的,神经网络是谁发明的人
    【SQL Server】数据库开发指南(九)详细讲解 MS-SQL 触发器的的创建、修改、应用与适用场景
    【Android笔记32】Android中数据存储技术之SQLite事务操作以及存储大文件
    Redis Hotkey?3招定位+5招解决
    java数组算法运用
    mybatis中resultMap和resultType的区别
  • 原文地址:https://blog.csdn.net/m0_56986233/article/details/132890642