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

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

 更新時間:2025年11月24日 14:25:07   作者:藤原とラふ店丶  
文章介紹了父組件監(jiān)聽子組件掛載完成的可靠方法,通過子組件主動發(fā)送事件通知父組件,實現(xiàn)父子組件之間的通信,文章結(jié)合實例代碼介紹了Vue中父組件監(jiān)聽子組件掛載完成的實例代碼,感興趣的朋友跟隨小編一起看看吧

父組件監(jiān)聽子組件掛載完成,核心邏輯是 子組件在自身掛載完畢后主動向父組件發(fā)送事件,父組件監(jiān)聽該事件并執(zhí)行后續(xù)操作(比如調(diào)用子組件方法)。這種方式最可靠,能確保子組件完全渲染+初始化完成,適配 Vue2、Vue3 所有版本,下面分場景詳細說明實現(xiàn)步驟和注意事項:

一、核心原理

  1. 子組件生命周期:mounted 鉤子觸發(fā)時,子組件已完成 DOM 渲染、自身初始化(無異步邏輯時),是“掛載完成”的關(guān)鍵節(jié)點;
  2. 父子通信:子組件通過 $emit(Vue2/Vue3 選項式)或 defineEmits(Vue3 組合式)發(fā)送自定義事件(比如 mounted-complete);
  3. 父組件響應(yīng):在模板中通過 @事件名 監(jiān)聽子組件事件,回調(diào)函數(shù)中即可安全操作子組件(調(diào)用方法、訪問屬性)。

二、分版本實現(xiàn)(含完整代碼)

場景 1:Vue2(選項式 API)

1. 子組件:掛載完成后發(fā)送事件

<!-- 子組件 Child.vue(Vue2) -->
<template>
  <div>子組件內(nèi)容</div>
</template>
<script>
export default {
  name: 'ChildComponent',
  mounted() {
    // 關(guān)鍵:子組件掛載完畢,向父組件發(fā)送事件(事件名建議 kebab-case)
    this.$emit('mounted-complete'); 
  },
  methods: {
    // 父組件要調(diào)用的子組件方法
    childMethod() {
      console.log('子組件方法執(zhí)行(已掛載完成)');
    }
  }
}
</script>

2. 父組件:監(jiān)聽事件并調(diào)用方法

<!-- 父組件 Parent.vue(Vue2) -->
<template>
  <!-- 1. v-if 控制子組件顯示;2. ref 綁定子組件;3. @監(jiān)聽子組件事件 -->
  <ChildComponent
    v-if="isChildShow"
    ref="childRef"
    @mounted-complete="handleChildMounted" <!-- 監(jiān)聽掛載完成事件 -->
  />
  <button @click="showChild">顯示子組件</button>
</template>
<script>
import ChildComponent from './Child.vue';
export default {
  components: { ChildComponent },
  data() {
    return { isChildShow: false };
  },
  methods: {
    // 觸發(fā)子組件顯示
    showChild() {
      this.isChildShow = true;
    },
    // 子組件掛載完成后的回調(diào)(核心)
    handleChildMounted() {
      // 此時子組件已完全掛載,$refs 一定存在,可安全調(diào)用方法
      this.$refs.childRef.childMethod();
      // (可選)訪問子組件屬性
      console.log('子組件屬性:', this.$refs.childRef.childProp);
    }
  }
}
</script>

場景 2:Vue3(選項式 API,與 Vue2 兼容)

邏輯和 Vue2 一致,僅語法細微差異(無需 name 也可正常通信):

<!-- 子組件 Child.vue(Vue3 選項式) -->
<script>
export default {
  mounted() {
    this.$emit('mounted-complete'); // 同樣用 $emit 發(fā)事件
  },
  methods: {
    childMethod() { /* ... */ }
  }
}
</script>
<!-- 父組件 Parent.vue(Vue3 選項式) -->
<template>
  <ChildComponent v-if="isChildShow" ref="childRef" @mounted-complete="handleChildMounted" />
</template>
<script>
import ChildComponent from './Child.vue';
export default {
  components: { ChildComponent },
  data() { return { isChildShow: false }; },
  methods: {
    showChild() { this.isChildShow = true; },
    handleChildMounted() { this.$refs.childRef.childMethod(); }
  }
}
</script>

場景 3:Vue3(組合式 API / setup 語法,推薦)

Vue3 組合式 API 需用 defineEmits 聲明事件,ref 綁定方式略有不同:

1. 子組件:用 defineEmits 聲明事件并發(fā)送

<!-- 子組件 Child.vue(Vue3 setup) -->
<template>
  <div>子組件內(nèi)容</div>
</template>
<script setup>
// 1. 聲明要發(fā)送的事件(TypeScript 可選,增強類型提示)
const emit = defineEmits(['mounted-complete']);
// 2. 模擬子組件掛載完成(mounted 鉤子等價于 setup 中直接執(zhí)行異步邏輯后觸發(fā))
// 注:setup 執(zhí)行時機是 beforeCreate -> created 之間,需用 onMounted 監(jiān)聽掛載
import { onMounted } from 'vue';
onMounted(() => {
  // 掛載完成后發(fā)送事件
  emit('mounted-complete'); 
});
// 子組件方法(需用 defineExpose 暴露給父組件)
const childMethod = () => {
  console.log('Vue3 子組件方法執(zhí)行(已掛載)');
};
// 關(guān)鍵:setup 中定義的方法/屬性,需顯式暴露才能被父組件 $refs 訪問
defineExpose({ childMethod });
</script>

2. 父組件:監(jiān)聽事件并調(diào)用暴露的方法

<!-- 父組件 Parent.vue(Vue3 setup) -->
<template>
  <ChildComponent
    v-if="isChildShow"
    ref="childRef" <!-- 用 ref 綁定子組件實例 -->
    @mounted-complete="handleChildMounted" <!-- 監(jiān)聽事件 -->
  />
  <button @click="isChildShow = true">顯示子組件</button>
</template>
<script setup>
import { ref } from 'vue';
import ChildComponent from './Child.vue';
// 1. 控制子組件顯示的開關(guān)
const isChildShow = ref(false);
// 2. 綁定子組件的 ref(初始為 null)
const childRef = ref(null);
// 3. 子組件掛載完成后的回調(diào)
const handleChildMounted = () => {
  // 此時 childRef.value 是子組件實例,且已暴露 childMethod
  childRef.value.childMethod(); // 安全調(diào)用
};
</script>

三、進階場景:子組件有異步初始化邏輯

如果子組件 mounted 中存在異步操作(比如請求接口、加載資源),僅靠 mounted 只能保證 DOM 渲染,不能保證異步邏輯完成。此時需修改子組件:在異步邏輯結(jié)束后再發(fā)送事件。

示例(子組件有接口請求):

<!-- 子組件 Child.vue(Vue3 setup) -->
<script setup>
const emit = defineEmits(['mounted-complete']);
import { onMounted } from 'vue';
// 子組件方法(依賴接口返回數(shù)據(jù))
const childMethod = (data) => {
  console.log('子組件方法執(zhí)行,數(shù)據(jù):', data);
};
onMounted(async () => {
  // 模擬異步接口請求(實際開發(fā)中是 axios/fetch)
  const res = await fetch('/api/child-data');
  const data = await res.json();
  // 異步邏輯完成后,再發(fā)送“掛載+初始化完成”事件(可攜帶數(shù)據(jù))
  emit('mounted-complete', data); 
});
defineExpose({ childMethod });
</script>
<!-- 父組件 Parent.vue(Vue3 setup) -->
<script setup>
// ... 其他代碼不變
const handleChildMounted = (data) => {
  // 接收子組件傳遞的異步數(shù)據(jù),再調(diào)用方法
  childRef.value.childMethod(data);
};
</script>

四、關(guān)鍵注意事項(避免踩坑)

  1. 事件命名規(guī)范:推薦用 kebab-case(短橫線分隔),比如 mounted-complete,避免駝峰(Vue 模板中不區(qū)分大小寫,可能導致事件監(jiān)聽失效);
  2. Vue3 setup 必須暴露方法:setup 中定義的方法/屬性默認是“私有”的,需用 defineExpose 顯式暴露,父組件才能通過 ref 訪問;
  3. 避免重復觸發(fā):如果子組件可能多次掛載(比如 v-if 反復切換 true/false),父組件回調(diào)會多次執(zhí)行,可通過標志位控制:
// 父組件中添加標志位
const isChildMounted = ref(false);
const handleChildMounted = () => {
  if (!isChildMounted.value) {
    childRef.value.childMethod();
    isChildMounted.value = true; // 執(zhí)行一次后標記
  }
};
  1. 兜底判斷:極端情況下(比如子組件內(nèi)部有條件渲染導致未真正掛載),可加可選鏈判斷:
// Vue2:this.$refs.childRef?.childMethod();(需開啟 ES6+ 可選鏈語法)
// Vue3:childRef.value?.childMethod();(天然支持)

五、總結(jié)

父組件監(jiān)聽子組件掛載完成的核心流程:

  1. 子組件:在「掛載完成 + 初始化完成」時,通過 $emit/defineEmits 發(fā)送事件;
  2. 父組件:監(jiān)聽該事件,在回調(diào)中通過 $refs 安全操作子組件;
  3. 適配場景:
    • 簡單場景(無異步):子組件 mounted 中發(fā)事件;
    • 復雜場景(有異步):子組件異步邏輯結(jié)束后發(fā)事件;
    • Vue2 用 $emit,Vue3 setup 用 defineEmits + defineExpose

這種方式比 $nextTick 更可靠,因為它是子組件“主動通知”,能確保子組件完全就緒,不會出現(xiàn) undefined 報錯。

到此這篇關(guān)于Vue中父組件監(jiān)聽子組件掛載完成的操作過程的文章就介紹到這了,更多相關(guān)vue父組件監(jiān)聽子組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue實現(xiàn)旋轉(zhuǎn)木馬動畫

    vue實現(xiàn)旋轉(zhuǎn)木馬動畫

    這篇文章主要為大家詳細介紹了vue實現(xiàn)旋轉(zhuǎn)木馬動畫,圖片數(shù)量無限制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 在vscode中使用腳手架搭建vue項目

    在vscode中使用腳手架搭建vue項目

    這篇文章主要介紹了在vscode中使用腳手架搭建vue項目的相關(guān)資料,包括創(chuàng)建Vue2和Vue3項目,并展示了如何自定義項目配置,如選擇特性、路由模式、CSS預處理器和工具配置,通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • Vue事件中如何獲取原事件參數(shù)

    Vue事件中如何獲取原事件參數(shù)

    文章介紹了如何在Vue中通過Click方法獲取原事件的參數(shù),包括默認參數(shù)、自定義參數(shù)以及如何同時獲取原生事件和自定義參數(shù)的方法
    2024-12-12
  • vue中methods、mounted等的使用方法解析

    vue中methods、mounted等的使用方法解析

    這篇文章主要介紹了vue中methods、mounted等的使用方法解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 在Vue中使用HOC模式的實現(xiàn)

    在Vue中使用HOC模式的實現(xiàn)

    這篇文章主要介紹了在Vue中使用HOC模式的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Vue2中實現(xiàn)dialog的封裝方式

    Vue2中實現(xiàn)dialog的封裝方式

    這篇文章主要介紹了Vue2中實現(xiàn)dialog的封裝方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Vue 監(jiān)聽元素前后變化值實例

    Vue 監(jiān)聽元素前后變化值實例

    這篇文章主要介紹了Vue 監(jiān)聽元素前后變化值實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • vue中關(guān)閉eslint的方法分析

    vue中關(guān)閉eslint的方法分析

    這篇文章給大家講述了vue中關(guān)閉eslint的方法內(nèi)容,有需要的讀者們可以參考學習下。
    2018-08-08
  • 關(guān)于uniapp的高級表單組件mosowe-form

    關(guān)于uniapp的高級表單組件mosowe-form

    這篇文章主要介紹了關(guān)于uniapp的高級表單組件mosowe-form,由于一些表單標簽改來改去比較繁瑣,重復性很多,且樣式布局啥的幾乎萬變不離其中,為了偷懶,開發(fā)了mosowe-form及mosowe-table兩款高級組件,需要的朋友可以參考下
    2023-04-04
  • Vue?響應(yīng)式系統(tǒng)依賴收集過程原理解析

    Vue?響應(yīng)式系統(tǒng)依賴收集過程原理解析

    Vue 初始化時就會通過 Object.defineProperty 攔截屬性的 getter 和 setter ,為對象的每個值創(chuàng)建一個 dep 并用 Dep.addSub() 來存儲該屬性值的 watcher 列表,這篇文章主要介紹了Vue?響應(yīng)式系統(tǒng)依賴收集過程分析,需要的朋友可以參考下
    2022-06-06

最新評論

宁河县| 张北县| 萨迦县| 彭山县| 吉林市| 吉安县| 龙口市| 安达市| 桃江县| 商丘市| 缙云县| 湘潭市| 平果县| 龙口市| 河曲县| 陇西县| 丰宁| 星子县| 锡林浩特市| 晴隆县| 浪卡子县| 鄂温| 周口市| 罗山县| 班玛县| 乌兰县| 德昌县| 北宁市| 海南省| 兴隆县| 大田县| 瑞丽市| 内黄县| 开原市| 永宁县| 黑龙江省| 屏东市| 靖西县| 从江县| 班玛县| 汉沽区|