學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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...