vue3 跨组件传参

该文章演示了在Vue中如何使用provide和inject进行父子组件间的状态传递,以及结合ref实现函数调用。在父组件中,定义了一个可变数值num和一个增加数值的方法,并通过provide传递给子组件。在孙子组件中,使用inject接收并修改数值,同时调用注入的函数来更新状态。
//父
<template>
    <div style="width: 400px;height: 400px; background: aquamarine;">
        <p>高级</p>
        <son></son>
    </div>
</template>
<script setup>
import { provide, ref } from 'vue';
import son from './son.vue'

let num = ref(0)

const fun = (val) => {
    num.value += val
}
provide('num', num)//变量
provide('chage', fun)//方法
</script> 
//中级son.vue
<template>
    <div style="width: 300px;height: 300px; background: pink;">
        中级
        <grandson></grandson>
    </div>
</template>

<script setup>
import grandson from './grandson.vue'
</script>
//最低级grandson.vue
<template>
    <div style="width: 200px;height: 200px; background: bisque;">
        低级<br />
        总赞数{{ num }}
        <button @click="zan">赞+10</button>
    </div>
</template>
<script setup>
import { inject } from 'vue';
let num = inject('num')
const fun = inject('chage')
const zan = () => {
    fun(10)
}
</script>

### Vue 2 中的跨组件通信 在 Vue 2 中,跨组件通信是指不具有直接父子关系的两个组件之间的数据共享。这种情况下可以采用事件总线、Vuex 或者 `$emit` 配合 `ref` 的方式来实现。 #### 使用事件总线 (Event Bus) 事件总线是一种简单的发布/订阅模式,适用于小型项目或者少量组件间的通信。以下是具体实现: ```javascript // 创建一个全局事件总线 const bus = new Vue(); // 组件 A 发送消息 bus.$emit(&#39;message&#39;, data); // 组件 B 接收消息 bus.$on(&#39;message&#39;, function(data) { console.log(data); }); ``` 这种方式简单易用,但在大型应用中可能会导致维护困难[^1]。 #### Vuex 状态管理 对于更复杂的场景,推荐使用 Vuex 进行状态管理。Vuex 是专门为 Vue 应用程序开发的状态管理模式。它允许我们在多个组件间共享和操作同一个状态。 ##### 安装并初始化 Vuex 首先安装 Vuex 并创建 store 文件夹下的 index.js 文件: ```javascript import Vue from &#39;vue&#39;; import Vuex from &#39;vuex&#39;; Vue.use(Vuex); export default new Vuex.Store({ state: { count: 0, }, mutations: { increment(state) { state.count++; } }, actions: { increment({ commit }) { commit(&#39;increment&#39;); } } }); ``` ##### 在组件中使用 Vuex 任何地方都可以通过 `this.$store.state` 访问到共享的数据,并通过提交 mutation 来改变它们: ```javascript methods: { add() { this.$store.commit(&#39;increment&#39;); // 修改状态 } }, computed: { countValue() { return this.$store.state.count; // 获取状态 } } ``` 这种方法非常适合于需要频繁更新或读取公共状态的应用场景[^3]。 #### 利用 Provide / Inject API 虽然提供注入主要用于祖辈与后代的关系传递参数,但它也可以间接用于某些特定情况下的跨级通讯需求。 ```javascript // 父组件定义 provide 函数返回对象属性 provide () { return { sharedData: reactive({ message: &#39;&#39; }) }; } // 子孙组件 inject 对应 key 值即可获取该变量 inject: [&#39;sharedData&#39;], watch: { &#39;sharedData.message&#39;(newVal){ alert(newVal); } }; ``` 此方法适合树形结构较深时减少 prop 层层穿透带来的麻烦。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呱嗨喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值