Vue2 VS Vue3

vue3

是的,Vue 3 确实取消了基于 JavaScript 原型的 Vue 和 VueComponent 构造函数(即你提到的 vm 和 vc),取而代之的是一种完全不同的、基于普通对象和代理(Proxy)的实例管理方式。

这是一个颠覆性的改变,它带来了更好的性能、更小的包体积和更灵活的 API 设计。

原生DOM事件 自定义事件
csharp 复制代码
# ==============  vue2 中  ==============
1. 原生DOM事件 放在在元素 是原生DOM事件 比如 <button @click='hander' />
2. 原生DOM事件 放在组件上 需要通过.native修饰符 变为原生DOM事件,否则是自定义事件 比如 <MyComponet @click.native='hander' />
<template>
  <!-- 监听组件根元素的原生 click 事件 -->
  <MyButton @click.native="handleNativeClick" />

  <!-- 监听子组件的自定义事件 -->
  <MyButton @my-click="handleCustomClick" />
</template>

通过this.$emit(事件类型,参数)  触发
通过this.$off('事件类型')  解绑

# ==============  vue3 中  ==============
1. 原生DOM事件(单击、双击等),无论放在元素,还是 组件   ,都是原生DOM事件

//  在子组件中  <script setup>中
通过defineEmits 编译器宏来获取   // 声明事件
let emit = defineEmits(['事件类型'])
emit('事件类型',..args)

// 3.3+:另一种更简洁的语法
//来指定事件的类型和参数,这有助于提高代码的可维护性和类型安全性
const emit = defineEmits<{
  change: [id: number] // 具名元组语法
  update: [value: string]
}>()

<template>
  <!-- 因为 'click' 不是声明的自定义事件,所以会作为原生事件加到根元素上 -->
  <MyButton @click="handleNativeClick" />

  <!-- 'my-click' 是声明的自定义事件,所以由子组件 emit 触发 -->
  <MyButton @my-click="handleCustomClick" />
</template>
<script setup>
let emit = defineEmits(['my-click']); // 声明后,@click 就是自定义事件 
</script>


vue2 全局事件总线 vue3 mitt 》》兄弟间组件、任意组件之间通信

vue2 全局事件总线

typescript 复制代码
//1、安装 mitt 是第三方的 
    npm i mitt 
//2、创建 事件总线
// 文件位置:src/utils/eventBus.js
// 导入 mitt
import mitt from 'mitt';

// 创建 mitt 实例
const emitter = mitt();

// 导出该实例,以便在其它组件中使用
export default emitter;

》》发送方

vue 复制代码
<template>
  <button @click="sendMessage">发送消息给 ComponentB</button>
</template>

<script setup>
// 导入我们创建的事件总线实例
import emitter from '@/utils/eventBus';

const sendMessage = () => {
  // 使用 emit 触发一个名为 'message-from-a' 的事件,并附带数据
  emitter.emit('message-from-a', {
    text: '你好,这是来自 ComponentA 的消息!',
    timestamp: new Date()
  });
  console.log('消息已发送!');
};
</script>

》》接收方

vue 复制代码
<template>
  <div>
    <h3>收到消息:</h3>
    <p v-if="receivedMessage">{{ receivedMessage }}</p>
  </div>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
// 导入事件总线
import emitter from '@/utils/eventBus';

const receivedMessage = ref(null);

// 定义处理事件的函数
const handleMessage = (data) => {
  receivedMessage.value = `${data.text} (发送时间: ${data.timestamp.toLocaleTimeString()})`;
};

// 在组件挂载时开始监听事件
onMounted(() => {
  emitter.on('message-from-a', handleMessage);
});

// !!! 非常重要:在组件卸载时移除监听器,防止内存泄漏
onUnmounted(() => {
  emitter.off('message-from-a', handleMessage);
});
</script>
相关推荐
东东5163 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino3 小时前
图片、文件的预览
前端·javascript
2501_920931704 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
AI老李5 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
方也_arkling5 小时前
Element Plus主题色定制
javascript·sass
2601_949809595 小时前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
Up九五小庞5 小时前
开源埋点分析平台 ClkLog 本地部署 + Web JS 埋点测试实战--九五小庞
前端·javascript·开源
摘星编程6 小时前
React Native + OpenHarmony:UniversalLink通用链接
javascript·react native·react.js
qq_177767376 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
烬头88216 小时前
React Native鸿蒙跨平台应用实现了onCategoryPress等核心函数,用于处理用户交互和状态更新,通过计算已支出和剩余预算
前端·javascript·react native·react.js·ecmascript·交互·harmonyos