Vue_template和render

Vue_template和render

  • template

    一個替換掛載的元素模板。掛載元素的內(nèi)容都將被忽略嗦玖,除非模板的內(nèi)容有分發(fā)插槽。

    • 封裝組件:h1-h6標(biāo)簽
    <div id="app">
        <h-title level="1">h1標(biāo)題</h-title>
        <h-title level="2">h2標(biāo)題</h-title>
        <h-title level="3">h3標(biāo)題</h-title>
    </div>
    
    Vue.component("h-title", {
        template: `
            <div>
                <h1 v-if="level == 1"><slot></slot></h1>   
                <h2 v-else-if="level == 2"><slot></slot></h2>   
                <h3 v-else-if="level == 3"><slot></slot></h3>    
                <h4 v-else-if="level == 4"><slot></slot></h4>    
                <h5 v-else-if="level == 5"><slot></slot></h5>    
                <h6 v-else-if="level == 6"><slot></slot></h6>    
            </div>
        `,
        props: {
            level: {
                type: String
            }
        }
    })
    
  • render

    字符串模板的代替方案,允許你發(fā)揮 JavaScript 最大的編程能力谴麦。該渲染函數(shù)接收一個 createElement 方法作為第一個參數(shù)用來創(chuàng)建 VNode

    Vue中的Render函數(shù)中有一個參數(shù):h伸头,其實這個h叫做createElement匾效。Render函數(shù)將createElement的返回值放到了HTML中

    createElement這個函數(shù)中有3個參數(shù)

    • 第一個參數(shù)(必要參數(shù)):主要用于提供DOM的html內(nèi)容(標(biāo)簽名稱),類型可以是字符串恤磷、對象或函數(shù)
    • 第二個參數(shù)(類型是對象面哼,可選):用于設(shè)置這個DOM的一些樣式野宜、屬性、傳的組件的參數(shù)魔策、綁定事件等
    {
      // 與 `v-bind:class` 的 API 相同匈子,
      // 接受一個字符串、對象或字符串和對象組成的數(shù)組
      'class': {
        foo: true,
        bar: false
      },
      // 與 `v-bind:style` 的 API 相同闯袒,
      // 接受一個字符串虎敦、對象,或?qū)ο蠼M成的數(shù)組
      style: {
        color: 'red',
        fontSize: '14px'
      },
      // 普通的 HTML attribute
      attrs: {
        id: 'foo'
      },
      // 組件 prop
      props: {
        myProp: 'bar'
      },
      // DOM 屬性
      domProps: {
        innerHTML: 'baz'
      },
      // 事件監(jiān)聽器在 `on` 屬性內(nèi)政敢,
      // 但不再支持如 `v-on:keyup.enter` 這樣的修飾器其徙。
      // 需要在處理函數(shù)中手動檢查 keyCode。
      on: {
        click: this.clickHandler
      },
      // 僅用于組件喷户,用于監(jiān)聽原生事件唾那,而不是組件內(nèi)部使用
      // `vm.$emit` 觸發(fā)的事件。
      nativeOn: {
        click: this.nativeClickHandler
      },
      // 自定義指令褪尝。注意通贞,你無法對 `binding` 中的 `oldValue`
      // 賦值,因為 Vue 已經(jīng)自動為你進(jìn)行了同步恼五。
      directives: [
        {
          name: 'my-custom-directive',
          value: '2',
          expression: '1 + 1',
          arg: 'foo',
          modifiers: {
            bar: true
          }
        }
      ],
      // 作用域插槽的格式為
      // { name: props => VNode | Array<VNode> }
      scopedSlots: {
        default: props => createElement('span', props.text)
      },
      // 如果組件是其它組件的子組件昌罩,需為插槽指定名稱
      slot: 'name-of-slot',
      // 其它特殊頂層屬性
      key: 'myKey',
      ref: 'myRef',
      // 如果你在渲染函數(shù)中給多個元素都應(yīng)用了相同的 ref 名,
      // 那么 `$refs.myRef` 會變成一個數(shù)組灾馒。
      refInFor: true
    }
    
    • 第三個參數(shù)(類型是數(shù)組茎用,數(shù)組元素類型是VNode,可選):主要是指該結(jié)點下還有其他結(jié)點睬罗,用于設(shè)置分發(fā)的內(nèi)容轨功,包括新增的其他組件。注意容达,組件樹中的所有VNode必須是唯一的.

      this.$slots.default進(jìn)行接收

    • 同樣是封裝組件:h1-h6標(biāo)簽
      Vue.component("h-title",{
          render:function(h){
              return h(
                  “h” + this.level,
                  {
                      attrs:{
                          “data-id”:10        
                      }
                  },
                  this.$slots.default
              )
          },
          props:{
              level:{
                  type:String
              }
          }
      })
    

    目前只有6個<h>標(biāo)簽古涧,便能體現(xiàn)render封裝的便捷。如果有數(shù)十個標(biāo)簽需要不同的樣式時花盐,更容易體現(xiàn)出render函數(shù)適合復(fù)雜組件的封裝羡滑。

  • render與template的區(qū)別

    1. VUE一般使用template來創(chuàng)建HTML,而使用javascript來創(chuàng)建html要使用render函數(shù)算芯。
    2. template邏輯簡單柒昏,理解起來相對容易,但靈活性不足熙揍;render渲染方式可以將JS發(fā)揮到極致职祷,通過createElement的方式創(chuàng)建虛擬DOM。其邏輯性較強(qiáng),適合復(fù)發(fā)的組件封裝有梆。
    3. render(高)的性能要比tempate(低)要高是尖。
    4. render函數(shù)的優(yōu)先級大于template(優(yōu)先級可能會誤導(dǎo)我們的理解,換成權(quán)重更適合)但是要注意的是Mustache(雙花括號)語法就不能再次使用泥耀。
    • 例證render與template的區(qū)別饺汹,第4點:
    <div id="app">
        <h1></h1>
    </div>
    
    let vm = new Vue({
      el:"#app",
      data:{
          age:18
      },
      render:function(createElement){
        // return createElement('h1', '我是render出來的HTML,年齡{{age}}');//不能使用“Mustache”語法 (雙大括號)
         return createElement('h1', '我是render出來的HTML爆袍,年齡'+this.age);
        },
      template:"<div><p>我template出來的,年齡{{age}}</p></div>",
    });
    
    • 渲染結(jié)果

      render權(quán)重高.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末作郭,一起剝皮案震驚了整個濱河市陨囊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夹攒,老刑警劉巖蜘醋,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咏尝,居然都是意外死亡压语,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門编检,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胎食,“玉大人,你說我怎么就攤上這事允懂〔蘖” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵蕾总,是天一觀的道長粥航。 經(jīng)常有香客問我,道長生百,這世上最難降的妖魔是什么递雀? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮蚀浆,結(jié)果婚禮上缀程,老公的妹妹穿的比我還像新娘。我一直安慰自己市俊,他們只是感情好杠输,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秕衙,像睡著了一般蠢甲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上据忘,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天鹦牛,我揣著相機(jī)與錄音搞糕,去河邊找鬼。 笑死曼追,一個胖子當(dāng)著我的面吹牛窍仰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播礼殊,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼驹吮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晶伦?” 一聲冷哼從身側(cè)響起碟狞,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婚陪,沒想到半個月后族沃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡泌参,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年脆淹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沽一。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡盖溺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铣缠,到底是詐尸還是另有隱情咐柜,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布攘残,位于F島的核電站拙友,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏歼郭。R本人自食惡果不足惜遗契,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望病曾。 院中可真熱鬧牍蜂,春花似錦、人聲如沸泰涂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逼蒙。三九已至从绘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背僵井。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工陕截, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人批什。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓农曲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驻债。 傳聞我的和親對象是個殘疾皇子乳规,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容