Vue 3 中组件之间的通信形式有很多种,上面我将列举一些罕用的通信形式,包含父传子、子传父、父间接获取子以及应用 pinia 进行状态治理。
- 父传子(Props)
父组件通过 props 将数据传递给子组件。
父组件:
vue
<template>
<ChildComponent :message="parentMessage" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {ChildComponent},
data() {
return {parentMessage: 'Hello from Parent'};
}
};
</script>
子组件:
vue
<template>
<div>{{message}}</div>
</template>
<script>
export default {props: ['message']
};
</script>
- 子传父(Events)
子组件通过触发自定义事件将数据传递给父组件。
子组件:
vue
<template>
<button @click="notifyParent">Notify Parent</button>
</template>
<script>
export default {
methods: {notifyParent() {
const childMessage = 'Hello from Child';
this.$emit('child-event', childMessage);
}
}
};
</script>
父组件:
vue
<template>
<ChildComponent @child-event="handleChildEvent" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {ChildComponent},
methods: {handleChildEvent(childMessage) {console.log(childMessage);
}
}
};
</script>
- 父间接获取子(Refs)
父组件能够应用 ref 间接拜访子组件的实例或 DOM 元素。
父组件:
vue
<template>
<ChildComponent ref="childRef" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {ChildComponent},
mounted() {console.log(this.$refs.childRef); // 拜访子组件实例
}
};
</script>
- Pinia
Pinia 是一个专为 Vue 3 设计的状态治理库,用于跨组件共享状态。
装置 Pinia:
bash
npm install pinia
应用 Pinia:
首先,在利用的入口文件(如 main.js 或 main.ts)中装置 Pinia 插件:
javascript
import {createApp} from 'vue';
import {createPinia} from 'pinia';
import App from './App.vue';
const app = createApp(App);
app.use(createPinia());
app.mount('#app');
而后,在组件中应用 Pinia:
Store:
javascript
// store.js
import {defineStore} from 'pinia';
export const useStore = defineStore('main', {state: () => ({count: 0}),
actions: {increment() {this.count++;}
}
});
组件:
vue
<template>
<div>
<p>{{count}}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script>
import {useStore} from './store';
export default {setup() {const store = useStore();
return {
count: store.count,
increment: store.increment
};
}
};
</script>
这些是在 Vue 3 中罕用的组件通信形式。依据具体的利用场景和需要,你能够抉择适宜的形式来实现组件间的通信。