jquery加载页面的几种方法(页面加载完成就执行)如何去掉css 渐变时的锯齿效果AJAX请求以及解决跨域的问题浅析Vue3动态组件怎么进行异常处理html+css+js写的AI五子棋游戏(附源码)基于jquery 实现导航条高亮显示的两种方法EasyUI使用DataGrid实现动态列数据绑定Vue怎么通过JSX动态渲染组件JS 获取当前日期、时间、星期聊一聊Node.js中的 GC(垃圾回收)机制Ajax 请求队列解决方案并结合elementUi做全局加载状态前端代码风格规范总结JS Generator函数yield表达式示例详解javascript子窗口父窗口相互操作 取值赋值的问题CSS如何实现波浪效果ECharts实现数据超出Y轴最大值max但不隐藏CSS样式穿透的几种方法JavaScript 类型转换CSS 设置页面缩放如何在Vue3+Vite中使用JSXlinux平台下node cnpm的安装方法vue中v-if和v-for的区别是什么详解Vue PC端如何实现扫码登录功能CSS 网格(Grid)布局JavaScript 请求服务端接口Angular开发问题记录:组件拿不到@Input输入属性聊一聊CSS中的盒模型和box-sizing属性vue3.0对服务端进行渲染Web 页面如何实现动画效果移动端 H5 实现拍照功能的几种方法CSS 样式优先级HTML 块级元素、行内元素和行内块级元素深入聊一聊vue3中的reactive()CSS 媒体查询Angular中的路由(Routing)原理怎么移除css的hover事件让交互更加生动!巧用CSS实现鼠标跟随 3D 旋转效果Web页面的几种布局方式JavaScript 评测代码运行速度的几种方法优化jQuery性能的多种方法(整理总结)说一下Vue组件中的自定义事件和全局事件总线列举一下JavaScript中对数组进行合并的几种方法JavaScript 对象合并带你深入了解一下vue.js中的this.$nextTick!如何在JavaScript中对文件进行处理Vue.js 前端项目在常见 Web 服务器上的部署配置vue中$set的实现方法CSS 实现文本装饰效果JavaScript 高阶函数History 和 Hash 路由模式Vue3学习之深度剖析CSS Modules和ScopeCSS 清除浮动CSS 设置背景图片【整理分享】一些常见Vue面试题(附答案解析)CSS里面的transform 属性CSS中的几种尺寸单位总结JavaScript中的条件判断与比较运算uni-app 滚动通知组件的实现JavaScript 执行上下文与作用域前端兼容性问题总结前端性能优化——图片优化JS中数组去重的几种方法JavaScript里实现继承的几种方式JavaScript使用reduce方法实现简单的 i18n 功能JavaScript 日期和时间的格式化大汇总(收集)JS里的原始值与引用值JavaScript 文件处理检测js代码中可能导致内存泄漏的工具Angular学习之ControlValueAccessor接口详解uni-app 日历组件的实现Vue 组件之间传值JavaScript里的回调函数属于闭包吗?JavaScript 解决冒泡事件导致的性能问题总结一下JavaScript中的一些奇怪问题简单说一下JavaScript中的事件冒泡和事件捕获关于 WebpackJavaScript中的循环类型5个实用的TypeScript操作符,助你提升开发能力!HTML img 元素无法显示 base64 图片的可能原因jQuery 遍历方法总结前端性能优化——内存问题javascript中脚本加载和执行机制Web 页面之间传递参数的几种方法解释一下JavaScript中0.1+0.2不等于0.3的问题总结一下JavaScript 中apply、call、bind的使用方法什么是EventLoop?怎么测试Node或页面的性能JavaScript 中 new Date(time).getTime() 获取时间戳方法在 iOS 中的兼容性问题JS里数组合并的几种方法详解vue各种权限控制与管理的实现思路uni-app 弹出层组件的实现用JavaScript实现文件的上传与下载前端性能优化总结简单说一下JavaScript中的事件委托JavaScript如何删除css总结一下JS中的排序算法关于js中的作用域和闭包让页面元素居中的一些方法【javascript算法】二分查找法如何在前端实现上万行大量数据的秒级响应?CSS中父元素被子元素的margin-top影响的解决方法js使用splice方法删除数组元素可能导致的问题如何运行vue项目(超详细图解)js隐式类型转换的副作用了解js的原型和原型链js中的循环引用js判断变量类型的方法web页面最常用的正则校验规则总结js内存管理和垃圾回收js中this关键字的作用和如何改变其上下文JS中的操作符和运算符大总结Vue3 watch 监听对象数组中对象的特定属性总结一下js的浅拷贝和深拷贝JavaScript中的异步编程JavaScript使用一个数组对另一个对象数组进行过滤一个基于Vue3实现的简单日历组件CSS实现磨砂玻璃(毛玻璃)效果样式解决“Vue3调用本地服务接口失败,老是提示下载并安装本地服务”的办法vue3基于组合式API使异步获取的数据对象具有响应性ASP.NET给前端动态添加修改CSS样式JS 标题 关键字在js中如何获取对象的长度了解一下js中的函数式编程Vue框架中监测数组变化的方法VUE html里的文本框只允许输入数字的两种方法分享几种js格式化金额的方法JavaScript的Promise同步处理js中的简写语法JavaScript 面向切面编程(AOP,装饰者模式)了解一下js的跨域问题谈一谈Vue怎么用extend动态创建组件Vue3实现印章徽章组件js中断 forEach 循环的几种方法vue3组件间怎么通信?简述一下通信方式CSS 设置文字间距CSS 网格(Grid)布局Vue3 实现模态框组件js处理扁平数组和树结构相互转换使用Vue和jsmind如何实现思维导图的历史版本控制和撤销/重做功能?Vue.js与ASP.NET的结合,实现企业级应用的开发和部署检查js中的字符串是否可以成为回文Vue.nextTick函数的用法及在异步更新中的应用关于js中0.1+0.2不等于0.3的问题使用JavaScript开发网页地图导航js中如何使用可选函数参数Vue与js的融合,如何编写现代化的前端应用关于Vue与服务器端的通信:如何实现登录鉴权Vue.js的响应式原理如何使用 FabricJS 禁用椭圆的居中旋转?使用JavaScript实现页面滑动切换效果移动端H5页面的缓存问题js里base64与file之间的转换分享一下利用Vue表单处理实现复杂表单布局如何使用CSS创建渐变阴影?如何在 JavaScript 中查看结构体数组?css的弹性布局(Flex布局)Vue统计图表的数据标签和数值显示技巧js实用工具方法库大总结使用Angular和MongoDB来构建具有登录功能的博客应用程序如何在Vue表单处理中实现表单字段的文件下载使用js开发交互式地图应用Vue.component函数的使用及如何创建局部组件css实现三角形的几种方法移动端H5实现自定义拍照界面如何在js中遍历对象jquery如何修改选中状态如何使用js对图像进行压缩js如何计算base64编码图片的大小关于Vue双向数据绑定原理详解Vue.filter函数及如何自定义过滤器列举一下js数组的reduce方法的一些应用如何在Vue表单处理中实现表单的条件渲染vue中的canvas插件js数组的reduce方法的一些应用VUE里使用虚拟DOM来优化更新流程canvas对象有哪些方法js中URL查询字符串(query string)的序列与反序列化如何使用 JavaScript/jQuery 为网站创建暗/亮模式?总结html5中常见的选择器Vue组件开发:工具提示组件的实现方法总结js中常见的层次选择器利用Vue2实现印章徽章组件Vue组件实战:列表组件开发js中如何将对象转换为数组Vue组件开发:地图组件实现方法如何将数据存储到 DOM 中?Vue实战:图片上传组件开发如何使用Vue实现可视化界面设计?vite+TypeScript+vue3+router4+Pinia+ElmPlus+axios+mock项目基本配置Vue组件库推荐:Ant Design Vue深度解析使用Vue实现弹窗效果React Query 数据库插件:与分布式系统的协作指南如何使用vue ui创建vue项目使用CSS的Positions布局打造响应式网页无感刷新页面(附可运行的前后端源码,前端vue,后端node)Css Flex 弹性布局中的换行与溢出处理方法Vue组件库推荐:Element UI深度解析分享一个用HTML、CSS和jQuery构建的漂亮的登录注册界面如何利用React和Sass实现可定制的前端样式如何在Vue中实现拖拽上传文件vue3+TypeScript全局事件总线mitt分享一个Pinia存储的数据持久化插件HTML、CSS和jQuery:实现图片折叠展开的效果如何使用HTML和CSS创建动画条形图?如何利用React和Flutter构建跨平台移动应用用html、css和jQuery实现图片翻页的特效利用Promise优化Vue异步操作的方法CSS Positions布局与网页导航的优化技巧js多图合成一张图CSS3实现动态旋转加载样式使用Velocity.js将动画添加到网页使用FabricJS创建Image对象的JSON表示vue3递归组件---树形组件vue3+TypeScript全局事件总线mitt在Vue中实现可编辑的表格vue3+TypeScript自定义指令:长按触发绑定的函数Vue中如何处理表单数据的双向绑定和验证Vue 简介Vue 安装Vue 常用指令Vue 实例Vue 计算属性Vue 动态样式绑定Vue 事件处理Vue 侦听器Vue 数据双向绑定Vue过渡 & 动画Vue 实例生命周期Vue 插槽的使用Vue 组件基础Vue动态组件 & keep-aliveVue 组件间通信Vue 过滤器Vue 自定义指令Vue 混入 MixinsVue 插件Vue 渲染函数VueRouter 编程式导航VueRouter 路由嵌套VueRouter 基础应用VueRouter 命名视图VueRouter 命名路由Vuex 简介、安装VueRouter 路由传参VueRouter 路由别名、重定向Vuex GetterVuex StateVuex ActionVuex MutationVue-Cli & VueDevTools安装Vuex ModulesVue 第三方库的使用Vue-Cli 项目文件结构分析Vue 本地 Mock 数据Vue 项目打包部署Element 美化 TODO 项目

Vue 组件之间传值

一、Vue 组件之间传值的主要方法

Vue 3 对于组件之间传递值的基本思想与 Vue 2 相似,但是有一些语法和 API 上的改变,主要的传值方法有以下几种:

1、父组件向子组件传值,使用 props:可以通过在子组件上绑定 props,然后在父组件中通过 v-bind 绑定相应的数据来传递数据。

2、子组件向父组件传值,使用 $emit:可以通过在子组件中使用 $emit 触发自定义事件,并在父组件中使用 v-on 监听相应的事件来传递数据。

3、兄弟组件之间传值:可以通过使用一个共同的父组件,然后将需要共享的数据放在父组件的 data 中,再通过 props 将数据传递给各自的子组件。

4、跨级组件传值,使用 provide 和 inject(同样适用于父子组件传值):provide 可以在祖先组件中定义一个值或者方法,然后在子孙组件中使用 inject 来注入这个值或者方法。

5、使用全局事件总线:可以使用 Vue 的事件机制,通过在 Vue 实例上使用 $on 来监听事件,然后在其他组件中使用 $emit 触发相应的事件来传递数据。这种方式可以在任意组件之间传递数据。

6、使用 Vuex:当应用的数据状态比较复杂或者需要在多个组件之间共享时,可以使用 Vuex,它是一个专为 Vue.js 应用程序开发的状态管理模式。可以在任何组件中访问和修改 Vuex 存储的数据,通过 mutations 来修改状态,通过 actions 来触发 mutations。这种方式可以方便地在不同的组件中进行状态管理和数据共享。

7、使用 $attrs 和 $listeners,$attrs 和 $listeners 是常用的两个特殊属性,它们可以用来向组件传递属性和事件监听器。

8、使用 $refs:可以使用 Vue 提供的 $refs 属性来获取组件实例,然后通过调用组件的方法来进行数据传递。这种方式不推荐使用,因为不易维护和调试。

9、使用事件总线库:可以使用 Vue.js 的第三方库如 Event Bus、Tiny-Emmiter 等来传递数据。这些库提供了一种方便、简单的方式来在不同的组件之间进行事件传递。但是需要注意,使用第三方库可能会增加项目的复杂性和维护成本。

二、Vue 2 组件之间传值示例代码

  • 1、父组件向子组件传值,使用 props:可以通过在子组件上绑定 props,然后在父组件中通过 v-bind 绑定相应的数据来传递数据。

父组件中的代码:

<template>
  <div>
    <child-component :prop-a="dataA"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent,},data() {
    return {
      dataA: 'data from parent',};
  },};
</script>

 子组件中的代码:

 

<template>
  <div>
    {{ propA }}
  </div>
</template>

<script>
export default {
  props: {
    propA: String,};
</script>
  • 2、子组件向父组件传值,使用 $emit:可以通过在子组件中使用 $emit 触发自定义事件,并在父组件中使用 v-on 监听相应的事件来传递数据。

子组件中的代码:

<template>
  <div>
    <button @click="sendDataToParent">Send Data To Parent</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      dataB: 'data from child',methods: {
    sendDataToParent() {
      this.$emit('send-data',this.dataB);
    },};
</script>

 父组件中的代码:

<template>
  <div>
    <child-component @send-data="receiveDataFromChild"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent,methods: {
    receiveDataFromChild(dataB) {
      console.log(dataB);
    },};
</script>

 

  • 3、兄弟组件之间传值:可以通过使用一个共同的父组件,然后将需要共享的数据放在父组件的 data 中,再通过 props 将数据传递给各自的子组件。

父组件中的代码:

<template>
  <div>
    <child-a :prop-a="dataA"></child-a>
    <child-b :prop-b="dataB"></child-b>
  </div>
</template>

<script>
import ChildA from './ChildA.vue';
import ChildB from './ChildB.vue';

export default {
  components: {
    ChildA,ChildB,data() {
    return {
      dataA: 'data from parent to child a',dataB: 'data from parent to child b',};
</script>

 子组件 A 中的代码:

<template>
  <div>
    {{ propA }}
  </div>
</template>

<script>
export default {
  props: {
    propA: String,};
</script>

 子组件 B 中的代码:

<template>
  <div>
    {{ propB }}
  </div>
</template>

<script>
export default {
  props: {
    propB: String,};
</script>

 

  • 4、跨级组件传值,使用 provide 和 inject(该方法也可用于父子组件传值):provide 可以在祖先组件中定义一个值或者方法,然后在子孙组件中使用 inject 来注入这个值或者方法。

祖先组件中的代码:

<template>
  <div>
    <child-a></child-a>
  </div>
</template>

<script>
import ChildA from './ChildA.vue';

export default {
  components: {
    ChildA,provide() {
    return {
      sharedData: 'data from ancestor',};
</script>

 子孙组件 A 中的代码:

<template>
  <div>
    {{ sharedData }}
  </div>
</template>

<script>
export default {
  inject: ['sharedData'],};
</script>

 

  • 5、使用全局事件总线:可以使用 Vue 的事件机制,通过在 Vue 实例上使用 $on 来监听事件,然后在其他组件中使用 $emit 触发相应的事件来传递数据。这种方式可以在任意组件之间传递数据。

在 main.js 中定义一个空的 Vue 实例作为事件总线:

import Vue from 'vue';
export const bus = new Vue();

 子组件 A 中的代码:

<template>
  <div>
    <button @click="sendDataToSibling">Send Data To Sibling</button>
  </div>
</template>

<script>
import { bus } from './main';

export default {
  methods: {
    sendDataToSibling() {
      bus.$emit('send-data','data from child a');
    },};
</script>

 子组件 B 中的代码:

<template>
  <div>
    {{ dataFromSibling }}
  </div>
</template>

<script>
import { bus } from './main';

export default {
  data() {
    return {
      dataFromSibling: '',mounted() {
    bus.$on('send-data',(data) => {
      this.dataFromSibling = data;
    });
  },};
</script>

 

  • 6、使用 Vuex:当应用的数据状态比较复杂或者需要在多个组件之间共享时,可以使用 Vuex,它是一个专为 Vue.js 应用程序开发的状态管理模式。可以在任何组件中访问和修改 Vuex 存储的数据,通过 mutations 来修改状态,通过 actions 来触发 mutations。这种方式可以方便地在不同的组件中进行状态管理和数据共享。

在 store.js 中定义一个 Vuex store:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    dataC: 'data from Vuex',mutations: {
    updateDataC(state,payload) {
      state.dataC = payload;
    },});

export default store;

 子组件 A 中的代码:

<template>
  <div>
    <button @click="sendDataToSibling">Send Data To Sibling</button>
  </div>
</template>

<script>
import { mapMutations } from 'vuex';

export default {
  methods: {
    ...mapMutations(['updateDataC']),sendDataToSibling() {
      this.updateDataC('data from child a');
    },};
</script>

 子组件 B 中的代码:

<template>
  <div>
    {{ dataC }}
  </div>
</template>

<script>
import { mapState } from 'vuex';

export default {
  computed: {
    ...mapState(['dataC']),};
</script>

 

  • 7、父子组件传值,使用 $attrs$listeners

$attrs 是一个包含了父组件传递给子组件的所有属性的对象,可以在子组件中通过访问 $attrs 来获取这些属性。如果不希望某些属性传递到子组件中,可以在子组件中使用 v-bind="$attrs" 并指定排除的属性名称,或者在父组件中使用 .sync 修饰符,将属性绑定到子组件的一个名为 $attrs 的属性上。

$listeners 是一个包含了父组件传递给子组件的所有事件监听器的对象,可以在子组件中通过访问 $listeners 来获取这些事件监听器。如果需要在子组件中监听某个事件,可以使用 v-on="$listeners" 将所有的事件监听器绑定到子组件上。

$attrs 和 $listeners 是常用的两个特殊属性,它们可以用来向组件传递属性和事件监听器。假设我们有一个父组件和一个子组件,子组件需要接收父组件的一些属性和事件监听器,同时还需要把这些属性和事件传递给子组件的某个子元素。

父组件中的代码:

<template>
  <div>
    <child-component :title="title" v-on:click="handleClick" />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },data() {
    return {
      title: 'Hello World',methods: {
    handleClick() {
      console.log('Button Clicked');
    },};
</script>

 子组件中的代码:

<template>
  <div>
    <button @click="$emit('click')">Click me</button>
    <div v-bind="$attrs">
      <slot />
    </div>
  </div>
</template>

<script>
export default {
  inheritAttrs: false,props: {
    title: {
      type: String,default: '',mounted() {
    console.log(this.$attrs);
    console.log(this.$listeners);
  },};
</script>

 

在子组件中,我们使用 v-bind="$attrs" 把所有父组件传递过来的属性绑定到子元素上。同时,我们使用 $emit('click') 来触发父组件传递过来的点击事件。

在子组件 中,需要设置 inheritAttrs: false,来禁止自动将父组件传递的属性绑定到子组件的根元素上。这样,我们就可以使用 v-bind="$attrs" 把所有属性绑定到子元素上。

在 mounted 钩子中,我们可以通过 this.$attrsthis.$listeners 来分别访问所有属性和事件监听器。这样,我们就可以在子组件中使用这些属性和事件了。

  • 8、使用 $refs:可以使用 Vue 提供的 $refs 属性来获取组件实例,然后通过调用组件的方法来进行数据传递。这种方式不推荐使用,因为不易维护和调试。
  • 9、使用事件总线库:可以使用 Vue.js 的第三方库如 Event Bus、Tiny-Emmiter 等来传递数据。这些库提供了一种方便、简单的方式来在不同的组件之间进行事件传递。但是需要注意,使用第三方库可能会增加项目的复杂性和维护成本。

三、Vue 3 组件之间传值示例代码

  • 1、Props

Props 是一种在组件之间传递数据的方式,通过在组件标签上使用属性绑定,父组件可以向子组件传递数据。在子组件中,通过在 props 中定义对应的属性名,可以获取到父组件传递过来的数据。

例如,父组件中的模板:

<template>
  <child-component :message="hello"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },data() {
    return {
      hello: 'Hello from parent!'
    };
  }
};
</script>

 子组件中的模板:

<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  props: {
    message: String
  }
};
</script>

 

  • 2、$emit 

$emit  是一种在子组件中触发事件的方式,通过在子组件中使用 $emit 方法,可以向父组件发送数据。在父组件中,通过在子组件标签上使用 v-on@ 语法,可以监听子组件触发的事件,并获取子组件发送的数据。

例如,子组件中的模板:

<template>
  <button @click="sendMessage">Send Message</button>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message-sent','Hello from child!');
    }
  }
};
</script>

 父组件中的模板:

<template>
  <child-component @message-sent="receiveMessage"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },methods: {
    receiveMessage(message) {
      console.log(message);
    }
  }
};
</script>

 

  • 3、Provide/Inject

Provide/Inject 是一种在祖先组件和后代组件之间共享数据的方式。通过在祖先组件中使用 provide 方法提供数据,在后代组件中使用 inject 方法获取数据。

例如,祖先组件中的模板:

<template>
  <child-component></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },provide() {
    return {
      message: 'Hello from ancestor!'
    };
  }
};
</script>

 后代组件中的模板:

<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  inject: ['message']
};
</script>

 

  • 4、$attrs 和 $listeners

$attrs 和 $listeners 是在 Vue 2 中引入的特性,但在 Vue 3 中也得到了支持。

例如,父组件中的模板:

<template>
  <child-component message="Hello from parent!" @click="handleClick"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },methods: {
    handleClick() {
      console.log('Clicked!');
    }
  }
};
</script>

 子组件中的模板:

<template>
  <div v-bind="$attrs" v-on="$listeners">{{ message }}</div>
</template>

<script>
export default {
  props: {
    message: String
  }
};
</script>

 

  • 5、provide/inject 与 props 的结合使用

在 Vue 3 中,provide 和 inject 可以与 props 结合使用,从而实现一种高级的数据传递方式。具体做法是,在祖先组件中使用 provide 方法提供数据,并在后代组件中使用 inject 方法获取数据;同时,在后代组件中,可以在 props 中声明和接收数据,从而实现数据的类型检查和默认值设定。

例如,祖先组件中的模板:

<template>
  <child-component></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },provide() {
    return {
      message: 'Hello from ancestor!'
    };
  }
};
</script>

 后代组件中的模板:

<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  inject: ['message'],props: {
    message: {
      type: String,default: 'Hello from default!'
    }
  }
};
</script>

 

在上面的例子中,子组件会首先从祖先组件中获取名为 message 的数据,如果没有提供,则使用默认值 Hello from default!。在子组件中,props 会覆盖 provide/inject,因此如果父组件和子组件都提供了同一个属性,子组件中的 props 值会覆盖 provide/inject 中的值。

  • 6、Vuex

Vuex 是一种专门用于管理应用程序状态的库,可以用于跨组件传递数据。在 Vuex 中,可以定义一个全局的状态管理器,所有的组件都可以通过 getter 和 setter 方法访问和修改这个状态管理器中的数据。

例如,定义一个 Vuex store:

import { createStore } from 'vuex';

const store = createStore({
  state: {
    message: 'Hello from store!'
  },mutations: {
    updateMessage(state,message) {
      state.message = message;
    }
  },getters: {
    getMessage(state) {
      return state.message;
    }
  }
});

export default store;

 在组件中使用 Vuex:

<template>
  <div>{{ message }}</div>
  <button @click="updateMessage">Update message</button>
</template>

<script>
import { mapGetters,mapMutations } from 'vuex';

export default {
  computed: {
    ...mapGetters(['getMessage'])
  },methods: {
    ...mapMutations(['updateMessage'])
  }
};
</script>

 

在这个例子中,组件通过 mapGetters 方法将 Vuex store 中的 getMessage 方法映射为组件中的计算属性,从而获取 Vuex store 中的数据;同时,通过 mapMutations 方法将 Vuex store 中的 updateMessage 方法映射为组件中的方法,从而修改 Vuex store 中的数据。

  • 7、EventBus

EventBus 是一种自定义事件总线,可以用于在任意组件之间传递数据。在 EventBus 中,可以定义一个全局的事件中心,所有的组件都可以通过 $on 和 $emit 方法监听和触发自定义事件。

例如,定义一个 EventBus:

import mitt from 'mitt';

const bus = mitt();

export default bus;

 在组件中使用 EventBus:

<template>
  <div>{{ message }}</div>
  <button @click="updateMessage">Update message</button>
</template>

<script>
import bus from './event-bus';

export default {
  data() {
    return {
      message: 'Hello from component!'
    };
  },methods: {
    updateMessage() {
      this.message = 'New message!';
      bus.emit('message-updated',this.message);
    }
  },created() {
    bus.on('message-updated',message => {
      console.log(message);
    });
  }
};
</script>

 

在这个例子中,组件中的 updateMessage 方法通过 EventBus 的 emit 方法触发了一个名为 message-updated 的自定义事件,并将修改后的消息作为参数传递给事件处理函数;同时,在组件的 created 生命周期钩子中,通过 EventBus 的 on 方法监听名为 message-updated 的自定义事件,并在事件处理函数中打印接收到的消息。

总之,Vue 3 中组件之间传值的方式很多,可以根据具体的场景选择最适合的方式。使用 props 和 $emit 可以实现父子组件之间的传值,使用 provide 和 inject 可以实现祖先组件向后代组件的传值,使用 Vuex 和 EventBus 可以实现任意组件之间的传值。在选择组件传值方式时,还应该考虑数据的安全性、可维护性和性能等因素。

四、Vue 2 和 Vue 3 组件之间传值的区别

Vue 2 和 Vue 3 之间在组件之间传递值的方法有一些不同之处。下面是一些主要的区别:

  1. Props

在 Vue 2 中,父组件通过 props 把数据传递给子组件。子组件可以在 props 选项中声明它们需要的 props,然后在组件的模板中使用它们。

在 Vue 3 中,props 的使用与 Vue 2 类似,但有一些重要的变化。首先,props 的声明方式已经发生了变化,现在使用 ES6 的解构语法来声明。其次,Vue 3 强制 props 的类型检查,并提供了更多的选项来控制 props 的行为,例如默认值和必需性等。

  1. Emit

在 Vue 2 中,子组件通过 emit 向父组件发送消息。子组件可以使用 this.$emit 方法触发一个自定义事件,并可以传递任意数据作为事件的参数。父组件可以监听子组件触发的事件,并在事件处理程序中处理传递的数据。

在 Vue 3 中,emit 的使用与 Vue 2 相似,但也有一些重要的变化。首先,Vue 3 引入了新的 setup() API,该 API 取代了 Vue 2 中的 created 和 mounted 等生命周期钩子函数。其次,emit 的使用方式已经改变,现在使用 v-model 代替 this.$emit。v-model 是一个语法糖,允许在父子组件之间双向绑定数据。

  1. Provide/Inject

在 Vue 2 中,父组件可以通过 provide 方法向子组件传递数据,子组件可以使用 inject 方法获取数据。provide 和 inject 允许在组件树中的任何地方传递数据,而不需要通过 props 一级一级地传递。

在 Vue 3 中,provide 和 inject 的使用方式与 Vue 2 相同。但是,Vue 3 提供了新的 reactive 和 readonly 方法,允许在 provide 中提供响应式的数据。这意味着,如果在 provide 中提供的数据发生变化,子组件中使用这些数据的地方也会相应地更新。

Vue 3 对于组件之间传递值的基本思想与 Vue 2 相似,但是有一些语法和 API 上的改变。这些变化旨在提供更好的类型检查、更好的性能和更好的开发体验。