您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Vue3的7種種組件通信是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
props
$emit
expose / ref
$attrs
v-model
provide / inject
Vuex
用 props
傳數據給子組件有兩種方法,如下
方法一:混合寫法
// Parent.vue 傳送 <child :msg1="msg1" :msg2="msg2"></child> <script> import child from "./child.vue" import { ref, reactive } from "vue" export default { data(){ return { msg1:"這是傳級子組件的信息1" } }, setup(){ // 創建一個響應式數據 // 寫法一 適用于基礎類型 ref 還有其他用處,下面章節有介紹 const msg2 = ref("這是傳級子組件的信息2") // 寫法二 適用于復雜類型,如數組、對象 const msg2 = reactive(["這是傳級子組件的信息2"]) return { msg2 } } } </script> // Child.vue 接收 <script> export default { props: ["msg1", "msg2"],// 如果這行不寫,下面就接收不到 setup(props) { console.log(props) // { msg1:"這是傳給子組件的信息1", msg2:"這是傳給子組件的信息2" } }, } </script>
方法二:純 Vue3 寫法
// Parent.vue 傳送 <child :msg2="msg2"></child> <script setup> import child from "./child.vue" import { ref, reactive } from "vue" const msg2 = ref("這是傳給子組件的信息2") // 或者復雜類型 const msg2 = reactive(["這是傳級子組件的信息2"]) </script> // Child.vue 接收 <script setup> // 不需要引入 直接使用 // import { defineProps } from "vue" const props = defineProps({ // 寫法一 msg2: String // 寫法二 msg2:{ type:String, default:"" } }) console.log(props) // { msg2:"這是傳級子組件的信息2" } </script>
注意:
如果父組件是混合寫法,子組件純 Vue3
寫法的話,是接收不到父組件里 data
的屬性,只能接收到父組件里 setup 函數里傳的屬性
如果父組件是純 Vue3
寫法,子組件混合寫法,可以通過 props
接收到 data
和 setup
函數里的屬性,但是子組件要是在 setup 里接收,同樣只能接收到父組件中 setup
函數里的屬性,接收不到 data 里的屬性
官方也說了,既然用了 3,就不要寫 2 了,所以不推薦混合寫法。下面的例子,一律只用純 Vue3 的寫法,就不寫混合寫法了
// Child.vue 派發
<template>
// 寫法一
<button @click="emit('myClick')">按鈕</buttom>
// 寫法二
<button @click="handleClick">按鈕</buttom>
</template>
<script setup>
// 方法一 適用于Vue3.2版本 不需要引入
// import { defineEmits } from "vue"
// 對應寫法一
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" const onMyClick = (msg) => { console.log(msg) // 這是父組件收到的信息 } </script>
父組件獲取子組件的屬性或者調用子組件方法
// Child.vue <script setup> // 方法一 不適用于Vue3.2版本,該版本 useContext()已廢棄 import { useContext } from "vue" const ctx = useContext() // 對外暴露屬性方法等都可以 ctx.expose({ childName: "這是子組件的屬性", someMethod(){ console.log("這是子組件的方法") } }) // 方法二 適用于Vue3.2版本, 不需要引入 // import { defineExpose } from "vue" defineExpose({ childName: "這是子組件的屬性", someMethod(){ console.log("這是子組件的方法") } }) </script> // Parent.vue 注意 ref="comp" <template> <child ref="comp"></child> <button @click="handlerClick">按鈕</button> </template> <script setup> import child from "./child.vue" import { ref } from "vue" const comp = ref(null) const handlerClick = () => { console.log(comp.value.childName) // 獲取子組件對外暴露的屬性 comp.value.someMethod() // 調用子組件對外暴露的方法 } </script>
attrs
:包含父作用域里除 class
和 style
除外的非 props
屬性集合
// Parent.vue 傳送 <child :msg1="msg1" :msg2="msg2" title="3333"></child> <script setup> import child from "./child.vue" import { ref, reactive } from "vue" const msg1 = ref("1111") const msg2 = ref("2222") </script> // Child.vue 接收 <script setup> import { defineProps, useContext, useAttrs } from "vue" // 3.2版本不需要引入 defineProps,直接用 const props = defineProps({ msg1: String }) // 方法一 不適用于 Vue3.2版本,該版本 useContext()已廢棄 const ctx = useContext() // 如果沒有用 props 接收 msg1 的話就是 { msg1: "1111", msg2:"2222", title: "3333" } console.log(ctx.attrs) // { msg2:"2222", title: "3333" } // 方法二 適用于 Vue3.2版本 const attrs = useAttrs() console.log(attrs) // { msg2:"2222", title: "3333" } </script>
可以支持多個數據雙向綁定
// Parent.vue <child v-model:key="key" v-model:value="value"></child> <script setup> import child from "./child.vue" import { ref, reactive } from "vue" const key = ref("1111") const value = ref("2222") </script> // Child.vue <template> <button @click="handlerClick">按鈕</button> </template> <script setup> // 方法一 不適用于 Vue3.2版本,該版本 useContext()已廢棄 import { useContext } from "vue" const { emit } = useContext() // 方法二 適用于 Vue3.2版本,不需要引入 // import { defineEmits } from "vue" const emit = defineEmits(["key","value"]) // 用法 const handlerClick = () => { emit("update:key", "新的key") emit("update:value", "新的value") } </script>
provide / inject
為依賴注入
provide
:可以讓我們指定想要提供給后代組件的數據或
inject
:在任何后代組件中接收想要添加在這個組件上的數據,不管組件嵌套多深都可以直接拿來用
// Parent.vue <script setup> import { provide } from "vue" provide("name", "沐華") </script> // Child.vue <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") // Page.vue // 方法一 直接使用 <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) // 1 const count = computed(()=>store.state.count) // 響應式,會隨著vuex數據改變而改變 console.log(count) // 1 </script>
看完上述內容,你們對Vue3的7種種組件通信是怎樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。