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

Vue3的7種種組件通信詳情

 更新時(shí)間:2021年09月24日 11:25:18   作者:沐華  
Vue3兼容大部分Vue2的特性,用Vue2代碼開發(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 通信使用寫法

2.1 props

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

方法一:混合寫法

// 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(){
        // 創(chuàng)建一個(gè)響應(yīng)式數(shù)據(jù)
        
        // 寫法一 適用于基礎(chǔ)類型  ref 還有其他用處,下面章節(jié)有介紹
        const msg2 = ref("這是傳級子組件的信息2")
        
        // 寫法二 適用于復(fù)雜類型,如數(shù)組、對象
        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")
    // 或者復(fù)雜類型
    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 函數(shù)里傳的屬性

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

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

2.2 $emit

// Child.vue 派發(fā)
<template>
    // 寫法一
    <button @click="emit('myClick')">按鈕</buttom>
    // 寫法二
    <button @click="handleClick">按鈕</buttom>
</template>
<script setup>
   
    // 方法一 適用于Vue3.2版本 不需要引入
    // import { defineEmits } from "vue"
    // 對應(yīng)寫法一
    const emit = defineEmits(["myClick","myClick2"])
    // 對應(yīng)寫法二
    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()
    // 對外暴露屬性方法等都可以
    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() // 調(diào)用子組件對外暴露的方法
    }
</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

可以支持多個(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 為依賴注入

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

到此這篇關(guān)于Vue3的7種種組件通信詳情的文章就介紹到這了,更多相關(guān)Vue3的7種種組件通信內(nèi)容請搜索腳本之家以前的文章或繼續(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,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 一文帶你了解Vue?和?React的區(qū)別

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

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

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

    Axios是一個(gè)基于Promise用于瀏覽器和nodejs的HTTP客戶端,本質(zhì)上也是對原生XHR的封裝,只不過它是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)目支付功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Vue自定義指令實(shí)現(xiàn)checkbox全選功能的方法

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

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

    vuecli+AXdownload下載組件封裝?+css3下載懸浮球動畫效果

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

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

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

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

    很多時(shí)候我們需要使用地址三級聯(lián)動,即省市區(qū)三級聯(lián)動,這篇文章主要介紹了Vue使用vue-area-linkage實(shí)現(xiàn)地址三級聯(lián)動效果的示例,感興趣的小伙伴們可以參考一下
    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í)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • vue相同路由跳轉(zhuǎn)強(qiáng)制刷新該路由組件操作

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

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

最新評論

文成县| 镶黄旗| 弥渡县| 红桥区| 杂多县| 十堰市| 洞口县| 岑溪市| 雷州市| 晴隆县| 贺州市| 石首市| 齐河县| 芜湖县| 蓬莱市| 北流市| 鲁山县| 镇赉县| 凉城县| 临西县| 会宁县| 司法| 沽源县| 永平县| 罗田县| 双牌县| 玉屏| 阿克| 体育| 什邡市| 大荔县| 宁安市| 黄平县| 常宁市| 太康县| 济阳县| 红原县| 平遥县| 蕉岭县| 米林县| 阜阳市|