Vue3 组件通信:从基础到高级

一、props

Vue3 中的组件通信最基础的方式就是通过 props 来进行父子组件之间的数据通信。在父组件中使用 v-bind 来将数据传递给子组件,子组件通过 props 来接收传递过来的数据。

// 父组件
<template>
  <child-component :message="message"></child-component>
</template>
<script>
export default {
  data() {
    return {
      message: 'Hello World'
    }
  }
}
</script>

// 子组件
<template>
  <p>{{message}}</p>
</template>
<script>
export default {
  props: {
    message: {
      type: String,
      required: true
    }
  }
}
</script>

在上面的例子中,父组件通过 v-bind 将 message 这个数据传递给了子组件,子组件通过 props 来接收了这个数据并进行渲染。在 props 中我们还可以设置传递的值的类型、是否必填等参数。

二、emit

除了从父组件到子组件的单向传递数据外,我们还需要进行反向的数据传递。可以通过自定义事件(emit)来实现子组件向父组件传递数据。

// 子组件
<template>
  <button v-on:click="handleClick">Click me</button>
</template>
<script>
export default {
  methods: {
    handleClick() {
      this.$emit('message', 'Hello World')
    }
  }
}
</script>

// 父组件
<template>
  <child-component @message="handleMessage"></child-component>
</template>
<script>
export default {
  methods: {
    handleMessage(message) {
      console.log(message)
    }
  }
}
</script>

在上面的例子中,子组件通过 $emit 来触发自定义事件 message 并将数据传递给了父组件,父组件通过 v-on 来监听该事件并获取子组件传递过来的数据。

三、provide / inject

Vue3 中新增了一个 provide / inject API 来进行祖先组件向后代组件的数据传递。

// 祖先组件
<template>
  <child-component></child-component>
</template>
<script>
export default {
  provide() {
    return {
      message: 'Hello World'
    }
  }
}
</script>

// 后代组件
<template>
  <p>{{message}}</p>
</template>
<script>
export default {
  inject: ['message']
}
</script>

在上面的例子中,祖先组件通过 provide 来提供一个名为 message 的值给其所有后代组件,在后代组件中通过 inject 来接收这个值。

四、ref / $refs

在 Vue3 中,可以在父组件中通过 ref 来获取子组件的实例对象,从而可以在父组件中调用子组件的方法或获取子组件的数据。

// 父组件
<template>
  <child-component ref="child"></child-component>
</template>
<script>
export default {
  mounted() {
    this.$refs.child.sayHello()
  }
}
</script>

// 子组件
<script>
export default {
  methods: {
    sayHello() {
      console.log('Hello World')
    }
  }
}
</script>

在上面的例子中,父组件使用 ref 来获取子组件的实例对象,从而可以在 mounted 钩子函数中调用子组件的 sayHello 方法。

五、Teleport

在 Vue3 中,Teleport 组件可以实现在任意地方渲染组件,并保持父子组件间的关系,可以用于实现一些弹窗组件等。

// 父组件
<template>
  <button v-on:click="openDialog">Open Dialog</button>
  <teleport to="body">
    <dialog :visible="isDialogVisible" @close="closeDialog"></dialog>
  </teleport>
</template>
<script>
import { ref } from 'vue'
import Dialog from './Dialog.vue'

export default {
  components: {
    Dialog
  },
  setup() {
    const isDialogVisible = ref(false)

    function openDialog() {
      isDialogVisible.value = true
    }

    function closeDialog() {
      isDialogVisible.value = false
    }

    return {
      isDialogVisible,
      openDialog,
      closeDialog
    }
  }
}
</script>

// 子组件 - Dialog
<template>
  <div v-if="visible">
    <button v-on:click="$emit('close')">Close Dialog</button>
  </div>
</template>
<script>
import { defineComponent, ref } from 'vue'

export default defineComponent({
  props: {
    visible: {
      type: Boolean,
      required: true
    }
  },
})
</script>

在上面的例子中,Teleport 组件通过 to 属性来指定要渲染的位置,在这里我们指定为 body。在父组件中点击按钮,会触发 openDialog 方法从而显示 Dialog 组件,Dialog 组件中通过 $emit 来触发 close 事件从而将 Dialog 关闭。

总结

本文介绍了 Vue3 中五种常用的组件通信方式:props、emit、provide / inject、ref / $refs 和 Teleport。在实际开发中,应根据场景选择合适的通信方式来进行组件间的数据传递,以实现更高效的应用。

原创文章,作者:QBJWB,如若转载,请注明出处:https://www.506064.com/n/361186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
QBJWBQBJWB
上一篇 2025-02-24 00:34
下一篇 2025-02-24 00:34

相关推荐

  • Python基础代码用法介绍

    本文将从多个方面对Python基础代码进行解析和详细阐述,力求让读者深刻理解Python基础代码。通过本文的学习,相信大家对Python的学习和应用会更加轻松和高效。 一、变量和数…

    编程 2025-04-29
  • 数据结构与算法基础青岛大学PPT解析

    本文将从多个方面对数据结构与算法基础青岛大学PPT进行详细的阐述,包括数据类型、集合类型、排序算法、字符串匹配和动态规划等内容。通过对这些内容的解析,读者可以更好地了解数据结构与算…

    编程 2025-04-29
  • 树莓派DIY无人机一:制作基础

    本文将介绍如何使用树莓派制作一个可飞行的小型无人机。本文将介绍树莓派的选型、比例积木的使用、无线电通信以及如何控制飞行器的基本运动。 一、树莓派的选型 在DIY无人机中,树莓派是必…

    编程 2025-04-29
  • Python零基础PDF下载

    本文将为大家介绍如何使用Python下载PDF文件,适合初学者上手实践。 一、安装必要的库 在Python中,我们需要使用urllib和requests库来获取PDF文件的链接,并…

    编程 2025-04-29
  • Polyphone音频编辑器基础入门教程

    Polyphone是一款免费的音频编辑器,可用于编辑.sf2和.sfz格式的音色库。本文将详细介绍Polyphone的基础操作及使用方法。 一、安装和简介 首先,我们需要下载并安装…

    编程 2025-04-29
  • 如何修改ant组件的动效为中心

    当我们使用Ant Design时,其默认的组件动效可能不一定符合我们的需求,这时我们需要修改Ant Design组件动效,使其更加符合我们的UI设计。本文将从多个方面详细阐述如何修…

    编程 2025-04-29
  • Ant Design组件的动效

    Ant Design是一个基于React技术栈的UI组件库,其中动效是该组件库中的一个重要特性之一。动效的使用可以让用户更清晰、更直观地了解到UI交互的状态变化,从而提高用户的满意…

    编程 2025-04-29
  • Python语言设计基础第2版PDF

    Python语言设计基础第2版PDF是一本介绍Python编程语言的经典教材。本篇文章将从多个方面对该教材进行详细的阐述和介绍。 一、基础知识 本教材中介绍了Python编程语言的…

    编程 2025-04-28
  • Python基础语言

    Python作为一种高级编程语言拥有简洁优雅的语法。在本文中,我们将从多个方面探究Python基础语言的特点以及使用技巧。 一、数据类型 Python基础数据类型包括整数、浮点数、…

    编程 2025-04-28
  • Python元祖排序:从基础知识到高级应用

    Python元祖是一种不可变序列,通常用于将一组数据绑定在一起。元祖之间经常需要排序,本文将从基础知识到高级应用,为你详细讲解Python元祖排序。 一、排序方法 Python提供…

    编程 2025-04-28

发表回复

登录后才能评论