1. 程式人生 > 程式設計 >Vue3的7種種元件通訊詳情

Vue3的7種種元件通訊詳情

目錄
  • 1、3 元件通訊方式
  • 2、Vue3 通訊使用寫法
    • 2.1 props
    • 2.2 $emit
    • 2.3 expose / ref
    • 2.4 attrs
    • 2.5 v-model
    • 2.6 provide / inject
    • 2.7 Vuex

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")
  http://www.cppcns.com  // 或者複雜型別
    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>LXhoGvXS

// 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({
   www.cppcns.com     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 } fromLXhoGvXS "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>
&http://www.cppcns.comlt;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.
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種種元件通訊內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!