vue3组件常用的通信方式(父传子、子传父、父直接获取子、pinia)

本文介绍了Vue3中组件间的四种常见通信方式:父组件通过Props向子组件传递数据,子组件通过自定义事件通知父组件,父组件直接访问子组件以及使用Pinia进行状态管理。开发者应根据项目需求选择合适的方法。

1.父传子

      父组件通过属性(Props)向子组件传递数据。

      <!-- 父组件 -->

<template>
    <ChildComponent :some-prop="parentData" />
</template>
<script>
    import ChildComponent from './ChildComponent.vue';
    export default {
        components: {
            ChildComponent
        },
        data() {
            return {
                parentData: '这是父组件的数据'
            };
        }
    }

</script>

<!-- 子组件 -->
<template>
    <div>{{ someProp }}</div>
</template>
<script>
    export default {
        props: ['someProp']
    }
</script>

2.子传父

      子组件通过自定义事件向父组件传递数据。

<!-- 子组件 -->
<template>
    <button @click="sendMessageToParent">子组件发送消息</button>
</template>
<script>
    export default {
        methods: {
            sendMessageToParent() {
                this.$emit('message', '这是来自子组件的消息');
            }
        }
    }
</script>

<!-- 父组件 -->
<template>
    <ChildComponent @message="receiveMessage" />
</template>
<script>
    import ChildComponent from './ChildComponent.vue';
    export default {
        methods: {
            receiveMessage(message) {
                console.log(message); // '这是来自子组件的消息'
            }
        }
    }
</script>

3.父直接获取子

      父组件可以通过$children或$refs来直接访问子组件的方法或数据。

<!-- 父组件 -->
<template>
    <ChildComponent ref="childComp" />
    <button @click="callChildMethod">调用子组件方法</button>
</template>
<script>
    import ChildComponent from './ChildComponent.vue';
    export default {
        components: {
            ChildComponent
        },
        methods: {
            callChildMethod() {
                this.$refs.childComp.someMethod();
            }
        }
    }
</script>

4.使用Pinia进行状态管理

      Pinia是Vue 3官方推荐的状态管理库,它是对Vuex的重新思考和简化。

<!-- 父组件 -->
<template>
    <div>{{ count }}</div>
    <button @click="increment">增加</button>
</template>
<script>
    import { useStore } from 'pinia';
    import { defineComponent } from 'vue';
    export default defineComponent({
        setup() {
            const store = useStore();
            const count = store.count;
            const increment = () => {
                store.increment();
            };
            return { count, increment };
        }
    });
</script>

<!-- 子组件 -->
<template>
    <button @click="decrement">减少</button>
</template>
<script>
    import { useStore } from 'pinia';
    import { defineComponent } from 'vue';
    export default defineComponent({
        setup() {
            const store = useStore();
            const decrement = () => {
                store.decrement();
            };
            return { decrement };
        }
    });
</script>

以上就是在Vue 3中进行组件间通信的一些常见方法。在实际应用中,应根据具体需求选择最适合的通信方式。
 

### 父组件子组件通信方式Vue 中,父组件子组件传递数据或调用方法的常见方式主要有以下几种: #### 1. 通过 `props` 传递数据 父组件可以通过 `props` 向子组件传递静态或动态的数据。这种方式Vue 组件通信中最基础且最常用的方法。 ```vue <!-- 父组件 --> <template> <ChildComponent :message="parentMessage" /> </template> <script setup> import { ref } from &#39;vue&#39;; import ChildComponent from &#39;./ChildComponent.vue&#39;; const parentMessage = ref(&#39;来自父组件的消息&#39;); </script> ``` ```vue <!-- 子组件 --> <template> <div>{{ message }}</div> </template> <script setup> defineProps({ message: { type: String, required: true } }); </script> ``` 父组件将数据绑定到子组件的 `props` 上,从而实现单向数据流[^1]。 #### 2. 通过 `$refs` 调用子组件的方法 父组件可以使用 `$refs` 获取子组件的实例,并直接调用其方法或访问其属性。 ```vue <!-- 父组件 --> <template> <button @click="callChildMethod">调用子组件方法</button> <ChildComponent ref="childRef" /> </template> <script setup> import { ref } from &#39;vue&#39;; import ChildComponent from &#39;./ChildComponent.vue&#39;; const childRef = ref(); function callChildMethod() { childRef.value.childMethod(); // 调用子组件定义的方法 } </script> ``` ```vue <!-- 子组件 --> <template> <div>子组件内容</div> </template> <script setup> function childMethod() { console.log(&#39;子组件方法被调用&#39;); } </script> ``` 通过 `ref` 可以获取子组件的引用并操作其实例方法[^2]。 #### 3. 使用 `provide/inject` 实现跨层级通信 当需要在嵌套较深的组件之间进行通信时,可以使用 `provide` 和 `inject` 来实现跨层级的数据传递。父组件通过 `provide` 提供数据,后代组件通过 `inject` 接收这些数据。 ```vue <!-- 父组件 --> <template> <div> <ChildComponent /> </div> </template> <script setup> import { provide, ref } from &#39;vue&#39;; import ChildComponent from &#39;./ChildComponent.vue&#39;; const sharedData = ref(&#39;共享数据&#39;); provide(&#39;sharedData&#39;, sharedData); </script> ``` ```vue <!-- 子组件(或更深层的组件) --> <template> <div>接收到的共享数据:{{ sharedData }}</div> </template> <script setup> import { inject } from &#39;vue&#39;; const sharedData = inject(&#39;sharedData&#39;); </script> ``` 此方式适用于多个层级嵌套的组件之间的数据共享[^3]。 #### 4. 通过事件总线或全局状态管理工具 虽然这不是子组件通信的标准方式,但在某些复杂场景下,父组件可以通过事件总线(如 `mitt` 或 `EventBus`)或全局状态管理工具(如 Vuex、Pinia)间接影响子组件的状态。 --- ### 总结 - **`props`** 是最常用的数据传递方式,适用于从父组件子组件传递数据。 - **`$refs`** 适用于需要直接调用子组件方法的场景。 - **`provide/inject`** 用于跨层级组件通信。 - **事件总线/状态管理** 则用于更复杂的全局状态共享需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值