Vue 3 第十一章:组件二(组件通信)

这篇具有很好参考价值的文章主要介绍了Vue 3 第十一章:组件二(组件通信)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 组件的通信

1.1. 父子组件之间的通信

1.1.1 父组件向子组件传值

方式一:父组件给子组件传值时,通过v-on绑定属性实现

// parent.vue
<template>
  <div>
    父子组件传值
    <children :msg="msg" :foo="foo"/>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import children from './components/children.vue';

let msg = ref('hello word');
let foo = ref(10);
</script>

<style scoped>

</style>

子组件通过defineProps来接收接收父组件传递的值。

  • 使用字符串的形式接收父组件传递的值
// children.vue
<template>
  <div class="wrapper">
    这是子组件<br/>
    父传子:{{ props.msg }} {{ props.foo }}
  </div>
</template>

<script setup lang="ts">
let props = defineProps(['msg', 'foo'])
</script>

<style scoped>

</style>
  • 使用对象的形式接收父组件传递的值
// children.vue
<template>
  <div class="wrapper">
    这是子组件<br/>
    父传子:{{ props.msg }} {{ props.foo }}
  </div>
</template>

<script setup lang="ts">
let props = defineProps({
  msg: String,
  foo: Number
})
</script>

<style scoped>

</style>
  • 使用对象的形式接收父组件传递的值(含默认值及必填参数设置)
// children.vue
<template>
  <div class="wrapper">
    这是子组件<br/>
    父传子:{{ props.msg }} {{ props.foo }}
  </div>
</template>

<script setup lang="ts">
let props = defineProps({
  msg: {
    type: String,
    default: '',
    required: true // 设置后参数必传
  },
  foo: {
    type: Number,
    default: 0
  }
})
</script>

<style scoped>

</style>
  • 结合 TypeScript 使用
// children.vue
<template>
  <div class="wrapper">
    这是子组件<br/>
    父传子:{{ props.msg }} {{ props.foo }}
  </div>
</template>

<script setup lang="ts">
let props = defineProps<{
  msg?: string;
  foo: number
}>()
</script>

<style scoped>

</style>

方式二:父组件通过插槽(slot)向子组件传递参数

  • 子组件中通过slot标签传递参数
  • 父组件中通过template插入内容,通过v-slot可以接收插槽传递的数据
<!-- Parent.vue -->
<template>
  <Child>
    <template #default="{ message }">
      {{ message }}
    </template>
  </Child>
</template>

<script>
import Child from './Child.vue'
</script>

<!-- Child.vue -->
<template>
  <div>
    <slot :message="message"></slot>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
const message = ref('Hello, world!')
</script>

需要注意的是,插槽只能用于传递静态内容,如果需要传递动态内容,则需要使用props或者provide/inject来实现。此外,插槽还可以定义多个,并且可以通过name属性来区分不同的插槽。

方式三:v-model,子组件可直接修改父组件传递过来的值

在Vue3中,可以使用v-model指令来实现子组件直接修改父组件传递过来的值。具体来说,可以在父组件中使用v-model指令将一个变量与子组件的一个prop绑定起来,然后在子组件中使用emit方法触发一个名为update:加上prop名字的事件,并传递一个新的值作为参数。例如:

<!-- VmodelParent.vue -->
<template>
  <div>
    v-model传参:父组件
    <VmodelChild v-model:isShow="isShow" />
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import VmodelChild from './components/VmodelChild.vue';

const isShow = ref(false)

</script>

<style scoped>

</style>



<!-- VmodelChild.vue -->
<template>
  <div>
    v-model传参:子组件
    <button @click="handleClick">点击修改参数</button>
    <br />
    {{ props.isShow }}
  </div>
</template>

<script setup lang="ts">
import { defineProps, defineEmits } from 'vue';

const props = defineProps({
  isShow: {
    type: Boolean,
    default: false
  }
})
const emit = defineEmits(["update:isShow"])
const handleClick = () => {
  emit("update:isShow", !props.isShow)
}

</script>

<style scoped>

</style>

1.1.2. 子组件向父组件传值

子组件向父组件传值,通过defineEmits实现

<template>
  <div class="wrapper">
    这是子组件<br/>
    <button @click="emitToParent">click</button>
  </div>
</template>

<script setup lang="ts">
let emit = defineEmits(['event-to-parent'])
let emitToParent = () => {
  emit('event-to-parent', '子组件传递给父组件的值')
}

</script>

<style scoped>

</style>

1.2. 兄弟组件之间的通信

Vue 3 中移除了 eventBus,但可以借助第三方工具来完成。Vue 官方推荐使用mitt tiny-emitter

例子:以mitt为例

1.2.1. 安装
yarn add mitt -S
1.2.2. 注册
  • eventBus.ts
// eventBus.ts
import mitt from 'mitt'

const mitter = mitt();

export default mitter
1.2.3. 使用
  • EventBus.vue
// EventBus.vue
<template>
  <div>
    Event Bus实现兄弟组件传参
    <EventBusA />
    <EventBusB />
  </div>
</template>

<script setup lang="ts">
import EventBusA from './components/EventBusA.vue';
import EventBusB from './components/EventBusB.vue';
</script>

<style scoped>

</style>
  • EventBusA.vue
// EventBusA.vue
<template>
  <div class="wrapper">
    兄弟组件A
    <button type="button" @click="handleClick">点击传参</button>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import mitter from '@/utils/eventBus'

const msg = ref('Hello, world!')

const handleClick = () => {
  mitter.emit('msg', msg.value)
}

</script>

<style scoped>

</style>
  • EventBusB.vue
// EventBusB.vue
<template>
  <div class="wrapper">
    兄弟组件B
    {{ res }}
  </div>
</template>

<script setup lang="ts">
import mitter from '@/utils/eventBus'
import { ref } from 'vue'

const res = ref()

mitter.on('msg', (data) => {
  res.value = data
})
</script>

<style scoped>

</style>

1.3. 跨级组件之间的通信

provide/inject来实现跨级组件之间的通信

1.3.1 provide/inject
  • parent.vue
// parent.vue
<template>
  <div class="wrapper">
    兄弟组件传参,这是父组件
    <brotherA />
    <brotherB />
  </div>
</template>

<script setup lang="ts">
import brotherA from './components/brotherA.vue'
import brotherB from './components/brotherB.vue'
import { provide, ref } from 'vue';

let msg = ref('给孙组件传递的值');
provide('msg', msg)

</script>

<style scoped>

</style>
  • brotherA.vue
// brotherA.vue
<template>
  <div class="wrapper">
    子组件A
    <grandson />
  </div>
</template>

<script setup lang="ts">
import grandson from "./grandson.vue";
import { ref } from 'vue';


</script>

<style scoped>

</style>
  • brotherB.vue
// brotherB.vue
<template>
  <div class="wrapper">
    子组件B
    {{ msg }}
  </div>
</template>

<script setup lang="ts">
import { inject } from 'vue'

let msg = inject('msg')
</script>

<style scoped>

</style>
  • grandson.vue
// grandson.vue
<template>
  <div class="wrapper">
    这是孙组件
    {{ msg }}
  </div>
</template>

<script setup lang="ts">
import { inject } from 'vue'

let msg = inject('msg')
</script>

<style scoped>

</style>

1.4. 非父子组件之间的通信

1.4.1. Vuex/Pinia

Vuex 和 Pinia 是 Vue 3 中的状态管理工具,使用这两个工具可以轻松实现组件通信。由于这两个工具都比较强大,后面会写文章详细讲解。

总结

组件通信是 Vue 中非常重要的一个概念,它指的是组件之间传递数据和事件的过程。在 Vue 中,组件通信主要分为父子组件之间的通信和兄弟组件之间的通信两种情况。
在父子组件之间的通信中,父组件可以通过v-bind来向子组件传递数据,而子组件则可以通过defineProps来接收父组件传递的数据。同时,子组件也可以通过emit触发自定义事件来向父组件传递数据。
在兄弟组件之间的通信中,可以通过一个共同的父组件来实现数据的传递和事件的触发,也可以通过 Vuex 等状态管理工具来实现数据的共享。
总之,在组件通信的过程中,需要合理地选择合适的方法来实现数据和事件的传递,以实现组件之间的良好协作和高效交互。文章来源地址https://www.toymoban.com/news/detail-425906.html

到了这里,关于Vue 3 第十一章:组件二(组件通信)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue组件通信——父子组件通信的四种方法

    全局引入 在main.js文件中引入并注册 之后就可以全局使用组件了 局部引入 在父组件中引入 之后就可以在父组件中使用组件了 在子组件 prop 中可以注册一些自定义组件属性,父组件调用子组件时可以向 prop 中的自定义属性传值。 子组件代码: 父组件代码 prop 也可以通过 v-

    2023年04月16日
    浏览(104)
  • VUE--组件通信(非父子)

    一、非父子通信  ---  event bus 事件总线         作用:非父子组件之间进行 简易的消息传递         步骤:                    1、创建一个都能访问到的事件总线(空vue实例)--- utils/EventBus.js                   2、 接收方(A组件),监听Bus实例的事件        

    2024年01月19日
    浏览(66)
  • Vue中父子组件通信

    聚沙成塔·每天进步一点点 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习。每篇文章都致力于提供清晰、深入的参考资料,让你能够更轻松、更自信地理解和掌握 Vue.js 的核心概念和技术。订

    2024年01月21日
    浏览(72)
  • VUE 父子组件、兄弟组件 之间通信 最强详解

    目录 1. 父组件 调用 子组件 内参数/方法 1.1 通过 ref 调用/获取 子组件内参数/方法 2. 子组件 调用 父组件 内参数/方法 2.1 通过 emit 调用 父组件方法 2.2 通过 props 调用 父组件方法/参数 2.3 通过 this.$parent 调用 父组件方法/参数 3. 兄弟组件 通信 3.1 通过 bus 进行 兄弟组件 通信

    2024年02月05日
    浏览(61)
  • vue3-父子组件间通信

    在实际业务开发的过程中,我们时常会遇到组件间的通信问题,比如:父子组件间通信、同级组件间通信等。本篇文章中主要介绍父子组件间通信。父子组件间通信主要有以下常见形式: 方案 父组件向子组件 子组件向父组件 props/emits props emits v-model/emits v-model emits ref/emits

    2024年02月05日
    浏览(67)
  • Vue3组件间的通信方式

    目录  1.props父向子组件通信 2.自定义事件 子向父组件通信 3.全局事件总线 4.v-model组件通信(父子组件数据同步) 绑定单个数据同步  绑定多个数据同步  5.useAttrs组件通信  6.ref与$parent ref获取子组件实例对象  $parent获取父组件实例对象  7.provide-inject 可以实现隔辈传输 8.

    2024年02月17日
    浏览(47)
  • VUE3+TS(父子、兄弟组件通信)

    目录 父传子值、方法(子调用父值、方法) 子传父值(父调用子值) 父读子(子传父)(父调用子值、方法) 兄弟(任意组件)通信 引入Mitt来完成任意组件通信 1、统一规范写法,通过在子组件标签上绑定属性和值,来传递到子组件,子组件再通过defineProps来接收,先给其

    2023年04月08日
    浏览(48)
  • vue3 常用的组件互相通信(父子、兄弟、爷孙、任意组件)

    目录 前言:目前组件通信方法有好多种,我这挑选一部分来讲 1、父传子 2、子传父 3、兄弟之间通信 3.1、父组件充当中间件 3.2、全局事件总线—EventBus 4、爷孙之间通信 5、任意组件、全局 方案 父传子 子传父 props / emits props emits v-model / emits v-model emits ref / emits ref emits provi

    2024年02月15日
    浏览(45)
  • Vue3父子组件间传参通信

    本文主要是记录Vue3在setup语法糖下的父子组件间传参的四种方式 Vue3+TypeScript 父组件传值给子组件主要是由父组件为子组件通过v-bind绑定数值,而后传给子组件;子组件则通过defineProps接收使用。 如下为父组件 Father.vue 如下为子组件Son.vue 父组件 Father.vue 中在调用 Son.vue 这个子

    2024年01月19日
    浏览(77)
  • Web前端 ---- 【Vue】(组件)父子组件之间的通信一文带你了解

    目录 前言 父组件传子组件 ---- props 给要传递数据的子组件绑定要传过去的属性及属性值 在子组件中使用props配置项接收 props配置项 子组件传父组件 ---- 组件的自定义事件 子组件向父组件传递数据 通过代码来绑定自定义事件 本文将介绍在Vue中父子组件如何进行通信 这里先介

    2024年02月05日
    浏览(117)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包