Vue3的7種種組件通信詳情
1、Vue3 組件通信方式
props
$emit
expose / ref
$attrs
v-model
provide / inject
Vuex
2、Vue3 通信使用寫法
2.1 props
用 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 的寫法,就不寫混合寫法瞭
2.2 $emit
// 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>
2.3 expose / ref
父組件獲取子組件的屬性或者調用子組件方法
// 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>
2.4 attrs
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>
2.5 v-model
可以支持多個數據雙向綁定
// 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>
2.6 provide / inject
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>
2.7 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") // 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種種組件通信詳情的文章就介紹到這瞭,更多相關Vue3
的7種種組件通信內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!