您好,登錄后才能下訂單哦!
vue3組件通信的幾種方式分別是這樣的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
vue3組件通信方式為以下幾種
props
$emit
$expose / ref
$attrs
v-model
provide / inject
Vuex
mitt
<child :msg2="msg2" /> <script setup> const props = defineProps({ // 寫法一 msg2:String // 寫法二 msg2:{ type:String, default:'' } }) console.log(props) // {msg2:'這是傳級子組件的信息2'} </script>
//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>
父組件獲取子組件的屬性或者調用子組件方法
<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>
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>
可以支持多個數據雙向綁定
<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:在任何后代組件中接受想要添加在這個組件上的數據,不管組件嵌套多深都可以直接拿來用
// 父組件 <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>
//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>
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組件通信的幾種方式分別是這樣的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。