vue2跨级组件传值

//祖先组件
import Son from './Son'
export default {
  components: {
    Son
  },
  provide () {
    return {
      money: 1000000000
    }
  }
}

子孙组件 <template>   <div>     孙子组件     <p>这个是爷爷传给我的钱:{{ money }}</p>   </div> </template>
<script> export default {   inject: ['money'] } </script>

 

vue2跨级组件传值

Vue 2 中,爷孙组件(即祖父组件和孙子组件)之间的可以通过以下几种方式实现: ### 1. **使用 `props` 和 `$emit` 逐层递** 这是最直接的方式,但需要中间组件(父组件)进行中转。 **祖父组件**: ```vue <template> <parent-component :value="grandfatherValue" @update="handleUpdate" /> </template> <script> export default { data() { return { grandfatherValue: '初始' } }, methods: { handleUpdate(newValue) { this.grandfatherValue = newValue; } } } </script> ``` **父组件**: ```vue <template> <child-component :value="value" @update="$emit('update', $event)" /> </template> <script> export default { props: ['value'] } </script> ``` **孙子组件**: ```vue <template> <div> <p>{{ value }}</p> <button @click="$emit('update', '新')">更新</button> </div> </template> <script> export default { props: ['value'] } </script> ``` ### 2. **使用 `provide` 和 `inject`** Vue 2.2.0+ 提供了 `provide` 和 `inject` 选项,允许祖先组件向所有子孙组件注入依赖,无需逐层递。 **祖父组件**: ```vue <template> <parent-component /> </template> <script> export default { provide() { return { sharedValue: this.grandfatherValue, updateValue: this.updateValue } }, data() { return { grandfatherValue: '初始' } }, methods: { updateValue(newValue) { this.grandfatherValue = newValue; } } } </script> ``` **孙子组件**: ```vue <template> <div> <p>{{ sharedValue }}</p> <button @click="updateValue('新')">更新</button> </div> </template> <script> export default { inject: ['sharedValue', 'updateValue'] } </script> ``` ### 3. **使用事件总线(Event Bus)** 通过创建一个中央事件总线,组件之间可以通过它来通信。 **创建事件总线**(通常在单独的文件中): ```javascript // event-bus.js import Vue from 'vue'; export const EventBus = new Vue(); ``` **祖父组件**: ```vue <template> <parent-component /> </template> <script> import { EventBus } from './event-bus.js'; export default { created() { EventBus.$on('updateValue', (newValue) => { console.log('收到孙子组件:', newValue); }); } } </script> ``` **孙子组件**: ```vue <template> <button @click="sendValue">发送到祖父组件</button> </template> <script> import { EventBus } from './event-bus.js'; export default { methods: { sendValue() { EventBus.$emit('updateValue', '新'); } } } </script> ``` ### 4. **使用 Vuex** 如果项目较大,可以使用 Vuex 进行状态管理。 **store.js**: ```javascript import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state: { sharedValue: '初始' }, mutations: { updateValue(state, newValue) { state.sharedValue = newValue; } } }); ``` **祖父组件**: ```vue <template> <parent-component /> </template> <script> export default { computed: { sharedValue() { return this.$store.state.sharedValue; } } } </script> ``` **孙子组件**: ```vue <template> <div> <p>{{ sharedValue }}</p> <button @click="updateValue('新')">更新</button> </div> </template> <script> export default { computed: { sharedValue() { return this.$store.state.sharedValue; } }, methods: { updateValue(newValue) { this.$store.commit('updateValue', newValue); } } } </script> ``` ### 总结 - **逐层递**:适合简单场景,但代码冗余。 - **`provide` 和 `inject`**:适合深层嵌套组件,但耦合性较高。 - **事件总线**:适合小型项目,但可能难以维护。 - **Vuex**:适合大型项目,但引入了额外复杂度。 根据项目需求选择合适的方式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值