国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

了解VUE的render函數的使用

2024-05-06 15:16:13
字體:
來源:轉載
供稿:網友

Vue 推薦在絕大多數情況下使用 template 來創建你的 HTML。然而在一些場景中,你真的需要 JavaScript 的完全編程的能力,這就是 render 函數,它比 template 更接近編譯器。 在 HTML 層, 我們決定這樣定義組件接口:通過傳入不同的level 1-6 生成h1-h6標簽,和使用slot生成內容

<div id="div1">  <child :level="1">Hello world!</child></div><script type="text/x-template" id="child-template"> <h1 v-if="level === 1">  <slot></slot> </h1> <h2 v-if="level === 2">  <slot></slot> </h2> <h3 v-if="level === 3">  <slot></slot> </h3> <h4 v-if="level === 4">  <slot></slot> </h4> <h5 v-if="level === 5">  <slot></slot> </h5> <h6 v-if="level === 6">  <slot></slot> </h6> </script><script type="text/javascript">  /**   * 全局注冊child組件,注意template如果值以 # 開始,則它用作選項符,將使用匹配元素的 innerHTML 作為模板。常用的技巧是用 <script type="x-template"> 包含模板,這樣的好處是html不會渲染里面的內容   * 這里使用template不是最好的選擇,   * 一、代碼冗長    * 二、在不同的標題插入內容需要重復使用slot    * 三、由于組件必須有根元素,所以標題和內容被包裹在一個無用的div中,比如<div><h1>hello world</h1></div>   */  Vue.component('child', {   template: '#child-template',   props: {    level: {     type: Number,     required: true    }   },   data: function() {    return {     a: 1    }   }  })  new Vue({    el:"#div1"  }) </script>

我們嘗試使用render函數實現上面的例子,注意使用render函數,template 選項將被忽略。 createElement接收3個參數:

第一個參數可以是HTML標簽名,組件或者函數都可以;此參數是必須的;

第二個為數據對象{Object}(可選);

第三個為子節點{String | Array}(可選),多個子節點[createElement(tag1),createElement(tag2)]。

<div id="div1">  <child :level="1">   Hello world!  </child>  <child :level="2">   <!-- 將不會被顯示 -->   <span slot="footer">span</span>   <p slot="header">header slot<span>span</span></p>  </child> </div>Vue.component('child', {   render: function(createElement) {    console.log(this.$slots);    return createElement(     'h'+ this.level, // tagName標簽名稱     {      // 為每個h標簽設置class      'class': {       foo: true,       bar: false      },      // 最終被渲染為內聯樣式      style: {       color: 'red',       fontSize: '14px'      },      // 其他的html屬性      attrs: {       id: 'foo',       'data-id': 'bar'      },      // DOM屬性      domProps: {       // innerHTML: 'from domProps',      },      // 事件監聽器基于 "on"      // 所以不再支持如 v-on:keyup.enter 修飾器      on: {       click: this.clickHandler      },      // ...     },     // 你可以從this.$slots獲取VNodes列表中的靜態內容     // $slots.default用來訪問組件的不具名slot     // 當你可能需要具名slot的時候需要指定slot的name, this.$slots.header     [this.$slots.default]    )   },   template: '<div v-if="level===1"><slot></slot></div>', // 將被忽略   props: {    level: {     type: Number,     required: true    }   },   methods: {    clickHandler: function() {     console.log('clickHandler')    }   }  })  new Vue({    el:"#div1"  })            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 安西县| 栾川县| 淮南市| 巨鹿县| 宁明县| 乐安县| 辉南县| 德惠市| 阿克陶县| 肃北| 民勤县| 大足县| 锦屏县| 凤台县| 浠水县| 清苑县| 重庆市| 淄博市| 拜城县| 黄大仙区| 土默特左旗| 天祝| 庆阳市| 遂平县| 合山市| 海晏县| 文登市| 琼中| 宁德市| 乐陵市| 西贡区| 长武县| 大邑县| 德化县| 丹江口市| 桐梓县| 磐石市| 图木舒克市| 高邮市| 仪征市| 岢岚县|