专栏名称: 奇舞精选
《奇舞精选》是由奇舞团维护的前端技术公众号。除周五外,每天向大家推荐一篇前端相关技术文章,每周五向大家推送汇总周刊内容。
目录
相关文章推荐
前端早读课  ·  【第3453期】圈复杂度在转转前端质量体系中的应用 ·  7 小时前  
前端早读课  ·  【第3452期】React 开发中使用开闭原则 ·  昨天  
前端早读课  ·  【第3451期】前端 TypeError ... ·  2 天前  
江苏司法行政在线  ·  宿迁司法行政人、江苏监狱戒毒民警,给您拜年啦! ·  4 天前  
江苏司法行政在线  ·  宿迁司法行政人、江苏监狱戒毒民警,给您拜年啦! ·  4 天前  
51好读  ›  专栏  ›  奇舞精选

Vue 3 组件传值:父子通信与全局状态管理

奇舞精选  · 公众号  · 前端  · 2024-10-21 18:00

主要观点总结

本文介绍了Vue 3中组件间的传值方式,包括父子组件传值、跨级组件传值、全局状态管理以及v-model双向绑定。文章详细阐述了props、emit、provide/inject以及状态管理工具如Pinia的使用方法,并总结了各种方式的适用场景。

关键观点总结

关键观点1: 父子组件传值方式介绍,包括props和emit的使用方法和适用场景。

父子组件传值是Vue应用中最常见的场景。父组件通过props向子组件传递数据,子组件通过emit向父组件发送事件或传递更新。

关键观点2: 跨级组件传值方法探讨,重点介绍provide和inject的使用。

在组件层级较多的应用中,provide和inject允许在祖先组件和子孙组件之间共享数据,避免了中间组件需要显式地传递props。

关键观点3: 全局状态管理工具Pinia的介绍和使用方法。

对于更大规模的应用,Pinia作为Vue 3推荐的状态管理工具,能够更高效地组织和维护状态。文章介绍了如何创建和使用Pinia store。

关键观点4: v-model双向绑定的增强特性在Vue 3中的应用。

Vue 3中v-model的增强特性允许为组件创建多个v-model绑定属性,使数据流更加灵活和方便。

关键观点5: 总结Vue 3的传值方式及其适用场景。

文章最后总结了Vue 3提供的多种传值方式,包括props、emit、provide/inject、Pinia以及v-model,并指出了这些方式适用的不同场景。


正文

本文作者系360奇舞团前端开发工程师

在 Vue 3 中,组件之间的传值是核心操作之一,能够有效组织和共享数据。随着 Vue 3 的引入,除了传统的 Options API,Composition API 也得到了更多应用场景,带来了更多灵活性。本文将深入探讨 Vue 3 中的常见传值方式,详细介绍如何通过 props emit provide/inject 、以及状态管理工具等实现父子组件、跨级组件甚至全局状态的传递和共享。

1. 父子组件传值

父子组件的传值是 Vue 应用中最常见的场景。父组件通常向子组件传递数据,子组件则可能向父组件反馈事件或传递更新。

1.1 父组件向子组件传值(Props)

在 Vue 中, props 是父组件向子组件传递数据的主要手段。父组件通过模板中绑定的属性向子组件传值,而子组件需要通过声明 props 来接收这些值。

父组件代码




在这个例子中,父组件将 parentMessage 和数值 5 作为 props 传递给子组件。

子组件代码




defineProps 是 Composition API 中的一个新函数,用于声明组件需要接收的 props 。这使得子组件可以直接使用父组件传入的数据。

1.2 子组件向父组件传值(emit)

子组件可以通过 emit 方法向父组件发送事件,通常用于通知父组件某些用户交互的结果。 emit 还可以附带数据,以便父组件根据接收到的事件执行相应操作。

子组件代码




子组件通过 defineEmits 声明它可能发出的事件,然后在点击按钮时使用 emit 函数向父组件发送 sendMessage 事件,并附带一条消息。

父组件代码




父组件监听子组件的 sendMessage 事件,通过 handleMessage 方法接收子组件传递过来的数据。

2. 跨级组件传值(provide/inject)

有时,我们需要在组件树中跨越多个层级进行数据传递,而不希望通过 props 一层一层传递。这时, provide inject 就显得非常有用。

2.1 provide inject 的基本使用

在 Vue 3 中, provide inject 是 Composition API 的一部分,允许在祖先组件和子孙组件之间共享数据,避免了中间组件需要显式地传递 props

父组件(祖先组件)代码




在祖先组件中使用 provide 提供数据,这里的键是 sharedData ,值是字符串 "Shared data from Parent"

深层子组件代码




深层子组件使用 inject 获取祖先组件提供的 sharedData ,不需要父子直接传值的路径。这在组件层级较多的应用中非常有用。

3. 全局状态管理

对于更大规模的应用,全局状态管理工具能帮助我们更好地组织和维护状态。Vue 3 推荐使用 Pinia 来替代 Vuex,它更加轻量且符合 Vue 3 的 Composition API 思想。

3.1 使用 Pinia 管理状态

安装 Pinia

npm install pinia

创建一个 store

// stores/counter.js
import { defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
state: () => ({
count: 0
}),
actions: {
increment() {
this.count++;
}
}
});

这是一个简单的 counter store,使用 state 来定义状态,用 actions 来定义业务逻辑。

在组件中使用 Pinia




通过 Pinia,状态管理变得非常简洁,且状态和逻辑可以方便地在多个组件中共享。

4. v-model 实现双向绑定

在 Vue 3 中, v-model 得到了增强,允许为组件创建多个 v-model 绑定属性,使得数据流更加灵活和方便。

父组件代码




在父组件中,通过 v-model:text v-model:number 可以分别绑定两个不同的值。

子组件代码




子组件通过 emit update 事件实现与父组件的数据同步,形成双向绑定的效果。

5. 总结

Vue 3 提供了多种灵活的传值方式,涵盖了从简单的父子组件通信到复杂的全局状态管理。常见的方式有:

  • props emit :适用于父子组件通信。

  • provide inject :适用于跨级组件传值。

  • Pinia :适合全局状态管理,尤其是大型应用。

  • v-model :增强的双向绑定适用于复杂表单或组件的同步。

通过合理选择这些传值方式,可以有效地组织 Vue 3 应用中的数据流,提升代码的可维护性和扩展性。

-







请到「今天看啥」查看全文