日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-05-28 09:07:05 234觀看
導讀前言眾所周知,當子組件使用setup后,父組件就不能像vue2那樣直接就可以訪問子組件內的屬性和方法。這個時候就需要在子組件內使用defineExpose宏函數來指定想要暴露出去的屬性和方法。這篇文章來講講defineExpose宏函數

前言

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

看個demo

父組件index.vue的代碼如下:pLI28資訊網——每日最新資訊28at.com

<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方法。pLI28資訊網——每日最新資訊28at.com

再來看看子組件child.vue不使用defineExpose宏的例子,代碼如下:pLI28資訊網——每日最新資訊28at.com

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

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

圖片圖片pLI28資訊網——每日最新資訊28at.com

我們再來看看子組件child.vue使用defineExpose宏的例子,代碼如下:pLI28資訊網——每日最新資訊28at.com

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

在瀏覽器中點擊父組件的button按鈕,可以看到控制臺中打印的不再是undefined,子組件內的validate方法也執行了。如下圖:pLI28資訊網——每日最新資訊28at.com

圖片圖片pLI28資訊網——每日最新資訊28at.com

編譯后的代碼

首先需要在瀏覽器中找到編譯后的使用defineExpose宏的child.vue文件,在network面板中找到child.vue,然后右鍵點擊Open in Sources panel就可以在source面板中找到編譯后的child.vue。如下圖:pLI28資訊網——每日最新資訊28at.com

圖片圖片pLI28資訊網——每日最新資訊28at.com

為了要在瀏覽器中debug,我們還需要在設置中關閉瀏覽器的javascript source map,如下圖:pLI28資訊網——每日最新資訊28at.com

圖片圖片pLI28資訊網——每日最新資訊28at.com

現在我們來看看編譯后的child.vue文件,代碼如下:pLI28資訊網——每日最新資訊28at.com

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方法我們會在下一篇文章講)。如下圖:pLI28資訊網——每日最新資訊28at.com

圖片圖片pLI28資訊網——每日最新資訊28at.com

expose方法

給__expose方法打個斷點,刷新頁面此時斷點停留在__expose方法上面。點擊step into進入到__expose方法內部,如下圖:pLI28資訊網——每日最新資訊28at.com

圖片圖片pLI28資訊網——每日最新資訊28at.com

進入到__expose方法內部,我們發現__expose方法是在一個createSetupContext函數中定義的。在我們這個場景中createSetupContext函數簡化后的代碼如下:pLI28資訊網——每日最新資訊28at.com

function createSetupContext(instance) {  const expose = (exposed) => {    instance.exposed = exposed || {};  };  return Object.freeze({    // ...省略    expose,  });}

我們先來看看函數中的instance變量,我想你通過名字應該已經猜到了他就是當前vue實例對象。如下圖:pLI28資訊網——每日最新資訊28at.com

圖片圖片pLI28資訊網——每日最新資訊28at.com

在vue實例對象中有我們熟悉的data方法、directives和componens屬性等。pLI28資訊網——每日最新資訊28at.com

在expose函數內部做的事情也很簡單,將子組件需要暴露的屬性或者方法組成的對象賦值給vue實例上的exposed屬性。pLI28資訊網——每日最新資訊28at.com

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

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

getExposeProxy函數的代碼如下:pLI28資訊網——每日最新資訊28at.com

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。pLI28資訊網——每日最新資訊28at.com

在上面的getExposeProxy函數中就是返回了instance.exposed的Proxy對象,當我們使用child.value.validate訪問子組件的validate方法,其實就是訪問的是instance.exposed對象中的validate方法,而instance.exposed中的validate方法就是defineExpose宏函數暴露的validate方法。如下圖:pLI28資訊網——每日最新資訊28at.com

圖片圖片pLI28資訊網——每日最新資訊28at.com

總結

父組件想要訪問子組件暴露的validate方法主要分為下面四步:pLI28資訊網——每日最新資訊28at.com

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

點擊下方卡片關注我,給自己一個進階vue的機會。pLI28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-91161-0.html徹底搞清楚Vue3的DefineExpose宏是如何暴露方法給父組件使用

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 從基礎概念到進階思考,完整的遞歸思維學習

下一篇: Python 操作系統交互的 15 個實用命令

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久综合色一综合色88| 亚洲性色视频| 樱桃视频在线观看一区| 亚洲电影免费观看高清完整版| 亚洲第一二三四五区| 亚洲理伦电影| 亚洲——在线| 久久久久久噜噜噜久久久精品| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美激情导航| 国产精品女人毛片| 亚洲国产精品尤物yw在线观看| 亚洲视频axxx| 久久久亚洲综合| 欧美日韩爆操| 国产亚洲成av人片在线观看桃| 亚洲经典视频在线观看| 亚洲一区二区毛片| 免费av成人在线| 国产精品欧美一区喷水| 在线成人欧美| 亚洲欧美春色| 免费日韩一区二区| 国产精品综合色区在线观看| 亚洲国产婷婷香蕉久久久久久99| 亚洲一级免费视频| 美女黄色成人网| 亚洲午夜视频| 欧美一区2区视频在线观看| 美女视频黄 久久| 国产精品久久久久久亚洲毛片 | 久久中文字幕一区| 国产精品国产三级欧美二区| 亚洲第一成人在线| 亚洲欧美日韩爽爽影院| 欧美福利电影网| 国产亚洲欧洲| 亚洲一区久久久| 欧美成人精品在线播放| 国产亚洲欧洲997久久综合| 亚洲乱码国产乱码精品精| 久久久精品一区| 国产精品嫩草久久久久| 99re热这里只有精品免费视频| 久久蜜桃资源一区二区老牛 | 久久精品在线观看| 国产精品久久久久久亚洲调教 | 亚洲国产精品久久久久久女王| 欧美一区二区三区免费观看 | 在线日韩电影| 久久国产直播| 国产精品网红福利| 亚洲图片欧洲图片日韩av| 欧美激情第1页| 亚洲第一毛片| 久久久激情视频| 国产亚洲精品资源在线26u| 亚洲在线一区| 国产精品videosex极品| 日韩亚洲精品电影| 欧美黄色aa电影| 亚洲电影在线看| 老司机免费视频一区二区| 好看的日韩视频| 久久精品1区| 国产婷婷色一区二区三区在线| 亚洲午夜av| 欧美午夜精品伦理| 一区二区三区精品久久久| 欧美日韩国产91| 亚洲免费精品| 欧美精品一区视频| 日韩天堂在线观看| 欧美日韩岛国| 99天天综合性| 欧美午夜电影在线| 亚洲一区成人| 国产精品久久久久久久久免费樱桃| 一二三区精品福利视频| 欧美日韩在线观看一区二区三区| 一区二区免费在线播放| 欧美三级日本三级少妇99| 一本色道久久综合狠狠躁篇怎么玩 | 在线观看精品| 久久这里有精品视频| 伊人久久大香线| 美女网站在线免费欧美精品| 亚洲国产另类精品专区| 欧美丰满高潮xxxx喷水动漫| 亚洲日本中文字幕区| 欧美日韩1区2区| 中文国产成人精品久久一| 国产精品高潮呻吟久久av无限 | 亚洲乱码日产精品bd| 欧美日韩视频在线一区二区| 亚洲午夜日本在线观看| 国产精品永久免费| 欧美影院在线| 激情综合色综合久久综合| 免费一级欧美片在线播放| 亚洲精品日日夜夜| 欧美偷拍另类| 中文日韩在线视频| 久久久精彩视频| 亚洲国产天堂网精品网站| 欧美久久九九| 亚洲一区二区成人| 国产亚洲欧美中文| 老司机精品久久| av成人免费在线| 国产人成一区二区三区影院| 久久综合国产精品| 99视频热这里只有精品免费| 国产精品亚洲片夜色在线| 久久精品99国产精品酒店日本| 在线播放日韩专区| 欧美日韩国产bt| 亚洲男人的天堂在线aⅴ视频| 国产在线观看91精品一区| 欧美电影免费观看高清| 亚洲一区二区在线免费观看视频 | 国产午夜一区二区三区| 玖玖在线精品| 亚洲深夜福利视频| 国语自产精品视频在线看抢先版结局| 裸体丰满少妇做受久久99精品| 99国产精品自拍| 国产性猛交xxxx免费看久久| 欧美国产日本在线| 亚洲欧美日韩精品久久| 亚洲国产成人av在线| 国产精品久久九九| 久久香蕉国产线看观看网| 99精品视频免费观看| 国产欧美日韩一区二区三区在线| 六月天综合网| 亚洲欧美日韩网| 亚洲人成人77777线观看| 国产精品综合视频| 欧美精品在线免费| 久久av一区二区三区漫画| 亚洲狼人综合| 国内精品免费在线观看| 欧美国产日产韩国视频| 欧美一区午夜精品| 日韩一区二区久久| 原创国产精品91| 国产美女精品| 欧美日韩ab片| 欧美3dxxxxhd| 久久精品国产综合| 亚洲永久字幕| 日韩一级黄色大片| 精品成人在线观看| 国产精品免费久久久久久| 欧美电影在线观看| 久久激情视频久久| 亚洲一区二区三区免费观看| 亚洲激情小视频| 国产主播一区二区| 国产精品区一区二区三| 欧美激情精品久久久久久| 久久精品成人一区二区三区蜜臀 | 黄色成人小视频| 国产精品免费看片| 欧美日韩xxxxx| 你懂的视频欧美| 久久人人爽人人爽| 久久国产精品99国产精| 亚洲一区二区三区四区视频| 亚洲日本无吗高清不卡| 揄拍成人国产精品视频| 国外成人在线视频| 国产精品久久久久久久久免费樱桃| 欧美区一区二| 欧美黄色日本| 欧美电影电视剧在线观看| 久久综合一区| 久久精品成人欧美大片古装| 亚洲欧美中文另类| 亚洲你懂的在线视频| 亚洲视频免费| 一区二区高清视频| 日韩系列欧美系列| 日韩天堂在线视频| 亚洲国产精品va在线观看黑人| 黄色欧美日韩| 黄色欧美成人| 狠狠色综合日日| 黄色精品免费| 影音先锋亚洲精品| 精品成人一区| 一区二区在线不卡| 黄色影院成人| 黄色精品网站| 韩国精品久久久999| 国产一区亚洲| 狠狠综合久久av一区二区老牛| 国产在线精品自拍| 国产一区在线播放| 亚洲成色www8888| 在线日韩成人| 亚洲精品乱码| 中文精品一区二区三区|