學Vue,就要學會vue JSX(二)

来源:https://www.cnblogs.com/coderhf/archive/2020/07/07/13261120.html
-Advertisement-
Play Games

學習JSX,先瞭解一下createElement 提到JSX,不可避免的就要提到createElement,當你看完本節,你會發現,奇怪的知識又增多了。ok,我們接著上一部分繼續講。這一次的準備工作是瞭解createElement。 從Vue編譯後的代碼看createElement 你是否看過寫的V ...


學習JSX,先瞭解一下createElement

提到JSX,不可避免的就要提到createElement,當你看完本節,你會發現,奇怪的知識又增多了。ok,我們接著上一部分繼續講。這一次的準備工作是瞭解createElement。

Vue編譯後的代碼看createElement

你是否看過寫的Vue代碼經過編譯之後的樣子,比如下麵這段代碼

 <template>
   <div>我喜歡<span class="emphasize">前端</span></div>
 </template>

小編對這段代碼進行編譯之後,得到下麵這段代碼

 function () {
   var e = this,
   // e._self._c 對應源碼裡面的createElement
   t = e._self._c;
   // 返回了一個 createElement('div',[])
   return t("div", [
     // e._v 對應源碼裡面的createTextVNode
     e._v("my"),
     t("span", { staticClass: "emphasize" }, [e._v("前端")]),
   ]);
 }

 

通過對上面的代碼進行分析,不難發現,Vue模板中的每一個元素編譯之後都會對應一個createElement,那麼這個createElement到底是什麼,嗯,這個你面試的時候也許已經提到過了。

那麼什麼是createElement

無論是Vue還是React,都存在createElement,而且作用基本一致。可能你對createElement不是很瞭解,函數名翻譯過來就是增加一個元素,但他的返回值你一定知道。createElement函數返回的值稱之為虛擬節點,即VNode,而由VNode扎堆組成的樹便是大名鼎鼎,面試必問的虛擬DOM

createElement函數的參數,在這裡小編偷個懶抄一下Vue官方文檔

 // @returns {VNode}
 createElement(
   // {String | Object | Function}
   // 一個 HTML 標簽名、組件選項對象,或者
   // resolve 了上述任何一種的一個 async 函數。必填項。
   'div',
 ​
   // {Object}
   // 一個與模板中 attribute 對應的數據對象。可選。
   {
     // (詳情見下一節)
   },
 ​
   // {String | Array}
   // 子級虛擬節點 (VNodes),由 `createElement()` 構建而成,
   // 也可以使用字元串來生成“文本虛擬節點”。可選。
   [
     '先寫一些文字',
     createElement('h1', '一則頭條'),
     createElement(MyComponent, {
       props: {
         someProp: 'foobar'
       }
     })
   ]
 )

 

從上面可以看出createElement一共有三個參數,三個參數分別是

  • 第一個參數是需要渲染的組件,可以是組件的標簽,比如div;或者是一個組件對象,也就是你天天寫的export default {};亦或者可以是一個非同步函數。

  • 第二個參數是這個組件的屬性,是一個對象,如果組件沒有參數,可以傳null(關於組件的屬性,下文將依次介紹)

  • 第三個參數是這個組件的子組件,可以是一個字元串(textContent)或者一個由VNodes組成的數組

createElement寫一個組件吧

表單示例

假設我們需要開發一個下麵這樣的表格(element-ui的)

img

用模板代碼去開發

如果我們用模板代碼去開發這個表單,那麼代碼大概就長這樣

 <el-form :inline="true" :model="formInline" class="demo-form-inline">
   <el-form-item label="審批人">
     <el-input v-model="formInline.user" placeholder="審批人"></el-input>
   </el-form-item>
   <el-form-item label="活動區域">
     <el-select v-model="formInline.region" placeholder="活動區域">
       <el-option label="區域一" value="shanghai"></el-option>
       <el-option label="區域二" value="beijing"></el-option>
     </el-select>
   </el-form-item>
   <el-form-item>
     <el-button type="primary" @click="onSubmit">查詢</el-button>
   </el-form-item>
 </el-form>

 

createElement去實現

如果我們直接將上面的代碼轉換為用createElement去實現,那麼代碼將會是這樣的

 export default {
  methods: {
     $_handleChangeUser(value) {
       this.formInline.user = value
     }
   },
   render(createElement) {
     return createElement(
       'ElForm',
       {
         props: {
           inline: true,
           model: this.formInline
         },
         staticClass: 'demo-form-inline'
       },
       [
         createElement(
           'ElFormItem',
           {
             props: {
               label: '審批人'
             }
           },
           [
             createElement('ElInput', {
               props: {
                 value: this.formInline.user
               },
               attrs: {
                 placeholder: '審批人'
               },
               on: {
                 input: this.$_handleChangeUser
               }
             })
           ]
         ),
         createElement(
           'ElFormItem',
           {
             props: {
               label: '活動區域'
             }
           },
           [
             createElement(
               'ElSelect',
               {
                 props: {
                   value: this.formInline.region,
                   placeholder: '活動區域'
                 }
               },
               [
                 createElement('ElOption', {
                   props: {
                     label: '區域一',
                     value: 'shanghai'
                   }
                 }),
                 createElement('ElOption', {
                   props: {
                     label: '區域二',
                     value: 'beijing'
                   }
                 })
               ]
             )
           ]
         ),
         createElement('ElFormItem', null, [
           createElement(
             'ElButton',
             {
               props: {
                 type: 'primary'
               },
               on: {
                 click: this.$_handleSubmit
               }
             },
             '查詢'
           )
         ])
       ]
     )
   }
 }

 

看到上面的代碼,你可能會驚呼,代碼好多啊,好痛苦,想當年發明JSX的人剛開始天天也是寫createElement,寫的直掉頭髮,太痛苦了,然後就使勁撓頭,當額頭鋥光發亮的時候,終於想到了一種新的語法,就是JSX。從此之後,頭髮呼呼的又長回來了。

看到上面代碼,你會發現有一個render函數,這個函數叫做渲染函數,相當於通過createElementJSX去實現功能的主入口方法。而且你熟悉的v-model也沒見了,而是用value + input代替了。

ok,這一部分先寫到這裡,下一篇文章寫下一部分:是時候使用JSX代替createElement了。喜歡的朋友可以繼續看哦,我更新非常快哦。也會一直出優秀的文章給大家分享。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在“JavaScript圖形實例:SierPinski三角形”中,我們介紹了SierPinski三角形的基本繪製方法,在“JavaScript圖形實例:迭代函數系統生成圖形”一文中,介紹了採用IFS方法生成SierPinski三角形的方法。下麵再介紹兩種SierPinski三角形的構造方法,以擴展知 ...
  • CodeMirror的正常使用: //首先通過<script>標簽引入相應的js,這個就不必說了 var myCodeMirror = CodeMirror.fromTextArea(myTextArea,{ key: "value" });//就這麼簡單 問題一、CodeMirror在Bootst ...
  • 您聽說過bilibili嗎?如果您居住在中國或對宅男文化感興趣,那麼您可能會感興趣。對於那些不瞭解Bilibili的人來說,這是一個視頻共用網站。大部分視頻都位於中國,其主題是動畫,漫畫和游戲。 Bilibili是目前YouTube上最好的替代產品之一,如果您喜歡卡通漫畫,可以依靠它。您會在那找到超 ...
  • 寫在前面 最近身邊有不少朋友想轉行去做前端開發,然後跑過來問我,向我瞭解前端崗位,以及給他們一些建議等等;他們有的還沒畢業,對於即將到來的社會毒打充滿著迷茫和不安,有的已經工作兩三年,突然覺得自己不合適當下這個份工作,想謀求一份別的職業。 選擇一份職業不在於這份職業可以給你帶來什麼,而是你可以因此成 ...
  • 一、繪製矩形 1、rect (x, y, width, height) : 繪製矩形的路徑 用軌跡畫的,不是獨立路徑( 沒有beginPath() ) 需要stroke()描邊才會顯示 2、strokeRect (x, y, width, height) : 描邊矩形 自動描邊,有獨立路徑 3、fi ...
  • 只能在render函數裡面使用JSX嗎 當然不是,你可以定義method,然後在method裡面返回JSX,然後在render函數裡面調用這個方法,不僅如此,JSX還可以直接賦值給變數,比如下麵這段代碼 methods: { $_renderFooter() { return ( <div> <El ...
  • 是時候使用JSX代替createElement了 接著上面的講,當我們看到上面用createElement去實現組件,太麻煩了,別說工作效率提高了,就是那些嵌套可以嵌套正確就很贊了,所以我們需要用JSX去簡化整個邏輯。當年我做項目的時候就遇到過這樣的情況,嵌套太多,自己都快搞不明白了,在崩潰的邊緣。 ...
  • HTML——超文本標記語言 HTMl裡面有標簽,標簽又分為單標簽和雙標簽,也分為行級元素和塊級元素 標簽是用<>包裹起來的,而且必須要有<>,否則會直接顯示在瀏覽器上面哦 現在介紹一下常用標簽 我們還要區分行級元素和塊級元素,塊級元素的特點是獨占一行,可以設置寬高,行級元素不能設置寬高,如果需要設置 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...