Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • CSS

  • JavaScript

  • 工具

  • Vue

  • antdv踩坑记录

  • Vue3

    • vue3 setup语法糖
    • vue3实现v-model
    • vue3组件通信
      • vue3使用pinia及pinia持久化
      • vue3使用$nextTick
      • Proxy的实际应用场景
      • ref和reactive的实现原理
      • vue3生命周期
      • 在vue文件外使用store
      • vue3中的编译器宏
      • vue3 ts中拼接本地图片地址
      • 数值滚动实现
      • setup语法糖下自定义组件name
      • vue-router4配置动态路由问题No match found for location with path
      • vue3挂载全局弹窗
      • vue3+vite配置环境变量问题
      • Vue3监听createApp创建的子组件事件
      • vue3源码学习——vue3核心模块
    • 前端
    • Vue3
    kros
    2023-06-26

    vue3父子组件通信

    大家都知道在vue2中组件通信无非就以下几种方式:

    1、父子组件使用props/$emit或$attrs/$listener进行数据交互,多层级组件可以使用inject/provide
    2、组件间通信可以采用事件总线机制new Vue(),创建一个空的vue使用全局的$on和$emit
    3、使用vuex状态管理
    
    1
    2
    3

    vue3中通信也无外乎上述几种方式,只是在vue3中的具体实现方式不同

    # 父子组件通信

    # props/$emit的区别

    在vue3中使用$emit需要提前注册

    <script setup lang="ts">
      // 注册  
      const emit = defineEmits(['changeValue'])
      
      const callbakc = () => {
        // 使用
        emit('changeValue', params)
      }
    </script>
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    defineEmits 仅在<script setup>下生效,如果使用setup函数参考以下写法:

    <script lang="ts">
    import { defineComponent } from 'vue'
    export default defineComponent({
      setup (props, { emit }) {
          function clickHandle () {
            let params = {}
            emit('changeValue', params)
          }
          return {
            clickHandle
          }
        }
    })
    
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    # $attrs/$listener区别

    vue3中删除了$listener并且合并到attrs中

    <script setup>
    import { useAttrs } from "vue";
    const attrs = useAttrs()
    </script>
    
    1
    2
    3
    4

    # 事件总线通信

    在vue2中通常使用Vue.prototype.$bus = new Vue()来实现事件总线,但在vue3中已经不存在Vue.prototype的写法了,要实现全局变量可以使用app.config.globalProperties 同时vue3中也没有了vm.$on和vm.$emit,所有在vue3中推荐使用mitt三方库来实现事件总线

    npm install --save mitt
    
    1
    import mitt from 'mitt'
    const emitter = mitt()
    
    // 注册事件
    emitter.on('changeEvent', (params) => {})
    
    // 触发事件
    emitter.emit('changeEvent', '哈哈哈')
    
    1
    2
    3
    4
    5
    6
    7
    8

    # vuex状态管理

    vue3中推荐使用pinia 来取代vuex进行状态管理。对于使用过vuex的人来说pinia写法差别不到,区别在于pinia使用vue3的组合式APi,具体请查看官方文档

    上次更新: 2025/09/05, 8:09:00
    vue3实现v-model
    vue3使用pinia及pinia持久化

    ← vue3实现v-model vue3使用pinia及pinia持久化→

    最近更新
    01
    Find the next perfect square
    09-05
    02
    Regex validate PIN code
    09-05
    03
    Find the odd int
    09-05
    更多文章>
    Theme by Vdoing | Copyright © 2020-2025 kros king
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev