精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

徹底搞清楚Vue3的DefineExpose宏是如何暴露方法給父組件使用

開發 前端
在瀏覽器中點擊父組件的button按鈕,可以看到控制臺中打印的是undefined,并且子組件內的validate方法也沒有執行。因為子組件使用了setup,默認是不會暴露setup中定義的屬性和方法。

前言

眾所周知,當子組件使用setup后,父組件就不能像vue2那樣直接就可以訪問子組件內的屬性和方法。這個時候就需要在子組件內使用defineExpose宏函數來指定想要暴露出去的屬性和方法。這篇文章來講講defineExpose宏函數是如何暴露出去這些屬性和方法給父組件使用。注:本文中使用的vue版本為3.4.19。

看個demo

父組件index.vue的代碼如下:

<template>
  <ChildDemo ref="child" />
  <button @click="handleClick">調用子組件的validate方法</button>
</template>

<script setup lang="ts">
import ChildDemo from "./child.vue";
import { ref } from "vue";

const child = ref();

function handleClick() {
  console.log(child.value.validate);
  child.value.validate?.();
}
</script>

上面的代碼很簡單,通過ref拿到子組件的實例賦值給child變量。然后在按鈕的click事件中打印出子組件的validate方法和執行validate方法。

再來看看子組件child.vue不使用defineExpose宏的例子,代碼如下:

<template></template>

<script setup>
function validate() {
  console.log("執行子組件validate方法");
}
</script>

在瀏覽器中點擊父組件的button按鈕,可以看到控制臺中打印的是undefined,并且子組件內的validate方法也沒有執行。因為子組件使用了setup,默認是不會暴露setup中定義的屬性和方法。如下圖:

圖片圖片

我們再來看看子組件child.vue使用defineExpose宏的例子,代碼如下:

<template></template>

<script setup>
function validate() {
  console.log("執行子組件validate方法");
}

defineExpose({
  validate,
});
</script>

在瀏覽器中點擊父組件的button按鈕,可以看到控制臺中打印的不再是undefined,子組件內的validate方法也執行了。如下圖:

圖片圖片

編譯后的代碼

首先需要在瀏覽器中找到編譯后的使用defineExpose宏的child.vue文件,在network面板中找到child.vue,然后右鍵點擊Open in Sources panel就可以在source面板中找到編譯后的child.vue。如下圖:

圖片圖片

為了要在瀏覽器中debug,我們還需要在設置中關閉瀏覽器的javascript source map,如下圖:

圖片圖片

現在我們來看看編譯后的child.vue文件,代碼如下:

const _sfc_main = {
  __name: "child",
  setup(__props, { expose: __expose }) {
    function validate() {
      console.log("執行子組件validate方法");
    }
    __expose({
      validate,
    });
    const __returned__ = { validate };
    return __returned__;
  },
};

function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
  return null;
}
_sfc_main.render = _sfc_render;
export default _sfc_main;

從上面可以看到_sfc_main對象中的setup對應的就是我們源代碼<script setup>中的內容,并且defineExpose宏函數也不在了,變成了一個__expose方法(defineExpose宏函數如何編譯成__expose方法我們會在下一篇文章講)。如下圖:

圖片圖片

expose方法

給__expose方法打個斷點,刷新頁面此時斷點停留在__expose方法上面。點擊step into進入到__expose方法內部,如下圖:

圖片圖片

進入到__expose方法內部,我們發現__expose方法是在一個createSetupContext函數中定義的。在我們這個場景中createSetupContext函數簡化后的代碼如下:

function createSetupContext(instance) {
  const expose = (exposed) => {
    instance.exposed = exposed || {};
  };

  return Object.freeze({
    // ...省略
    expose,
  });
}

我們先來看看函數中的instance變量,我想你通過名字應該已經猜到了他就是當前vue實例對象。如下圖:

圖片圖片

在vue實例對象中有我們熟悉的data方法、directives和componens屬性等。

在expose函數內部做的事情也很簡單,將子組件需要暴露的屬性或者方法組成的對象賦值給vue實例上的exposed屬性。

父組件訪問子組件的validate方法

在vue3中想要訪問子組件需要使用特殊的 ref attribute,在我們這個例子中就是使用<ChildDemo ref="child" />。這樣使用后就可以使用child變量訪問子組件,其實在這里child變量的值就是一個名為getExposeProxy函數的返回值(后面的文章中會去詳細講解ref attribute是如何訪問子組件)。

getExposeProxy函數的代碼如下:

function getExposeProxy(instance) {
  if (instance.exposed) {
    return (
      instance.exposeProxy ||
      (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {
        get(target, key) {
          if (key in target) {
            return target[key];
          } else if (key in publicPropertiesMap) {
            return publicPropertiesMap[key](instance);
          }
        },
        has(target, key) {
          // ...省略
        },
      }))
    );
  }
}

前面我們講過了defineExpose宏函數中定義了想要暴露出來的屬性和方法,經過編譯后defineExpose宏函數變成了__expose方法。執行__expose方法后會將子組件想要暴露的屬性或者方法組成的對象賦值給vue實例上的exposed屬性,也就是instance.exposed。

在上面的getExposeProxy函數中就是返回了instance.exposed的Proxy對象,當我們使用child.value.validate訪問子組件的validate方法,其實就是訪問的是instance.exposed對象中的validate方法,而instance.exposed中的validate方法就是defineExpose宏函數暴露的validate方法。如下圖:

圖片圖片

總結

父組件想要訪問子組件暴露的validate方法主要分為下面四步:

  • 子組件使用defineExpose宏函數聲明想要暴露validate方法。
  • defineExpose宏函數經過編譯后變成__expose方法。
  • 執行__expose方法將子組件需要暴露的屬性或者方法組成的對象賦值給子組件vue實例上的exposed屬性,也就是instance.exposed。
  • 父組件使用ref訪問子組件的validate方法,也就是訪問child.value.validate。其實訪問的就是上一步的instance.exposed.validate方法,最終訪問的就是defineExpose宏函數中暴露的validate方法。

點擊下方卡片關注我,給自己一個進階vue的機會。

責任編輯:武曉燕 來源: 前端歐陽
相關推薦

2011-06-22 09:37:03

桌面虛擬化存儲

2020-11-16 08:37:16

MariaDB性能優化

2020-12-16 11:09:27

JavaScript語言開發

2024-08-13 09:26:07

2020-12-31 07:57:25

JVM操作代碼

2018-07-19 10:16:25

華光昱能

2021-09-01 09:32:40

工具

2020-04-11 11:21:22

留存分析模型分析

2018-06-26 14:42:10

StringJava數據

2017-08-15 08:27:48

云備份問題恢復

2025-04-25 11:30:00

vector編程C++

2015-10-12 10:01:26

AndroidWindows應用Windows 10

2018-06-20 10:43:58

云端霧端霧計算

2021-01-19 06:43:10

Netty框架網絡技術

2011-03-07 17:44:59

中小企業實施虛擬化

2022-08-08 08:48:15

Go版本偽版本

2022-11-16 14:02:44

2019-07-26 15:49:25

代碼開發工具

2020-04-28 17:26:04

監督學習無監督學習機器學習

2023-02-17 14:40:08

MySQLSQL優化
點贊
收藏

51CTO技術棧公眾號

www.热久久| 婷婷国产成人精品视频| 日本在线高清| 国产欧美日韩精品a在线观看| 国产成人亚洲综合| 国产又粗又猛又爽又黄的视频小说| 国产一区二区视频在线看| 亚洲午夜精品网| 日韩久久久久久久久久久久久| 国产伦精品一区二区三区视频痴汉| 欧美涩涩网站| 亚洲一区999| 97免费公开视频| 制服丝袜专区在线| 亚洲婷婷国产精品电影人久久| av一本久道久久波多野结衣| 黄色片视频免费| 一区二区三区午夜视频| 日韩av在线网页| 黄色aaaaaa| 午夜av成人| 性欧美疯狂xxxxbbbb| 中文字幕在线亚洲三区| 五月婷婷伊人网| 国产精品白丝av| 国产精品黄页免费高清在线观看| 国产无遮挡又黄又爽| 久久性感美女视频| 亚洲色图国产精品| 丰满岳乱妇一区二区| 日韩深夜福利网站| 欧美性一级生活| 日韩av一二三四区| 牛牛精品在线| 国产精品理伦片| 日韩和欧美的一区二区| 婷婷色在线视频| 国产成人鲁色资源国产91色综| 国产精品劲爆视频| 一级黄色在线视频| 一区二区三区成人精品| 久久精品一区二区三区av| 亚洲最大成人免费视频| 中文字幕第一页在线播放| 久久国产精品久久w女人spa| 久久青草福利网站| 国产av无码专区亚洲av毛网站| 精品欧美久久| 亚洲欧美在线x视频| yy1111111| 噜噜噜天天躁狠狠躁夜夜精品| 日韩精品中午字幕| 男女激情免费视频| caoporm免费视频在线| 日韩一区欧美小说| 在线视频不卡国产| 日本免费视频在线观看| 国产精品美女久久久久久久| 亚洲精品一品区二品区三品区 | 少妇淫片在线影院| 午夜精品福利在线| av天堂永久资源网| 综合另类专区| 色视频成人在线观看免| 日韩无套无码精品| 91福利精品在线观看| 欧美三级蜜桃2在线观看| 粉色视频免费看| 亚洲欧美一级| 欧美大片一区二区| 亚洲精品激情视频| 日韩av午夜| 亚洲新声在线观看| 欧美xxxooo| 亚洲欧美一级二级三级| 午夜精品久久久久久久久久久久久 | 欧美一区二区三区爽大粗免费 | 国产精品高潮呻吟久久av黑人| 中文字幕 视频一区| 国产在线观看一区二区| 国产精品swag| 精品电影在线| 亚洲欧美怡红院| 农民人伦一区二区三区| 美女日韩欧美| 91精品免费在线| 一边摸一边做爽的视频17国产 | 日韩中文字幕在线不卡| 九色porny视频在线观看| 欧美吞精做爰啪啪高潮| 国产又粗又猛又爽又黄| 香蕉视频一区二区三区| 日韩中文字幕av| 久久久91视频| 久久午夜视频| 18成人在线| 伦理片一区二区三区| 麻豆高清免费国产一区| av一区观看| 成人在线观看免费| 亚洲一二三级电影| 亚洲综合欧美激情| 韩国女主播一区二区三区| 一区二区成人av| 久久久美女视频| 日本午夜一本久久久综合| 亚洲最大的免费| 极品白浆推特女神在线观看 | 亚洲欧美制服丝袜| 日本黄色片免费观看| 国产精品五区| 99porn视频在线| 97电影在线| 精品久久久久久久久久| 免费看的av网站| 黑人精品无码一区二区三区AV| 欧美视频在线观看网站 | 欧美日韩一区二区视频在线| 久久一区二区三区欧美亚洲| 精品国产一级片| 国产亚洲精品aa| 18禁裸男晨勃露j毛免费观看| 欧美色片在线观看| 日韩电影免费观看在线观看| 在线观看成人毛片| 久久精品国产久精国产| 欧美一区二区三区电影在线观看 | 久久视频这里只有精品| 老熟妇仑乱一区二区av| 成人国产精品视频| 99久久久精品视频| 色综合一区二区日本韩国亚洲| 亚洲精品午夜精品| 国产污片在线观看| 国产激情一区二区三区四区| 亚洲资源在线网| 亚洲成人av观看| 亚洲深夜福利在线| 欧美日韩综合一区二区三区| 99国产欧美另类久久久精品| 日韩一级免费看| 国产精品一区二区精品| 久久精品国产欧美激情| 亚洲综合网av| 国产精品免费视频观看| 亚洲第一狼人区| 日韩激情免费| 国产精品女主播视频| 懂色一区二区三区| 欧美自拍丝袜亚洲| 老熟妇一区二区| 秋霞午夜鲁丝一区二区老狼| 日韩精品一区二区三区四区五区| 成人视屏在线观看| 在线中文字幕日韩| 中文字幕av网站| 国产精品久久久久久久浪潮网站| 男人搞女人网站| 日韩精品看片| 91系列在线播放| 免费不卡av| 亚洲国产成人爱av在线播放| 好吊妞视频一区二区三区| 91视频免费观看| 久久久国产欧美| 久久精品国内一区二区三区水蜜桃| 91欧美视频网站| 日本资源在线| 亚洲精品国产拍免费91在线| 国产欧美一区二区三区在线看蜜臂| 久久人人超碰精品| 亚洲精品手机在线观看| 女人色偷偷aa久久天堂| 99在线视频播放| 国产精品13p| 亚洲一区二区久久久| 亚洲图片视频小说| 一区二区三区欧美久久| 日韩免费高清一区二区| 日韩精品欧美精品| 日本在线视频www色| 牛牛精品成人免费视频| 国产ts人妖一区二区三区 | 欧美国产97人人爽人人喊| 97超碰成人在线| 一区在线播放| 午夜老司机精品| 亚洲超碰在线观看| 国产成人亚洲综合91| 在线你懂的视频| 亚洲欧洲日产国产网站| 国产丰满美女做爰| 色综合久久天天综合网| 精品人妻伦九区久久aaa片| caoporn国产精品| 日韩高清第一页| 亚洲神马久久| 成人高清dvd| 精品免费在线| 国严精品久久久久久亚洲影视| 日韩制服诱惑| 97久久精品视频| 成人免费看片| 国产亚洲精品va在线观看| 国产高清第一页| 欧美在线观看一区二区| 久久视频免费在线观看| 成人免费在线播放视频| 手机av免费看| 成人综合婷婷国产精品久久蜜臀 | 秋霞在线一区二区| 亚洲+变态+欧美+另类+精品| 91pron在线| 国产激情久久| 日韩av电影在线网| av手机免费在线观看| 久久成人亚洲精品| 在线播放麻豆| 亚洲性69xxxbbb| 你懂的在线观看视频网站| 日韩精品中文字幕一区二区三区| 国产精品自拍第一页| 精品美女国产在线| 久久久一二三区| 亚洲另类春色国产| 免费观看特级毛片| 中文字幕精品三区| 欧美多人猛交狂配| 91丨九色丨尤物| 亚洲天堂2024| caoporn国产精品| 精品人妻一区二区免费| 国产成人在线影院| 91精品视频国产| 国产在线观看免费一区| 亚洲18在线看污www麻豆| 美腿丝袜亚洲三区| 日本在线一二三区| 蜜臀久久99精品久久久久久9| 成人三级视频在线播放| 亚洲免费在线| aa在线免费观看| 先锋亚洲精品| 久久婷婷国产精品| 久久不射中文字幕| 国产无套内射久久久国产| 免费永久网站黄欧美| 欧美日韩中文在线视频| 亚洲一区国产| 欧美日韩一区二区在线免费观看| 久久五月激情| 蜜臀av免费观看| 麻豆中文一区二区| 欧美激情第一区| 国产成人日日夜夜| 亚洲熟女一区二区| 91麻豆精品一区二区三区| 国产熟妇搡bbbb搡bbbb| 久久久国产精品不卡| 日本一卡二卡在线播放| 国产精品久久久久久久久免费樱桃 | 色99之美女主播在线视频| 欧美一区二区三区| 欧美老女人xx| 2020av在线| 国产mv久久久| 中文成人在线| 国产精品区一区| 伊甸园亚洲一区| 一区不卡字幕| 午夜久久福利| www.中文字幕在线| 喷水一区二区三区| www.偷拍.com| 91网站在线播放| 91视频免费看片| 亚洲最快最全在线视频| 成人午夜淫片100集| 欧美色图在线观看| 亚洲av综合色区无码一二三区| 亚洲国产美女久久久久| av在线播放免费| 色综合老司机第九色激情| 日本а中文在线天堂| 成人a在线观看| 久久成人福利| 一区一区视频| 在线国产日韩| 手机看片一级片| 成人毛片视频在线观看| 亚洲av毛片基地| 亚洲一区在线免费观看| 波多野结衣 久久| 日韩一区二区电影| 好男人免费精品视频| 欧美久久久精品| 欧洲一级精品| 国产精品国色综合久久| 成人3d动漫在线观看| 桥本有菜av在线| 毛片一区二区| 青娱乐国产精品视频| 久久精品欧美日韩精品 | 欧美日韩在线免费| 国产熟女一区二区三区四区| 亚洲男人天堂视频| 国产天堂在线播放视频| 成人黄色生活片| 视频一区在线观看| cao在线观看| 国产综合一区二区| 国产成人一区二区在线观看| 亚洲18女电影在线观看| 99久久免费国产精精品| 一区二区三区国产视频| 中文在线免费视频| 国产精品免费一区二区三区在线观看 | 无码黑人精品一区二区| 日本丶国产丶欧美色综合| 狠狠综合久久av一区二区| 久久综合免费视频| 精品美女一区| 日韩欧美在线观看强乱免费| 一区二区三区四区五区精品视频| 手机在线观看日韩av| 亚洲欧洲日本在线| 中文字幕日韩国产| 亚洲欧美日韩中文视频| 日本在线播放一二三区| 国内精品久久国产| 亚洲国产日本| av漫画在线观看| 一区二区三区在线观看视频| 国产精品久久久久久免费免熟| 中文字幕av一区二区| 精品亚洲美女网站| 日韩欧美亚洲精品| 日韩精品亚洲一区| 成人小视频免费看| 欧美色综合久久| 亚洲图片88| 国产一区私人高清影院| 99久久精品费精品国产| 天天干天天爽天天射| 国产精品久久网站| 一级黄色片免费看| 日韩中文字幕免费| 久久久久九九精品影院| 91大学生片黄在线观看| 国产白丝精品91爽爽久久| 精品视频在线观看免费| 亚洲精品一区二区三区影院| 丁香花视频在线观看| 国产日韩欧美一区二区| 国产一区二区三区的电影| 成人免费网站黄| 在线免费观看不卡av| av网站无病毒在线| 91人成网站www| 国产精品porn| av无码一区二区三区| 欧美性猛交xxxx免费看漫画| 国产一级在线| 国产欧美一区二区三区在线看| 婷婷精品进入| 性高潮免费视频| 色综合久久综合中文综合网| 夜级特黄日本大片_在线| 亚洲一区制服诱惑| 亚洲精品一级| 中文字幕人妻一区二区三区在线视频| 欧美视频在线一区二区三区| 九色porny在线| 国产成人精品日本亚洲11| 国产免费成人| 国产一二三av| 欧美成人官网二区| 国偷自产一区二区免费视频| 亚洲国产一区二区精品视频 | 国产午夜在线观看| 成人精品久久一区二区三区| 亚洲午夜精品久久久久久app| 亚洲色图14p| 欧美日本韩国一区| av资源在线看片| 四虎一区二区| 国产成人丝袜美腿| 亚洲精品一区二区二区| 欧美理论片在线观看| 久久不见久久见中文字幕免费| 欧美成人福利在线观看| 亚洲成年人影院| 永久免费在线观看视频| 国产伦精品一区二区三毛| 日本视频一区二区| www.youjizz.com亚洲| 一区二区三区视频免费| 看亚洲a级一级毛片| 国产视频一区在线| 噜噜噜在线视频|