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

Vue3中子組件改變父組件傳過(guò)來(lái)的值(props)的方法小結(jié)

 更新時(shí)間:2025年04月01日 09:56:16   作者:匹馬夕陽(yáng)  
在 Vue 3 中,子組件改變父組件傳過(guò)來(lái)的值(props)的方法主要有以下幾種:通過(guò)事件發(fā)射、使用 v-model、模擬 .sync 修飾符的功能(Vue 3 中已移除),以及使用 ref 或 reactive,下面我將結(jié)合代碼示例和使用場(chǎng)景詳細(xì)講解這些方法,需要的朋友可以參考下

1. 通過(guò)事件發(fā)射

使用場(chǎng)景:當(dāng)子組件需要顯式通知父組件更新 props 的值時(shí),事件發(fā)射是一種常見(jiàn)且推薦的方式。這種方法清晰地表達(dá)了數(shù)據(jù)流向,符合 Vue 的單向數(shù)據(jù)流原則。

代碼示例

// 父組件
<template>
  <div>
    <Child :message="parentMessage" @update:message="updateMessage" />
    <p>父組件值:{{ parentMessage }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import Child from './Child.vue';

const parentMessage = ref('Hello from parent');

const updateMessage = (newMessage) => {
  parentMessage.value = newMessage;
};
</script>

// 子組件
<template>
  <div>
    <input v-model="localMessage" @input="handleInput" />
  </div>
</template>

<script setup>
import { ref, watch } from 'vue';

const props = defineProps({
  message: String
});

const emit = defineEmits(['update:message']);

const localMessage = ref(props.message);

// 監(jiān)聽(tīng) props 的變化,同步本地值
watch(() => props.message, (newVal) => {
  localMessage.value = newVal;
});

const handleInput = () => {
  emit('update:message', localMessage.value);
};
</script>

解釋

  • 父組件將 parentMessage 作為 prop 傳遞給子組件,并監(jiān)聽(tīng)子組件發(fā)出的 update:message 事件。
  • 子組件使用 localMessage 維護(hù)本地狀態(tài),并通過(guò) watch 確保與父組件的 prop 同步。
  • 當(dāng)輸入框的值改變時(shí),子組件通過(guò) emit('update:message') 通知父組件更新 parentMessage。

2. 使用 v-model

使用場(chǎng)景:當(dāng) prop 需要雙向綁定時(shí)(例如表單輸入),使用 v-model 是一種簡(jiǎn)潔的方式。它本質(zhì)上是對(duì)事件發(fā)射的封裝,適合需要頻繁更新的場(chǎng)景。

代碼示例

// 父組件
<template>
  <div>
    <Child v-model:message="parentMessage" />
    <p>父組件值:{{ parentMessage }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import Child from './Child.vue';

const parentMessage = ref('Hello from parent');
</script>

// 子組件
<template>
  <div>
    <input v-model="localMessage" />
  </div>
</template>

<script setup>
import { computed } from 'vue';

const props = defineProps({
  message: String
});

const emit = defineEmits(['update:message']);

const localMessage = computed({
  get() {
    return props.message;
  },
  set(value) {
    emit('update:message', value);
  }
});
</script>

解釋

  • 父組件使用 v-model:message 將 parentMessage 綁定到子組件,實(shí)際上是監(jiān)聽(tīng) update:message 事件并傳遞 prop。
  • 子組件通過(guò) computed 創(chuàng)建一個(gè)計(jì)算屬性 localMessage,其 getter 返回 prop 值,setter 觸發(fā) update:message 事件。
  • 輸入框的值改變時(shí),localMessage 的 setter 會(huì)被調(diào)用,通知父組件更新 parentMessage。

3. 模擬 .sync 修飾符的功能

使用場(chǎng)景:在 Vue 2 中,.sync 修飾符用于雙向綁定 prop,但在 Vue 3 中被移除??梢酝ㄟ^(guò)顯式的事件發(fā)射實(shí)現(xiàn)類似功能,適合需要更新特定 prop 的場(chǎng)景。

代碼示例

// 父組件
<template>
  <div>
    <Child :message="parentMessage" @update:message="parentMessage = $event" />
    <p>父組件值:{{ parentMessage }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import Child from './Child.vue';

const parentMessage = ref('Hello from parent');
</script>

// 子組件
<template>
  <div>
    <button @click="updateMessage">更新消息</button>
  </div>
</template>

<script setup>
const props = defineProps({
  message: String
});

const emit = defineEmits(['update:message']);

const updateMessage = () => {
  emit('update:message', 'New message from child');
};
</script>

解釋

  • 父組件監(jiān)聽(tīng) update:message 事件,并直接將事件參數(shù)賦值給 parentMessage。
  • 子組件在按鈕點(diǎn)擊時(shí)通過(guò) emit 發(fā)射 update:message 事件,攜帶新值。
  • 這種模式與 Vue 2 的 .sync 類似,但需要手動(dòng)實(shí)現(xiàn)。

4. 使用 ref 或 reactive

使用場(chǎng)景:當(dāng) prop 是一個(gè)對(duì)象或數(shù)組時(shí),可以將它包裝在 ref 或 reactive 中傳遞給子組件。子組件可以直接修改這些值,因?yàn)樗鼈兪琼憫?yīng)式的。這種方式適合復(fù)雜數(shù)據(jù)結(jié)構(gòu)的場(chǎng)景,但可能模糊單向數(shù)據(jù)流的邊界。

代碼示例

// 父組件
<template>
  <div>
    <Child :data="parentData" />
    <p>父組件值:{{ parentData.message }}</p>
  </div>
</template>

<script setup>
import { reactive } from 'vue';
import Child from './Child.vue';

const parentData = reactive({ message: 'Hello from parent' });
</script>

// 子組件
<template>
  <div>
    <input v-model="data.message" />
  </div>
</template>

<script setup>
const props = defineProps({
  data: Object
});
</script>

解釋

  • 父組件使用 reactive 創(chuàng)建一個(gè)響應(yīng)式對(duì)象 parentData,并將其作為 prop 傳遞給子組件。
  • 子組件直接操作 data.message,由于它是響應(yīng)式對(duì)象,修改會(huì)自動(dòng)反映到父組件。
  • 注意:這種方式繞過(guò)了顯式的事件發(fā)射,建議謹(jǐn)慎使用,避免數(shù)據(jù)流向不清晰。

總結(jié)

以下是各種方法的適用場(chǎng)景和特點(diǎn):

  • 事件發(fā)射:最符合 Vue 單向數(shù)據(jù)流原則,適合需要顯式通知父組件的場(chǎng)景。
  • v-model:簡(jiǎn)潔優(yōu)雅,適合表單輸入等雙向綁定場(chǎng)景。
  • 模擬 .sync:Vue 3 中替代 .sync 的手動(dòng)實(shí)現(xiàn),適合特定 prop 的更新。
  • ref 或 reactive:適合傳遞對(duì)象或數(shù)組,子組件可以直接修改,但需注意數(shù)據(jù)流清晰度。

根據(jù)具體需求選擇合適的方法,確保代碼的可維護(hù)性和數(shù)據(jù)流的一致性。

以上就是Vue3中子組件改變父組件傳過(guò)來(lái)的值(props)的方法和使用場(chǎng)景的詳細(xì)內(nèi)容,更多關(guān)于Vue3子組件改變父組件傳過(guò)來(lái)的值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue-resource?獲取本地json數(shù)據(jù)404問(wèn)題的解決

    vue-resource?獲取本地json數(shù)據(jù)404問(wèn)題的解決

    這篇文章主要介紹了vue-resource?獲取本地json數(shù)據(jù)404問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Vue.js與 ASP.NET Core 服務(wù)端渲染功能整合

    Vue.js與 ASP.NET Core 服務(wù)端渲染功能整合

    本文通過(guò)案例給大家詳細(xì)分析了ASP.NET Core 與 Vue.js 服務(wù)端渲染,需要的朋友可以參考下
    2017-11-11
  • 基于Vue3實(shí)現(xiàn)數(shù)字華容道游戲的示例代碼

    基于Vue3實(shí)現(xiàn)數(shù)字華容道游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Vue編寫(xiě)一個(gè)數(shù)字華容道游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue 添加和編輯用同一個(gè)表單,el-form表單提交后清空表單數(shù)據(jù)操作

    vue 添加和編輯用同一個(gè)表單,el-form表單提交后清空表單數(shù)據(jù)操作

    這篇文章主要介紹了vue 添加和編輯用同一個(gè)表單,el-form表單提交后清空表單數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Vue生命周期深入分析總結(jié)

    Vue生命周期深入分析總結(jié)

    Vue的生命周期就是vue實(shí)例從創(chuàng)建到銷毀的全過(guò)程,也就是new?Vue()?開(kāi)始就是vue生命周期的開(kāi)始。Vue?實(shí)例有?個(gè)完整的?命周期,也就是從開(kāi)始創(chuàng)建、初始化數(shù)據(jù)、編譯模版、掛載Dom?->?渲染、更新?->?渲染、卸載?等?系列過(guò)程,稱這是Vue的?命周期
    2022-08-08
  • Vue中父組件監(jiān)聽(tīng)子組件掛載完成的操作過(guò)程

    Vue中父組件監(jiān)聽(tīng)子組件掛載完成的操作過(guò)程

    文章介紹了父組件監(jiān)聽(tīng)子組件掛載完成的可靠方法,通過(guò)子組件主動(dòng)發(fā)送事件通知父組件,實(shí)現(xiàn)父子組件之間的通信,文章結(jié)合實(shí)例代碼介紹了Vue中父組件監(jiān)聽(tīng)子組件掛載完成的實(shí)例代碼,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • 解決VMware中vmware-vmx.exe進(jìn)程無(wú)法關(guān)閉以及死機(jī)等問(wèn)題

    解決VMware中vmware-vmx.exe進(jìn)程無(wú)法關(guān)閉以及死機(jī)等問(wèn)題

    這篇文章主要介紹了解決VMware中vmware-vmx.exe進(jìn)程無(wú)法關(guān)閉以及死機(jī)等問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • vue $router和$route的區(qū)別詳解

    vue $router和$route的區(qū)別詳解

    這篇文章主要介紹了vue $router和$route的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • vue+node 實(shí)現(xiàn)視頻在線播放的實(shí)例代碼

    vue+node 實(shí)現(xiàn)視頻在線播放的實(shí)例代碼

    這篇文章主要介紹了vue+node 實(shí)現(xiàn)視頻在線播放的實(shí)例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Vue.js使用computed屬性實(shí)現(xiàn)數(shù)據(jù)自動(dòng)更新

    Vue.js使用computed屬性實(shí)現(xiàn)數(shù)據(jù)自動(dòng)更新

    在Vue組件中,computed屬性是在組件的選項(xiàng)對(duì)象中聲明的,你可以把它們想象成組件的一個(gè)小功能,告訴Vue當(dāng)某些數(shù)據(jù)變化時(shí),如何更新界面,本文給大家介紹了Vue.js使用computed屬性實(shí)現(xiàn)數(shù)據(jù)自動(dòng)更新,需要的朋友可以參考下
    2024-06-06

最新評(píng)論

罗甸县| 留坝县| 宁城县| 安图县| 台南县| 黎城县| 江西省| 正定县| 饶平县| 岚皋县| 北安市| 双牌县| 祥云县| 宁河县| 灵丘县| 黔南| 环江| 杨浦区| 正阳县| 莱州市| 冷水江市| 普宁市| 荥经县| 鹤峰县| 赫章县| 邵阳市| 大竹县| 梅州市| 阿拉善盟| 张家口市| 大庆市| 体育| 澜沧| 桃园市| 威远县| 乌兰浩特市| 津市市| 安庆市| 武强县| 新干县| 乐都县|