首页 > 其他分享 >Vue3组件之间的通信

Vue3组件之间的通信

时间:2024-07-10 14:58:18浏览次数:17  
标签:vue const orderInfo 通信 orderForm Vue3 组件 import

        在 Vue 3 中,组件通信是构建应用程序时必须处理的核心问题之一。有效的组件通信可以帮助我们组织和管理应用程序的状态和行为,使得代码更加清晰和可维护。

        Vue 3 提供了多种方式来实现组件之间的通信,每种方式都有其适用的场景。在本文中,博主将详细介绍 Vue 3 中常用的几种组件通信方式及其使用方法。

1.Props

        按照官方的话来说,我们需要先在组件上 显式的声明Props 这样 Vue 才知道我们传递的哪些是 Props ,哪些是 透传 ( Attribute )

        所谓 透传(Attribute),其实就是指传递给组件,又没有被声明成 Props$emit 的属性 或 v-on 的事件监听器。详细信息请参考 Vue.js官方文档

        在子组件 (ChildComponent.vue) 中,我们可以通过Props声明属性:

<!-- 子组件 ChildComponent.vue -->

<template>
    <div>
        <p>{{ props.orderInfo }}</p>
    </div>
</template>

<script setup>
const props = defineProps({
    orderInfo: {
        type: object,
        default: () => {}
    }
})
</script>

        在父组件中,我们可以通过为子组件 (ChildComponent.vue) 绑定属性 的方式,将参数传递给子组件 (ChildComponent.vue) Props 

<!-- 父组件 FatherComponent.vue -->

<tamplate>
    <!-- 对于传递 props 来说,使用 camelCase 并没有太多优势,因此官方更推荐 pascal-case 的形式 -->
    <ChildComponent :order-info="state.orderForm"><ChildComponent>
</tamplate>

<script setup>
import { reactive } from 'vue'

const state = reactive({
    orderForm: {
        orderId: '123456',
        orderName: 'Test',
        sumPrice: 50
    }
})

</script>

最后,父组件 传递给 子组件 的 orderForm 就可以通过 插值表达式 在子组件中显示出来

2.事件 ( $emit )

        在 子组件 (ChildComponent.vue) 中,我们可以通过 $emit 方法触发一个自定义事件,并向父组件传递需要的参数。

<!-- 子组件 ChildComponent.vue -->

<tamplate>
    <button @click="handleClick"></button>
</tamplate>

<script setup>
import { ref } from 'vue'

const status = ref('Success')

const emit = defineEmits(['refresh']);

const handleClick = () => {
    emit('refresh')
}
</script>

        父组件可以通过在子组件上使用 v-on 或者简写形式 @ 来监听 子组件 发出的事件,并在事件处理函数中接收传递的参数。

<!-- 父组件 FatherComponent.vue -->

<tamplate>
    <ChildComponent @refresh="callback"></ChildComponent>
<tamplate>

<script setup>
const callback = (value) => {
    console.log(value)
}
</script>

以上两种组件通信方式为单向数据流,非常适合简单的数据传递需求

3.Pinia

        Pinia Vue 的专属状态管理库,它允许你跨组件或页面共享状态(数据) 。

        这里先假设已经在项目中已经引入了 Pinia,如果不知道怎么安装Pinia,请参考 Vue项目安装Pinia

/* 
 * orderStore.js
 * 首先,我们定义一个store。  ==> 这里博主采用组合式API写法
 */
import { defineStore } from 'pinia'
import { ref } from 'vue'

// 这里,第一个参数是你的应用中 Store 的唯一 ID。==> 我的是 orderInfo
export const useOrderStore = defineStore('orderInfo', () => {
    
    // 可以在任意组件中访问 orderInfo 变量
    const orderInfo = ref()

    const setOrderInfo = (data) => {
        orderInfo.value = data
    }
    
    const getOrderInfo = () => {
        return orderInfo.value
    }

    return { orderInfo, setOrderInfo, getOrderInfo }
})

        然后,在 A 组件 中引入 orderStore.js ,并通过函数调用的方式使用Pinia

<!-- A 组件中 OnceComponent.vue -->

<tamplate>
    <button @click="handleClick"> Click </button>
</tamplate>

<script setup>
import { reactive } from 'vue'
import { useOrderStore } from '/@/stores/orderInfo'

const state = reactive({
    orderForm: {
        orderId: '123456',
        orderName: 'Test',
        sumPrice: 50
    }
})

// 通过点击事件将数据(状态)存储到 pinia 中
const handleClick = () => {
    useOrderStore().setOrderInfo(state.orderForm);
}
</script>

        最后,在 B 组件 中,通过同样的方式从 Pinia 中获取到 A 组件 存储的数据:

<!-- B 组件中 TwoComponent.vue -->

<tamplate>
    <p>{{ state.orderForm }}</p>
</tamplate>

<script setup>
import { reactive } from 'vue'
import { useOrderStore } from '/@/stores/orderInfo'

const state = reactive({
    // 直接将 pinia 中的 orderInfo 赋值给 orderForm
    orderForm: useOrderStore().getOrderInfo()
})

</script>

标签:vue,const,orderInfo,通信,orderForm,Vue3,组件,import
From: https://blog.csdn.net/qq_56046190/article/details/140320910

相关文章

  • vue3中关于指定props的复杂ts类型
    如果要对props的数据进行指定类型,基本类型可以直接使用类型约束,复杂类型可以使用PropType进行约束interfaceItemInterface{title:stringcode:stringstatus:numbericon:string}constprops=defineProps({type:String,userId:String,currentItem......
  • Nuxt框架中内置组件详解及使用指南(五)
    title:Nuxt框架中内置组件详解及使用指南(五)date:2024/7/10updated:2024/7/10author:cmdragonexcerpt:摘要:本文详细介绍了Nuxt框架中和组件的使用方法与配置,包括安装、基本用法、属性详解、示例代码以及高级功能如事件处理、自定义图片属性和图片格式回退策略。同时,还......
  • 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-碰撞框和受伤区域(六)
    文章目录开发思路受击区域设置碰撞层使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击(一)使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件(二)使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-飞船动画(三)使用Godot4组件制作竖版太空射击游戏_2D卷......
  • uniapp+vue3封装下拉框(支持单选、多选)
    子组件代码<template><viewclass="uni-select-dc"><viewref="select"class="uni-select-dc-select":class="{active:active}"@click.stop="handleSelect">......
  • flutter组件学习
    List.generate-生成一个列表import'package:flutter/material.dart';voidmain(){//根据索引生成一个列表List<Widget>bts=List.generate(10,(index)=>ElevatedButton(onPressed:(){},child:Text("第$index个按钮")));Columncolumn=Column(chi......
  • Unity入门之重要组件和API(4) : Input
    前言Input类主要处理用户输入设备相关操作;输入设备包括鼠标、键盘、触屏、手柄、陀螺仪(重力感应)。1.鼠标1.1鼠标在屏幕的位置print(Input.mousePosition);1.2检测鼠标输入0-左键1-右键2-中键if(Input.GetMouseButtonDown(0)){ print("鼠标按下");}if(Input......
  • uniapp 二次封装ui组件加class样式或修改样式在微信小程序不生效的情况
    原因:首先不论是自定义组件还是ui组件,本质上的原因都是微信小程序默认的组件隔离策略导致的。微信小程序组件隔离文档参考组件样式隔离默认情况下,自定义组件的样式只受到自定义组件wxss的影响。除非以下两种情况:指定特殊的样式隔离选项 styleIsolation 。webvie......
  • 网络通信协议模型
    1、OSI模型OSI模型(OpenSystemsInterconnectionmodel)是一个网络通信协议参考模型,将网络通信协议划分为七个不同的层次。每个层次都负责特定的功能,从物理层到应用层,提供了一种标准化的方式来实现网络通信。以下是OSI模型的七层:1.物理层(PhysicalLayer)物理层是最底层,负责传......
  • 最近很火的Vue Vine是如何实现一个文件中写多个组件
    前言在今年的VueConf2024大会上,沈青川大佬(维护Vue/Vite中文文档)在会上介绍了他的新项目VueVine。VueVine提供了全新Vue组件书写方式,主要的卖点是可以在一个文件里面写多个vue组件。相信你最近应该看到了不少介绍VueVine的文章,这篇文章我们另辟蹊径来讲讲VueVine是如何实现......
  • PopupMenuButton组件的用法
    文章目录1.概念介绍2.使用方法3.示例代码我们在上一章回中介绍了Sliver综合示例相关的内容,本章回中将介绍PopupMenuButton组件.闲话休提,让我们一起TalkFlutter吧。1.概念介绍我们在本章回中介绍的PopupMenuButton组件位于AppBar右侧,通常显示三个圆点图标,点......