第十二周(12.2-12.8)学习笔记 24软工陈奕君

学习收获:

在考核中学会了使用smartadmin框架还有antdv组件库开发项目,实现增删改查等功能

学习笔记:

组件通信

Vue3组件通信和Vue2的区别:

  • 移出事件总线,使用mitt代替。

  • vuex换成了pinia

  • .sync优化到了v-model里面了。

  • $listeners所有的东西,合并到$attrs中了。

  • $children被砍掉了。

1. 【props】

概述:props是使用频率最高的一种通信方式,常用与 :父 ↔ 子

  • 父传子:属性值是非函数

  • 子传父:属性值是函数

父组件:

<template>
  <div class="father">
    <h3>父组件,</h3>
        <h4>我的车:{{ car }}</h4>
        <h4>儿子给的玩具:{{ toy }}</h4>
        <Child :car="car" :getToy="getToy"/>
  </div>
</template>
​
<script setup lang="ts" name="Father">
    import Child from './Child.vue'
    import { ref } from "vue";
    // 数据
    const car = ref('奔驰')
    const toy = ref()
    // 方法
    function getToy(value:string){
        toy.value = value
    }
</script>

子组件

<template>
  <div class="child">
    <h3>子组件</h3>
        <h4>我的玩具:{{ toy }}</h4>
        <h4>父给我的车:{{ car }}</h4>
        <button @click="getToy(toy)">玩具给父亲</button>
  </div>
</template>
​
<script setup lang="ts" name="Child">
    import { ref } from "vue";
    const toy = ref('奥特曼')
    
    defineProps(['car','getToy'])
</script>

2. 【自定义事件】

  1. 概述:自定义事件常用于:子 => 父。

  2. 注意区分好:原生事件、自定义事件。

  • 原生事件:

    • 事件名是特定的(clickmosueenter等等)

    • 事件对象$event: 是包含事件相关信息的对象(pageXpageYtargetkeyCode

  • 自定义事件:

    • 事件名是任意名称

    • 事件对象$event: 是调用emit时所提供的数据,可以是任意类型!!!

    • 命名方式尽量不要驼峰式,而是采取keybab-case式,即send-toy

  1. 示例:

    <!--在父组件中,给子组件绑定自定义事件:-->
    <Child @send-toy="saveToy"/>
    ​
    <!--注意区分原生事件与自定义事件中的$event-->
    <button @click="toy = $event">测试</button>
    //父组件中,自定义事件被触发时所调用的函数:
    function saveToy(value:string){
      console.log(value)
    }
    //子组件中,声明事件并触发:
    const emit = defineEmits(['sent-toy'])
    emit('send-toy', 具体数据)

3. 【mitt】

概述:与消息订阅与发布(pubsub)功能类似,可以实现任意组件间通信。

安装mitt

npm i mitt

新建文件:src\utils\emitter.ts

  • on 触发事件

  • off 移除事件

  • all.clear 移除全部事件

// 引入mitt 
import mitt from "mitt";
​
// 创建emitter
const emitter = mitt()
​
/*
  // 绑定事件
  emitter.on('abc',(value)=>{
    console.log('abc事件被触发',value)
  })
  emitter.on('xyz',(value)=>{
    console.log('xyz事件被触发',value)
  })
​
  setInterval(() => {
    // 触发事件
    emitter.emit('abc',666)
    emitter.emit('xyz',777)
  }, 1000);
​
  setTimeout(() => {
    // 清理事件
    emitter.all.clear()
  }, 3000); 
*/
​
// 创建并暴露mitt
export default emitter

接收数据的组件中:绑定事件、同时在销毁前解绑事件:

import emitter from "@/utils/emitter";
import { onUnmounted } from "vue";
​
// 绑定事件
emitter.on('send-toy',(value)=>{
  console.log('send-toy事件被触发',value)
})
​
onUnmounted(()=>{
  // 解绑事件
  emitter.off('send-toy')
})

【第三步】:提供数据的组件,在合适的时候触发事件

import emitter from "@/utils/emitter";
​
function sendToy(){
  // 触发事件
  emitter.emit('send-toy',toy.value)
}

注意这个重要的内置关系,总线依赖着这个内置关系


第十二周(12.2-12.8)学习笔记 24软工陈奕君
http://localhost:8090//archives/di-shi-er-zhou-12.2-12.8-xue-xi-bi-ji-24ruan-gong-chen-yi-jun
作者
陈奕君
发布于
2025年12月08日
许可协议