国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue3的宏到底是什么東西?

這篇具有很好參考價值的文章主要介紹了vue3的宏到底是什么東西?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

vue3開始vue引入了宏,比如defineProps、defineEmits等。我們每天寫vue代碼時都會使用到這些宏,但是你有沒有思考過vue中的宏到底是什么?為什么這些宏不需要手動從vueimport?為什么只能在setup頂層中使用這些宏?

vue 文件如何渲染到瀏覽器上

要回答上面的問題,我們先來了解一下從一個vue文件到渲染到瀏覽器這一過程經(jīng)歷了什么?

我們的vue代碼一般都是寫在后綴名為vue的文件上,顯然瀏覽器是不認(rèn)識vue文件的,瀏覽器只認(rèn)識html、css、jss等文件。所以第一步就是通過webpack或者vite將一個vue文件編譯為一個包含render函數(shù)的js文件。然后執(zhí)行render函數(shù)生成虛擬DOM,再調(diào)用瀏覽器的DOM API根據(jù)虛擬DOM生成真實(shí)DOM掛載到瀏覽器上。

vue3的宏到底是什么東西?

vue3的宏是什么?

我們先來看看vue官方的解釋:

宏是一種特殊的代碼,由編譯器處理并轉(zhuǎn)換為其他東西。它們實(shí)際上是一種更巧妙的字符串替換形式。

宏是在哪個階段運(yùn)行?

通過前面我們知道了vue 文件渲染到瀏覽器上主要經(jīng)歷了兩個階段。

第一階段是編譯時,也就是從一個vue文件經(jīng)過webpack或者vite編譯變成包含render函數(shù)的js文件。此時的運(yùn)行環(huán)境是nodejs環(huán)境,所以這個階段可以調(diào)用nodejs相關(guān)的api,但是沒有在瀏覽器環(huán)境內(nèi)執(zhí)行,所以不能調(diào)用瀏覽器的API。

第二階段是運(yùn)行時,此時瀏覽器會執(zhí)行js文件中的render函數(shù),然后依次生成虛擬DOM和真實(shí)DOM。此時的運(yùn)行環(huán)境是瀏覽器環(huán)境內(nèi),所以可以調(diào)用瀏覽器的API,但是在這一階段中是不能調(diào)用nodejs相關(guān)的api

而宏就是作用于編譯時,也就是從vue文件編譯為js文件這一過程。

舉個defineProps的例子:在編譯時defineProps宏就會被轉(zhuǎn)換為定義props相關(guān)的代碼,當(dāng)在瀏覽器運(yùn)行時自然也就沒有了defineProps宏相關(guān)的代碼了。所以才說宏是在編譯時執(zhí)行的代碼,而不是運(yùn)行時執(zhí)行的代碼。

一個defineProps宏的例子

我們來看一個實(shí)際的例子,下面這個是我們的源代碼:

<template>
  <div>content is {{ content }}</div>
  <div>title is {{ title }}</div>
</template>

<script setup lang="ts">
import {ref} from "vue"
const props = defineProps({
  content: String,
});
const title = ref("title")
</script>

在這個例子中我們使用defineProps宏定義了一個類型為String,屬性名為contentprops,并且在template中渲染content的內(nèi)容。

我們接下來再看看編譯成js文件后的代碼,代碼我已經(jīng)進(jìn)行過簡化:

import { defineComponent as _defineComponent } from "vue";
import { ref } from "vue";

const __sfc__ = _defineComponent({
  props: {
    content: String,
  },
  setup(__props) {
    const props = __props;
    const title = ref("title");
    const __returned__ = { props, title };
    return __returned__;
  },
});

import {
  toDisplayString as _toDisplayString,
  createElementVNode as _createElementVNode,
  Fragment as _Fragment,
  openBlock as _openBlock,
  createElementBlock as _createElementBlock,
} from "vue";

function render(_ctx, _cache, $props, $setup) {
  return (
    _openBlock(),
    _createElementBlock(
      _Fragment,
      null,
      [
        _createElementVNode(
          "div",
          null,
          "content is " + _toDisplayString($props.content),
          1 /* TEXT */
        ),
        _createElementVNode(
          "div",
          null,
          "title is " + _toDisplayString($setup.title),
          1 /* TEXT */
        ),
      ],
      64 /* STABLE_FRAGMENT */
    )
  );
}
__sfc__.render = render;
export default __sfc__;

我們可以看到編譯后的js文件主要由兩部分組成,第一部分為執(zhí)行defineComponent函數(shù)生成一個 __sfc__ 對象,第二部分為一個render函數(shù)。render函數(shù)不是我們這篇文章要講的,我們主要來看看這個__sfc__對象。

看到defineComponent是不是覺得很眼熟,沒錯這個就是vue提供的API中的 definecomponent函數(shù)。這個函數(shù)在運(yùn)行時沒有任何操作,僅用于提供類型推導(dǎo)。這個函數(shù)接收的第一個參數(shù)就是組件選項(xiàng)對象,返回值就是該組件本身。所以這個__sfc__對象就是我們的vue文件中的script代碼經(jīng)過編譯后生成的對象,后面再通過__sfc__.render = renderrender函數(shù)賦值到組件對象的render方法上面。

我們這里的組件選項(xiàng)對象經(jīng)過編譯后只有兩個了,分別是props屬性和setup方法。明顯可以發(fā)現(xiàn)我們原本在setup里面使用的defineProps宏相關(guān)的代碼不在了,并且多了一個props屬性。沒錯這個props屬性就是我們的defineProps宏生成的。

vue3的宏到底是什么東西?

我們再來看一個不在setup頂層調(diào)用defineProps的例子:

<script setup lang="ts">
import {ref} from "vue"
const title = ref("title")

if (title.value) {
  const props = defineProps({
    content: String,
  });
}
</script>

運(yùn)行這個例子會報(bào)錯:defineProps is not defined

我們來看看編譯后的js代碼:

import { defineComponent as _defineComponent } from "vue";
import { ref } from "vue";

const __sfc__ = _defineComponent({
  setup(__props) {
    const title = ref("title");
    if (title.value) {
      const props = defineProps({
        content: String,
      });
    }
    const __returned__ = { title };
    return __returned__;
  },
});

明顯可以看到由于我們沒有在setup的頂層調(diào)用defineProps宏,在編譯時就不會將defineProps宏替換為定義props相關(guān)的代碼,而是原封不動的輸出回來。在運(yùn)行時執(zhí)行到這行代碼后,由于我們沒有任何地方定義了defineProps函數(shù),所以就會報(bào)錯defineProps is not defined。

總結(jié)

現(xiàn)在我們能夠回答前面提的三個問題了。

  • vue中的宏到底是什么?

    vue3的宏是一種特殊的代碼,在編譯時會將這些特殊的代碼轉(zhuǎn)換為瀏覽器能夠直接運(yùn)行的指定代碼,根據(jù)宏的功能不同,轉(zhuǎn)換后的代碼也不同。

  • 為什么這些宏不需要手動從vueimport?

    因?yàn)樵诰幾g時已經(jīng)將這些宏替換為指定的瀏覽器能夠直接運(yùn)行的代碼,在運(yùn)行時已經(jīng)不存在這些宏相關(guān)的代碼,自然不需要從vueimport。

  • 為什么只能在setup頂層中使用這些宏?

    因?yàn)樵诰幾g時只會去處理setup頂層的宏,其他地方的宏會原封不動的輸出回來。在運(yùn)行時由于我們沒有在任何地方定義這些宏,當(dāng)代碼執(zhí)行到宏的時候當(dāng)然就會報(bào)錯。

如果想要在vue中使用更多的宏,可以使用 vue macros。這個庫是用于在vue中探索更多的宏和語法糖,作者是vue的團(tuán)隊(duì)成員 三咲智子 。

如果我的文章對你有點(diǎn)幫助,歡迎關(guān)注公眾號:【歐陽碼農(nóng)】,文章在公眾號首發(fā)。你的支持就是我創(chuàng)作的最大動力,感謝感謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-827045.html

到了這里,關(guān)于vue3的宏到底是什么東西?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 大白話講解數(shù)據(jù)庫的三級模式及二級映像(所謂的內(nèi)外模式在生活中到底是什么東西?)

    形象一點(diǎn)來說,把數(shù)據(jù)看做貨物,數(shù)據(jù)庫是倉庫,模式就是表格。 你有一個倉庫,倉庫里成千上萬的貨物,隨便你怎么堆,你堆個正方體,堆個圓柱體,甚至隨便亂堆都行,你怎么堆的叫內(nèi)模式。 完事你寫了一張表,表上對全部貨物按某個標(biāo)準(zhǔn)分類,而且標(biāo)清了啥貨物在哪

    2024年02月07日
    瀏覽(23)
  • 畢業(yè)設(shè)計(jì):Vue3+FastApi+Python+Neo4j實(shí)現(xiàn)主題知識圖譜網(wǎng)頁應(yīng)用——前言

    畢業(yè)設(shè)計(jì):Vue3+FastApi+Python+Neo4j實(shí)現(xiàn)主題知識圖譜網(wǎng)頁應(yīng)用——前言

    資源鏈接:https://download.csdn.net/download/m0_46573428/87796553 前言:畢業(yè)設(shè)計(jì):Vue3+FastApi+Python+Neo4j實(shí)現(xiàn)主題知識圖譜網(wǎng)頁應(yīng)用——前言_人工智能技術(shù)小白修煉手冊的博客-CSDN博客 首頁與導(dǎo)航:畢業(yè)設(shè)計(jì):Vue3+FastApi+Python+Neo4j實(shí)現(xiàn)主題知識圖譜網(wǎng)頁應(yīng)用——前端:首頁與導(dǎo)航欄_人工智

    2024年02月14日
    瀏覽(27)
  • 【從零開始拿捏數(shù)據(jù)結(jié)構(gòu)】 順序表是什么?它有什么樣的特性?結(jié)構(gòu)到底是什么樣的?

    【從零開始拿捏數(shù)據(jù)結(jié)構(gòu)】 順序表是什么?它有什么樣的特性?結(jié)構(gòu)到底是什么樣的?

    ?? 嶼小夏 : 個人主頁 ??個人專欄 : 數(shù)據(jù)結(jié)構(gòu)解析 ?? 莫道桑榆晚,為霞尚滿天! ? 什么是數(shù)據(jù)結(jié)構(gòu)?我們?yōu)槭裁匆獙W(xué)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)中的順序表長什么樣子?它是怎么運(yùn)用? ? 本期我們將對這些一一講解,徹底明白數(shù)據(jù)結(jié)構(gòu)的重要性,以及順序表是一種什么的數(shù)據(jù)

    2024年02月08日
    瀏覽(26)
  • uniapp引入全局js,vue2/vue3不同方式引入

    uniapp引入全局js,vue2/vue3不同方式引入

    Hi I’m Shendi uniapp引入全局js,vue2/vue3不同方式引入 最近寫小程序,個人開發(fā),選用了 uni-app 進(jìn)行開發(fā) 選用的 vue3 版本 因?yàn)槲矣玫?vue3 版本,在這里踩了沒學(xué)過vue3的坑,用vue2引入全局js的方式使用,導(dǎo)致undefined… Vue2 版引入全局js的方法如下 將js放到項(xiàng)目內(nèi),一般放到自建的

    2024年02月03日
    瀏覽(27)
  • vue3引入router

    vue3引入router

    ? ? ? ? 進(jìn)入項(xiàng)目路徑的cmd下,執(zhí)行命令 ????????npm install vue-router@4 ? ? ? ? 或者yarn add vue-router@4 ? ? ? ? 推薦使用yarn命令,比npm安裝更快 ???????? ????????其中 path是訪問路徑,name時路由名稱,component: () = import(\\\'@/pages/home\\\')是對應(yīng)vue組件所在目錄。 ???????

    2023年04月08日
    瀏覽(14)
  • vue3 h5進(jìn)入頁面后自動滾動到底部

    背景: 在做h5項(xiàng)目中的聊天頁面時,需求是進(jìn)入頁面自動滾到底部,方便用戶看到最新消息(因?yàn)橄⑹钦蚺帕械?,最新消息自然展示在底部)??直接上代碼: 主要代碼:

    2024年02月16日
    瀏覽(20)
  • Vue3 —— 在vue中動態(tài)引入組件以及動態(tài)引入js的方法

    Vue3 —— 在vue中動態(tài)引入組件以及動態(tài)引入js的方法

    文章目錄 一 、 動態(tài)引入組件 1. 具體寫法 二、 動態(tài)引入js文件 1. 具體寫法 總結(jié) 定義一個異步組件,它在運(yùn)行時是懶加載的。參數(shù)可以是一個異步加載函數(shù),或是對加載行為進(jìn)行更具體定制的一個選項(xiàng)對象。 在大型項(xiàng)目中,我們可能需要拆分應(yīng)用為更小的塊,并僅在需要時

    2024年02月12日
    瀏覽(29)
  • Vue3中引入scss

    Vue3中引入scss

    2024年02月11日
    瀏覽(17)
  • Cesium引入vite + vue3

    Cesium引入vite + vue3

    卸載命令 使用 vite.config.js 組件使用 加載高德地圖 高德地圖的加載方便很多,并不需要申請key,可以直接加載到我們的Cesium中。 加載ArcGISMap地圖

    2024年02月14日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包