最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3的7種種組件通信詳情

 更新時(shí)間:2021年09月24日 11:25:18   作者:沐華  
Vue3兼容大部分Vue2的特性,用Vue2代碼開(kāi)發(fā)Vue3都可以,性能上面打包大小減少 41%,初次渲染快 55%,更新快 133%,內(nèi)存使用減少 54%,本篇文章主要介紹Vue3的7種種組件通信,需要的朋友可以參考下面文章的具體內(nèi)容

1、Vue3 組件通信方式

  • props
  • $emit
  • expose / ref
  • $attrs
  • v-model
  • provide / inject
  • Vuex

2、Vue3 通信使用寫(xiě)法

2.1 props

props 傳數(shù)據(jù)給子組件有兩種方法,如下

方法一:混合寫(xiě)法

// Parent.vue 傳送
<child :msg1="msg1" :msg2="msg2"></child>
<script>
import child from "./child.vue"
import { ref, reactive } from "vue"
export default {
    data(){
        return {
            msg1:"這是傳級(jí)子組件的信息1"
        }
    },
    setup(){
        // 創(chuàng)建一個(gè)響應(yīng)式數(shù)據(jù)
        
        // 寫(xiě)法一 適用于基礎(chǔ)類(lèi)型  ref 還有其他用處,下面章節(jié)有介紹
        const msg2 = ref("這是傳級(jí)子組件的信息2")
        
        // 寫(xiě)法二 適用于復(fù)雜類(lèi)型,如數(shù)組、對(duì)象
        const msg2 = reactive(["這是傳級(jí)子組件的信息2"])
        
        return {
            msg2
        }
    }
}
</script>

// Child.vue 接收
<script>
export default {
  props: ["msg1", "msg2"],// 如果這行不寫(xiě),下面就接收不到
  setup(props) {
    console.log(props) // { msg1:"這是傳給子組件的信息1", msg2:"這是傳給子組件的信息2" }
  },
}
</script>

方法二:純 Vue3 寫(xiě)法

// Parent.vue 傳送
<child :msg2="msg2"></child>
<script setup>
    import child from "./child.vue"
    import { ref, reactive } from "vue"
    const msg2 = ref("這是傳給子組件的信息2")
    // 或者復(fù)雜類(lèi)型
    const msg2 = reactive(["這是傳級(jí)子組件的信息2"])
</script>

// Child.vue 接收
<script setup>
    // 不需要引入 直接使用
    // import { defineProps } from "vue"
    const props = defineProps({
        // 寫(xiě)法一
        msg2: String
        // 寫(xiě)法二
        msg2:{
            type:String,
            default:""
        }
    })
    console.log(props) // { msg2:"這是傳級(jí)子組件的信息2" }
</script>

注意:

如果父組件是混合寫(xiě)法,子組件純 Vue3 寫(xiě)法的話(huà),是接收不到父組件里 data 的屬性,只能接收到父組件里 setup 函數(shù)里傳的屬性

如果父組件是純 Vue3 寫(xiě)法,子組件混合寫(xiě)法,可以通過(guò) props 接收到 data setup 函數(shù)里的屬性,但是子組件要是在 setup 里接收,同樣只能接收到父組件中 setup 函數(shù)里的屬性,接收不到 data 里的屬性

官方也說(shuō)了,既然用了 3,就不要寫(xiě) 2 了,所以不推薦混合寫(xiě)法。下面的例子,一律只用純 Vue3 的寫(xiě)法,就不寫(xiě)混合寫(xiě)法了

2.2 $emit

// Child.vue 派發(fā)
<template>
    // 寫(xiě)法一
    <button @click="emit('myClick')">按鈕</buttom>
    // 寫(xiě)法二
    <button @click="handleClick">按鈕</buttom>
</template>
<script setup>
   
    // 方法一 適用于Vue3.2版本 不需要引入
    // import { defineEmits } from "vue"
    // 對(duì)應(yīng)寫(xiě)法一
    const emit = defineEmits(["myClick","myClick2"])
    // 對(duì)應(yīng)寫(xiě)法二
    const handleClick = ()=>{
        emit("myClick", "這是發(fā)送給父組件的信息")
    }
   
    // 方法二 不適用于 Vue3.2版本,該版本 useContext()已廢棄
    import { useContext } from "vue"
    const { emit } = useContext()
    const handleClick = ()=>{
        emit("myClick", "這是發(fā)送給父組件的信息")
    }
</script>

// Parent.vue 響應(yīng)
<template>
    <child @myClick="onMyClick"></child>
</template>
<script setup>
    import child from "./child.vue"
    const onMyClick = (msg) => {
        console.log(msg) // 這是父組件收到的信息
    }
</script>

2.3 expose / ref

父組件獲取子組件的屬性或者調(diào)用子組件方法

// Child.vue
<script setup>
    // 方法一 不適用于Vue3.2版本,該版本 useContext()已廢棄
    import { useContext } from "vue"
    const ctx = useContext()
    // 對(duì)外暴露屬性方法等都可以
    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) // 獲取子組件對(duì)外暴露的屬性
        comp.value.someMethod() // 調(diào)用子組件對(duì)外暴露的方法
    }
</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()
    // 如果沒(méi)有用 props 接收 msg1 的話(huà)就是 { 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

可以支持多個(gè)數(shù)據(jù)雙向綁定

// 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 為依賴(lài)注入

  • provide:可以讓我們指定想要提供給后代組件的數(shù)據(jù)或
  • inject:在任何后代組件中接收想要添加在這個(gè)組件上的數(shù)據(jù),不管組件嵌套多深都可以直接拿來(lái)用
// 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) // 響應(yīng)式,會(huì)隨著vuex數(shù)據(jù)改變而改變
    console.log(count) // 1 
</script>

到此這篇關(guān)于Vue3的7種種組件通信詳情的文章就介紹到這了,更多相關(guān)Vue3的7種種組件通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3的ref、isRef、toRef、toRefs、toRaw詳細(xì)介紹

    vue3的ref、isRef、toRef、toRefs、toRaw詳細(xì)介紹

    本文詳細(xì)講解了vue3的ref、isRef、toRef、toRefs、toRaw,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 一文帶你了解Vue?和?React的區(qū)別

    一文帶你了解Vue?和?React的區(qū)別

    這篇文章主要介紹了Vue和React的區(qū)別,畢竟是兩個(gè)框架,不像兩個(gè)?API,要說(shuō)細(xì)節(jié)上的區(qū)別就太多太多了,本文就簡(jiǎn)單的帶大家說(shuō)說(shuō)Vue?和?React?的區(qū)別,需要的朋友可以參考下
    2023-05-05
  • 可能是vue中使用axios最詳細(xì)教程

    可能是vue中使用axios最詳細(xì)教程

    Axios是一個(gè)基于Promise用于瀏覽器和nodejs的HTTP客戶(hù)端,本質(zhì)上也是對(duì)原生XHR的封裝,只不過(guò)它是Promise的實(shí)現(xiàn)版本,符合最新的ES規(guī)范,下面這篇文章主要給大家介紹了關(guān)于vue中使用axios最詳細(xì)教程的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • vue項(xiàng)目支付功能代碼詳解

    vue項(xiàng)目支付功能代碼詳解

    這篇文章主要介紹了vue項(xiàng)目支付功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Vue自定義指令實(shí)現(xiàn)checkbox全選功能的方法

    Vue自定義指令實(shí)現(xiàn)checkbox全選功能的方法

    下面小編就為大家分享一篇Vue自定義指令實(shí)現(xiàn)checkbox全選功能的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • vuecli+AXdownload下載組件封裝?+css3下載懸浮球動(dòng)畫(huà)效果

    vuecli+AXdownload下載組件封裝?+css3下載懸浮球動(dòng)畫(huà)效果

    當(dāng)觸發(fā)下載功能的時(shí)候,會(huì)觸發(fā)一個(gè)下載動(dòng)畫(huà),下載懸浮球會(huì)自動(dòng)彈出,并且閃爍提示有新的下載任務(wù)直到下載任務(wù)完場(chǎng)提示,接下來(lái)通過(guò)本文介紹vuecli+AXdownload下載組件封裝?+css3下載懸浮球動(dòng)畫(huà)效果,需要的朋友可以參考下
    2024-05-05
  • vue中使用jwt-decode解析token的方法

    vue中使用jwt-decode解析token的方法

    這篇文章主要介紹了vue中使用jwt-decode解析token,文末給大家補(bǔ)充介紹了vue通過(guò)jwt-decode解析token獲取需要的數(shù)據(jù),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Vue使用vue-area-linkage實(shí)現(xiàn)地址三級(jí)聯(lián)動(dòng)效果的示例

    Vue使用vue-area-linkage實(shí)現(xiàn)地址三級(jí)聯(lián)動(dòng)效果的示例

    很多時(shí)候我們需要使用地址三級(jí)聯(lián)動(dòng),即省市區(qū)三級(jí)聯(lián)動(dòng),這篇文章主要介紹了Vue使用vue-area-linkage實(shí)現(xiàn)地址三級(jí)聯(lián)動(dòng)效果的示例,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Vue使用富文本編輯器Vue-Quill-Editor(含圖片自定義上傳服務(wù)、清除復(fù)制粘貼樣式等)

    Vue使用富文本編輯器Vue-Quill-Editor(含圖片自定義上傳服務(wù)、清除復(fù)制粘貼樣式等)

    這篇文章主要介紹了Vue項(xiàng)目中使用富文本編輯器Vue-Quill-Editor(含圖片自定義上傳服務(wù)、清除復(fù)制粘貼樣式等)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • vue相同路由跳轉(zhuǎn)強(qiáng)制刷新該路由組件操作

    vue相同路由跳轉(zhuǎn)強(qiáng)制刷新該路由組件操作

    這篇文章主要介紹了vue相同路由跳轉(zhuǎn)強(qiáng)制刷新該路由組件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08

最新評(píng)論

微博| 突泉县| 故城县| 武宣县| 绥化市| 平乐县| 资中县| 绍兴县| 海阳市| 奉节县| 永善县| 中江县| 攀枝花市| 德阳市| 轮台县| 延边| 巴里| 大竹县| 湘潭县| 威海市| 汪清县| 深州市| 麟游县| 永定县| 石家庄市| 五指山市| 监利县| 林西县| 龙泉市| 苗栗市| 武陟县| 汾阳市| 确山县| 余庆县| 探索| 湖州市| 区。| 沅江市| 洛扎县| 凌海市| 涞源县|