vue3組件通信的方式總結及實例用法
vue3組件通信方式為以下幾種
- props
- $emit
- $expose / ref
- $attrs
- v-model
- provide / inject
- Vuex
- mitt
props
<child :msg2="msg2" /> <script setup> const props = defineProps({ // 寫法一 msg2:String // 寫法二 msg2:{ type:String, default:'' } }) console.log(props) // {msg2:'這是傳級子組件的信息2'} </script>
$emit
//Child.vue <template> // 寫法一 <div @click="emit('myclick')">按鈕</div> // 寫法二 <div @click="handleClick">按鈕</div> </template> <script setup> // 方法一 const emit = defineEmits(['myClick'],['myClick2']) // 方法二 const handleClick = () => { emit('myClick','這是發送給父組件的信息'); } // 方法二 不適用於vue3.2,使用的useContext()已經舍棄 import { useContext } from 'vue' const { emit } = useContext() const handleClick = () => { emit('myClick','這是發送給父組件的信息' } </script> // Parent.vue響應 <template> <child @myClick="onMyClick"></child> </template> <script setup> import child from "./child.vue" import onMychilk = (msg) => { console.log(msg) // 父組件收到的信息 } </script>
expose / ref
父組件獲取子組件的屬性或者調用子組件方法
<script setup> // 方法一:useContext() vue3.2 之後已經舍棄 import { useContext } from 'vue' const ctx = useContext() // 對外暴露屬性方法等都可以 ctx.expose({ childName: '這是子組建的屬性', someMethod(){ console.log('這是子組件的方法') } }) </script> // Parent.vue 註意 ref="comp" <template> <child ref="comp"></child> <button @click="handleClick">按鈕</button> </template> <script> import child from './child.vue' import { ref } from 'vue' const comp = ref(null) const handleClick = () => { console.log(comp.value.childName) comp.value.someMethod() // 調用子組件對外暴露的方法 } </script>
attts
attrs:包含父作用域除class和style除外的非props屬性集合
// 父組件 <child :msg1="msg1" :msg2="msg2" title="3333"></child> <script setup> import child from './child.vue' import { ref,reactive } from 'vue const msg1 = ref('111') const msg2 = ref('222') </script> // 子組件 <script setup> import { defineProps,useContext,useAttars } from 'vue' const props = defineProps({ msg1: String }) // 方法1 const ctx = useContext() console.log(ctx.attars) // {msg2:'222',title:'333'} // 方法2 const attrs = useAttars() console.log(attars) // {msg2:'2222',title:'3333'} </script>
v-model
可以支持多個數據雙向綁定
<child v-model:key="key" v-modle:value="value" /> <script> import child from './child.vue' import { ref,reactive } from 'vue' const key = ref('111') const value = ref('222') </script> //子組件 <template> <button @click="handleClick"></button> </template> <script setup> // 方法一 v3.2 已被移除 import { useContext } from 'vue' const { emit } = useContext() // 方法二 import { defineEmits } from 'vue' const emit = defineEmits(['key','value']) //用法 const handleClick = () => { emit('update:key','新的key') emit('update:value','新的value') } </script>
provide / inject
provide/inject為依賴註入 provide:可以讓我們指定想要提供給後代組件的數據 inject:在任何後代組件中接受想要添加在這個組件上的數據,不管組件嵌套多深都可以直接拿來用
// 父組件 <script setup> import { provide } from 'vue' const name = provide('name') console.log('name','沐華') </script> //子組件 <script setup> import { inject } from 'vue' const name = inject('name') console.log(name) //木華 </script>
Vuex
//store/index.js import { createStore } from 'vuex' export default createStore({ state:{count:1}, getters:{ getCount:state=>state.count }, mutations:{ add(state){ state.count++ } } }) // main.js import { createApp } from 'vue' import APP from './App.vue' import store from './store' createApp(APP).use(store).mount("#app") // 直接使用 <template> <div> {{ $store.state.count }} </div> <button @click="$store.commit('add')"> </button> </template> // 獲取 <script setup> import { useStore,computed } from 'vuex' const store = useStore() console.log(store.state.count) const count = computed (()=>store.state.count) console.log(count) </script>
mitt
Vue3中已經沒有瞭EventBus跨組件通信,替代方案mitt.js,但原理方式EventBus是一樣的
安裝方式 npm i mitt -S
封裝
mitt.js import mitt from 'mitt' const mitt = mitt() export default mitt
組件之間使用
// 組件A <script setup> import mitt from './mitt' const handleClick = () => { mitt.emit('handleChange') } </script> // 組件B <script setup> import mitt from './mitt' import { onUnmounted } from 'vue' const someMethod = () => {...} mitt.on('handleChange',someMethod) onUnmounted(()=>{ mitt.off('handleChange',someMethod) }) </script>
到此這篇關於vue3組件通信的方式總結及實例用法的文章就介紹到這瞭,更多相關vue3組件通信的幾種方式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Vue3的7種種組件通信詳情
- Vue3常用的通訊方式總結與實例代碼
- Vue3中10多種組件通訊方法小結
- vue3中 provide 和 inject 用法及原理
- Vue 中 provide和inject的使用