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

vue父子組件通訊的所有方法小結(jié)

 更新時(shí)間:2024年07月26日 08:30:47   作者:今天一定晴q  
本文將介紹父組件與子組件之間傳遞數(shù)據(jù)的四種方法,以一個(gè)簡(jiǎn)單的小demo為例,通過(guò)實(shí)例全方位解析和代碼演示,便于大家理解,需要的朋友可以參考下

父子組件通訊

父組件展示輸入框用于新增數(shù)據(jù),子組件展示數(shù)組信息

場(chǎng)景一:直接傳遞一整個(gè)數(shù)組

父組件在子組件標(biāo)簽中使用v-bind綁定一個(gè)屬性名為list,屬性值為要傳遞的數(shù)組list

子組件調(diào)用函數(shù)defineProps,接收父組件傳過(guò)來(lái)的數(shù)據(jù)。defineProps函數(shù)是vue默認(rèn)幫我們引入好了的,它默認(rèn)接收一個(gè)對(duì)象作為參數(shù),該對(duì)象包含一個(gè)字段,字段名為父組件綁定的屬性名list,字段值又為一個(gè)對(duì)象,對(duì)象中包含子組件期望接收到的數(shù)據(jù)類(lèi)型type和默認(rèn)值default,此處期望接收到一個(gè)數(shù)組,默認(rèn)值為一個(gè)空數(shù)組。list可以直接拿到template模塊中使用

父組件代碼:

<template>
  <div class="inputGroup">
    <input type="text" v-model="value">
    <button @click="add">添加</button>
  </div>

  <Child :list="list"> </Child>  // 父組件將值v-bind綁定傳給子組件
</template>

<script setup>
  import Child from '@/components/child.vue' // 引入子組件
  import { ref } from 'vue'
  const value = ref('')
  const list = ref(['html', 'css', 'js'])

  const add = () => {
    list.value.push(value.value)
    value.value = ''
  }
</script>

子組件代碼:

<template>
    <div class="child">
        <ul>
          <li v-for="item in list">{{ item }}</li>
        </ul>
    </div>
</template>

<script setup>
    defineProps({       // 子組件使用defineProps接收         
        list: {                   
            type: Array,          
            required: true,
            default: () => []     
        }
    })
</script>

這個(gè)通訊過(guò)程本身就是一個(gè)響應(yīng)式的過(guò)程,所以父組件向子組件傳遞過(guò)去的屬性值 list 發(fā)生改變后,子組件會(huì)重新接收一遍最新的值,由于 list 被定義成了響應(yīng)式,瀏覽器最終就會(huì)將新添加的值成功渲染出來(lái)

場(chǎng)景二:只傳遞新增加的那個(gè)值

父組件在子組件標(biāo)簽中使用v-bind綁定一個(gè)屬性名為msg,屬性值為要傳遞的新增數(shù)據(jù)toChild

子組件定義一個(gè)變量props接收defineProps函數(shù)執(zhí)行的結(jié)果,再將接收到的新增數(shù)據(jù) props.msg添加進(jìn)子組件已經(jīng)定義好的list數(shù)組中

父組件代碼:

<template>
  <div class="inputGroup">
    <input type="text" v-model="value">
    <button @click="add">添加</button>
  </div>

  <Child :msg="toChild"> </Child>
</template>

<script setup>
  import Child from '@/components/child.vue' // 引入子組件
  import { ref } from 'vue'
  const value = ref('')
  const toChild = ref('')

  const add = () => {
    toChild.value = value.value
  }
</script>

子組件代碼:

<template>
    <div class="child">
        <ul>
          <li v-for="item in list">{{ item }}</li>
        </ul>
    </div>
</template>

<script setup>
    import { ref, watch } from 'vue'
    const list = ref(['html', 'css', 'js'])
    const props = defineProps({
        msg: ''     // 直接簡(jiǎn)寫(xiě),不再把msg對(duì)應(yīng)的值寫(xiě)成一個(gè)對(duì)象
    })              
  
    watch(          // 監(jiān)視props.msg的值的變化,一旦變化執(zhí)行回調(diào)函數(shù)
        () => props.msg,
        (newVal, oldVal) => {
            list.value.push(newVal)
        }
    )
</script>

defineProps函數(shù)中的字段可以直接被拿到template中使用,但如果要在js腳本中使用,需要一個(gè)變量來(lái)接收這個(gè)函數(shù)的執(zhí)行結(jié)果

注意:這里不直接list.value.push(props.msg),而是需要watch對(duì)props.msg的值進(jìn)行監(jiān)聽(tīng)是因?yàn)椋簂ist的更新需要list.value.push()這句js代碼反復(fù)去執(zhí)行,而js代碼在瀏覽器第一遍渲染頁(yè)面完成后,不會(huì)再執(zhí)行第二遍,所以需要watch函數(shù)在監(jiān)視到值變化后,主動(dòng)去執(zhí)行l(wèi)ist的更新

子父組件通訊一

父組件展示數(shù)組信息,子組件展示輸入框用于新增數(shù)據(jù)

借助發(fā)布訂閱機(jī)制,子組件調(diào)用defineEmits函數(shù)接受一個(gè)數(shù)組作為參數(shù),數(shù)組 [ 'new' ] 表示組件可以觸發(fā)一個(gè)名為 'new' 的自定義事件,返回給emits對(duì)象,可以用它來(lái)觸發(fā) new 事件。點(diǎn)擊按鈕后,調(diào)用emits函數(shù)發(fā)布事件,傳遞的參數(shù)分別為要傳輸給父組件的事件名new和事件值value.value

父組件訂閱該事件,通過(guò)事件參數(shù)獲取子組件提供的值

父組件代碼:

<template>
    <!-- 訂閱new事件-->
    <Child @new="handle"></Child>
    
    <div class="child">
        <ul>
          <li v-for="item in list">{{ item }}</li>
        </ul>
    </div>

</template>

<script setup>
    import Child from '@/components/child2.vue'
    import { ref } from 'vue'
    const list = ref(['html', 'css', 'js'])

    const handle = (event) => {   // event事件參數(shù),其實(shí)就是子組件發(fā)布事件時(shí)傳輸過(guò)來(lái)的值
        list.value.push(event)
    }
</script>

子組件代碼:

<template>
    <div class="inputGroup">
        <input type="text" v-model="value">
        <button @click="add">添加</button>
    </div>
</template>

<script setup>
    import { ref } from 'vue'
    const value = ref('')

    const emits = defineEmits(['new'])  // 創(chuàng)建一個(gè)new事件
    const add = () => {
        emits('new', value.value)  // 發(fā)布事件 
    }
</script>

子父組件通訊二

仍然是父組件展示數(shù)組信息,子組件展示輸入框用于新增數(shù)據(jù)

能用但不建議版

如果將list數(shù)組看做成籃子,新增數(shù)據(jù)看做成蘋(píng)果,那么子父組件通訊一就是兒子把蘋(píng)果丟給父親,父親再將蘋(píng)果裝入籃中;子父組件通訊二就是父親把籃子共享給了兒子,兒子將蘋(píng)果裝入籃中

父組件定義了list數(shù)組,通過(guò)v-model:list指令將父組件的 list 屬性與子組件中的 list prop 進(jìn)行了雙向綁定,意味著當(dāng)在子組件內(nèi)部修改 list 時(shí),這些更改也會(huì)反映回父組件的 list 屬性中

子組件接收l(shuí)ist的方式就是使用defineProps接收

父組件代碼:

<template>
    <Child v-model:list="list"></Child>
    
    <div class="child">
        <ul>
          <li v-for="item in list">{{ item }}</li>
        </ul>
    </div>
</template>

<script setup>
    import Child from '@/components/child3.vue'
    import { ref } from 'vue'
    
    const list = ref(['html', 'css', 'js'])
</script>

子組件代碼:

<template>
    <div class="inputGroup">
        <input type="text" v-model="value">
        <button @click="add">添加</button>
    </div>
</template>

<script setup>
    import { ref, defineProps } from 'vue'
    const value = ref('')

    const props = defineProps({
        list: {
            type: Array,
            default: () => []
        }
    })

    const add = () => {
        props.list.push(value.value)
    }
</script>

但是vue官方不建議我們讓子組件直接操作父組件給過(guò)來(lái)的數(shù)據(jù),因?yàn)檫@樣會(huì)導(dǎo)致數(shù)據(jù)流很混亂。正常來(lái)講我自己的數(shù)組想要被修改,就應(yīng)該由我自己來(lái)改,而不是交到別人手上去改

優(yōu)化版

所以子組件的js代碼應(yīng)當(dāng)優(yōu)化成下面的樣子

使用 defineEmits 函數(shù)來(lái)聲明組件可以觸發(fā)的事件update:list,在 Vue 中,以 update: 開(kāi)頭的事件通常用于通知父組件 子組件內(nèi)部數(shù)據(jù)的變更。arr接收list prop 的引用,再把更新過(guò)后的arr拋出出去,v-model:list就會(huì)自動(dòng)get到最新的值

<script setup>
    import { ref, defineProps } from 'vue'
    const value = ref('')

    const props = defineProps({
        list: {
            type: Array,
            default: () => []
        }
    })

    const emits = defineEmits(['update:list'])
    const add = () => {
        const arr = props.list
        arr.push(value.value)
        emits('update:list', arr)
    }
</script>

子父組件通訊三

仍然是父組件展示數(shù)組信息,子組件展示輸入框用于新增數(shù)據(jù)

父組件直接讀取到子組件更新后的list:父組件中定義了一個(gè)響應(yīng)式變量childRefchildRef作為一個(gè)標(biāo)記打到子組件標(biāo)簽上,就可以通過(guò)childRef獲取到子組件的任何數(shù)據(jù)

子組件自己完成對(duì)list的更新,調(diào)用defineExpose函數(shù),指定list的數(shù)據(jù)可以被外部訪(fǎng)問(wèn)

父組件代碼:

<template>
    <Child ref="childRef"></Child>
    <div class="child">
        <ul>
          <li v-for="item in childRef?.list">{{ item }}</li> 
        </ul>
    </div>
</template>

<script setup>
    import Child from '@/components/child4.vue'
    import { ref, onMounted } from 'vue'
    const childRef = ref(null)  
</script>

子組件代碼:

<template>
    <div class="inputGroup">
        <input type="text" v-model="value">
        <button @click="add">添加</button>
    </div>
</template>

<script setup>
    import { ref, defineProps } from 'vue'
    const value = ref('')
    const list = ref(['html', 'css', 'js'])

    const add = () => {
        list.value.push(value.value)
    }

    defineExpose({ list }) // 自愿暴露數(shù)據(jù)
</script>

ref 是 Vue 中的一個(gè)特殊屬性,它允許我們?cè)诟附M件中引用子組件或 DOM 元素

item in childRef?.list中,是ES6的新語(yǔ)法,當(dāng)childRef有值的時(shí)候才會(huì)讀取后面的.list,沒(méi)有的時(shí)候就不會(huì)去讀取 (這樣安排是因?yàn)楦附M件在執(zhí)行這行代碼的時(shí)候,子組件可能還未加載完畢,這樣以免報(bào)錯(cuò))

總結(jié)

  • 父子組件通訊:父組件將值v-bind綁定傳給子組件,子組件使用defineProps接收
  • 子組件向父組件通訊:借助發(fā)布訂閱機(jī)制,子組件負(fù)責(zé)發(fā)布事件并攜帶參數(shù),父組件訂閱該事件,通過(guò)事件參數(shù)獲取子組件提供的值
  • 子組件向父組件通訊:父組件借助v-model將數(shù)據(jù)綁定給子組件,子組件創(chuàng)建'update:xxxx'事件,并將接收到的數(shù)據(jù)修改后emits出來(lái)
  • 子組件向父組件通訊:父組件通過(guò)ref獲取子組件中defineExpose()暴露出來(lái)的數(shù)據(jù)

以上就是vue父子組件通訊的所有方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于vue父子組件通訊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue實(shí)現(xiàn)右上角時(shí)間顯示實(shí)時(shí)刷新

    vue實(shí)現(xiàn)右上角時(shí)間顯示實(shí)時(shí)刷新

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)右上角時(shí)間顯示實(shí)時(shí)刷新,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • vue3循環(huán)展示圖片實(shí)現(xiàn)過(guò)程

    vue3循環(huán)展示圖片實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了vue3循環(huán)展示圖片實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • vue 集成 vis-network 實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D的方法

    vue 集成 vis-network 實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D的方法

    這篇文章主要介紹了vue 集成 vis-network 實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì) ,需要的朋友可以參考下
    2019-08-08
  • Vue3監(jiān)聽(tīng)reactive對(duì)象中屬性變化的方法

    Vue3監(jiān)聽(tīng)reactive對(duì)象中屬性變化的方法

    在 Vue 3 中,如果你想監(jiān)聽(tīng) reactive 對(duì)象中的某個(gè)屬性發(fā)生的變化,你可以使用 watch 函數(shù)進(jìn)行監(jiān)聽(tīng),watch 函數(shù)允許你觀(guān)察 reactive 對(duì)象的某個(gè)屬性或者整個(gè)對(duì)象,所以本文給大家介紹了Vue3監(jiān)聽(tīng)reactive對(duì)象中屬性變化的方法,需要的朋友可以參考下
    2024-08-08
  • vue項(xiàng)目中使用Svg的方法

    vue項(xiàng)目中使用Svg的方法

    本文主要以 vue-cli3 搭建的項(xiàng)目為例,來(lái)聊一下如何在項(xiàng)目中更優(yōu)雅的使用 svg 。感興趣的朋友跟隨小編一起看看吧
    2018-10-10
  • Vue3基于?rem?比例縮放方案示例詳解

    Vue3基于?rem?比例縮放方案示例詳解

    這篇文章主要介紹了Vue3基于rem比例縮放方案,本縮放方案置于hooks中即可,文中通過(guò)示例代碼介紹了vue-cli3 中使用rem布局的方法,需要的朋友可以參考下
    2023-05-05
  • vue實(shí)現(xiàn)集成騰訊TIM即時(shí)通訊

    vue實(shí)現(xiàn)集成騰訊TIM即時(shí)通訊

    最近在做商城類(lèi)的項(xiàng)目,需要使用到客服系統(tǒng),用戶(hù)選擇的騰訊IM即時(shí)通信,所以本文主要介紹了vue實(shí)現(xiàn)集成騰訊TIM即時(shí)通訊,感興趣的可以了解一下
    2021-06-06
  • vue中將網(wǎng)頁(yè)打印成pdf實(shí)例代碼

    vue中將網(wǎng)頁(yè)打印成pdf實(shí)例代碼

    本篇文章主要介紹了vue中將網(wǎng)頁(yè)打印成pdf實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Vue-router不允許導(dǎo)航到當(dāng)前位置(/path)錯(cuò)誤原因以及修復(fù)方式

    Vue-router不允許導(dǎo)航到當(dāng)前位置(/path)錯(cuò)誤原因以及修復(fù)方式

    本文主要介紹了Vue-router不允許導(dǎo)航到當(dāng)前位置(/path)錯(cuò)誤原因以及修復(fù)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Vue路由跳轉(zhuǎn)方式區(qū)別匯總(push,replace,go)

    Vue路由跳轉(zhuǎn)方式區(qū)別匯總(push,replace,go)

    vue項(xiàng)目中點(diǎn)擊router-link標(biāo)簽鏈接都屬于聲明式導(dǎo)航。vue項(xiàng)目中編程式導(dǎo)航有this.$router.push(),this.$router.replace(),this.$router.go()???????。這篇文章主要介紹了Vue路由跳轉(zhuǎn)方式區(qū)別匯總(push,replace,go)
    2022-12-12

最新評(píng)論

都昌县| 大竹县| 黄石市| 贵港市| 长岛县| 班戈县| 上犹县| 固原市| 五华县| 平顺县| 瑞金市| 龙门县| 个旧市| 建昌县| 岑溪市| 津市市| 屯门区| 额尔古纳市| 浦东新区| 黔西县| 抚宁县| 苏州市| 宁国市| 濉溪县| 绵竹市| 永城市| 犍为县| 岳普湖县| 许昌县| 万源市| 长汀县| 通城县| 钟祥市| 绥滨县| 丹东市| 华阴市| 高碑店市| 平山县| 玉林市| 安平县| 榆中县|