最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue渲染方式render和template的區(qū)別

 更新時間:2020年06月05日 10:40:52   作者:吳小明的博客  
這篇文章主要介紹了vue渲染方式render和template的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

render函數(shù)詳解

Vue中的Render函數(shù)中有一個參數(shù),這個參數(shù)是一個函數(shù)通常我們叫做h。其實這個h叫做createElement。Render函數(shù)將createElement的返回值放到了HTML中

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

第一個參數(shù)(必要參數(shù)):主要用于提供DOM的html內(nèi)容,類型可以是字符串、對象或函數(shù)

第二個參數(shù)(類型是對象,可選):用于設置這個DOM的一些樣式、屬性、傳的組件的參數(shù)、綁定事件之類

第三個參數(shù)(類型是數(shù)組,數(shù)組元素類型是VNode,可選):主要是指該結點下還有其他結點,用于設置分發(fā)的內(nèi)容,包括新增的其他組件。注意,組件樹中的所有VNode必須是唯一的

// @return {VNode}
createElement(
 // {String | Object | Function}
 // 一個HTML標簽字符串,組件選項對象,或者一個返回值類型為String/Object的函數(shù)。該參數(shù)是必須的
 'div',

 // {Object}
 // 一個包含模板相關屬性的數(shù)據(jù)對象,這樣我們可以在template中使用這些屬性,該參數(shù)是可選的。
{
   attrs: {
    name: headingId,
    href: '#'+headingId
  },
   style: {
    color: 'red',
    fontSize: '20px'
  },
   'class': {
    foo: true,
    bar: false
   },
   // DOM屬性
   domProps: {
     innerHTML: 'baz'
   },
   // 組件props
    props: {
     myProp: 'bar'
   },
    // 事件監(jiān)聽基于 'on'
    // 所以不再支持如 'v-on:keyup.enter' 修飾語
    // 需要手動匹配 KeyCode 
    on: {
      click: function(event) {
        event.preventDefault();
        console.log(111);
     }
    }
 }

 // {String | Array}
 // 子節(jié)點(VNodes)由 createElement() 構建而成??蛇x參數(shù)
 // 或簡單的使用字符串來生成的 "文本節(jié)點"。
[
  'xxxx',
  createElement('h1', '一則頭條'),
  createElement(MyComponent, {
   props: {
    someProp: 'xxx'
  }
 }),
  this.$slots.default
]
)

什么時候用render函數(shù)?

假設我們要封裝一套按鈕組件,按鈕有四個樣式(success、error、warning、default)。首先,你可能會想到如下實現(xiàn)

<template>
<divclass="btn btn-success"v-if="type === 'success'">{{ text }}</div>
<divclass="btn btn-danger"v-else-if="type === 'danger'">{{ text }}</div>
<divclass="btn btn-warning"v-else-if="type === 'warning'">{{ text }}</div>
</template>

雖然我們這樣實現(xiàn)沒有問題,但是如果現(xiàn)在有十幾個樣式的情況下我們就需要寫N多個判斷,如果遇到了這種情況我們就可以選擇使用render函數(shù)。

其實簡單的來說就是template適合簡單的組件封裝,然后render函數(shù)適合復雜的組件封裝

<script>
Vue.component("A-button", {
    props: {
      type: {
        type: String,
        default: 'default'
     },
      text: {
        type: String,
        default: '按鈕'
     }
   },
    computed: {
      tag() {
        switch(this.type) {
          case'success':
            return1;
          case'danger':
            return2;
          case'warning':
            return3;
          default:
            return1;
       }
     }
   },
    render(h) {
      returnh('div', {
        class: {
          btn: true,
          'btn-success': this.type==='success',
          'btn-danger': this.type==='danger',
          'btn-warning': this.type==='warning'
       },
        domProps: {
          //innerText: this.text,
       },
        on: {
          click: this.handleClick
       }
     },
      this.$slots.default
     );
   },
    methods: {
      handleClick() {
        console.log('-----------------------');
        console.log('li');
     }
   }
 })

  letvm=newVue({
    el: "#app"
 })
</script>

template與render函數(shù)對比

template----html的方式做渲染
render----js的方式做渲染

render(提供)是一種編譯方式
render里有一個函數(shù)h,這個h的作用是將單文件組件進行虛擬DOM的創(chuàng)建,然后再通過render進行解析。
h就是createElement()方法:createElement(標簽名稱,屬性配置,children)

template也是一種編譯方式,但是template最終還是要通過render的方式再次進行編譯。

區(qū)別:
        1、render渲染方式可以讓我們將js發(fā)揮到極致,因為render的方式其實是通過createElement()進行虛擬DOM的創(chuàng)建。邏輯性比較強,適合復雜的組件封裝。
        2、template是類似于html一樣的模板來進行組件的封裝。
        3、render的性能比template的性能好很多
        4、render函數(shù)優(yōu)先級大于template

案例一:template和render的方式渲染標題標簽:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <h-title level="1">標題</h-title>
    <h-title level="2">標題</h-title>
    <h-title level="3">標題</h-title>
  </div>
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
  <script>
    Vue.component("h-title",{
      /*  template渲染  */
      // 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>  
      //   </div>
      // `,
      
      /*  render渲染  */
      render:function(h){
        // createElement(標簽名稱,屬性配置,children)
        return h("h"+this.level,
          {
            attrs:{
              "data-id":10
            }
          },
          // 相當于<slot></slot>標簽接收
          this.$slots.default
        )
      },
      props:{
        level:{
          type:String
        }
      }
    });
    let vm=new Vue({
      el:"#app"
    });
  </script>
</body>
</html>

案例二:render方式模擬button:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    *{margin: 0;padding: 0;}
    .btn{
      width: 80px;
      line-height: 40px;
      text-align: center;
      color:#fff;
      border-radius: 5px;
      background-color: #ccc;
    }
    .success{background-color: green;}
    .error{background-color: red;}
    .info{background-color: pink;}
  </style>
</head>
<body>
  <div id="app">
    <wql-button type="success">成功</wql-button>
    <wql-button type="info">提示</wql-button>
    <wql-button type="error">報錯</wql-button>
    <wql-button>默認</wql-button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    Vue.component("wql-button",{
      render:function(h){
        return h("div",{
          class:{
            btn:true,
            success:this.type=="success",
            error:this.type=="error",
            info:this.type=="info"
          }
        },this.$slots.default);
      },
      props:{
        type:{
          type:String
        }
      }
    });
    let vm=new Vue({
      el:"#app"
    });
  </script>
</body>
</html>

到此這篇關于vue渲染方式render和template的區(qū)別的文章就介紹到這了,更多相關vue render template區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue打包chunk-vendors.js文件過大導致頁面加載緩慢的解決

    vue打包chunk-vendors.js文件過大導致頁面加載緩慢的解決

    這篇文章主要介紹了vue打包chunk-vendors.js文件過大導致頁面加載緩慢的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue?echarts實現(xiàn)改變canvas長和寬自適應

    vue?echarts實現(xiàn)改變canvas長和寬自適應

    這篇文章主要介紹了vue?echarts實現(xiàn)改變canvas長和寬自適應問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue項目啟動后沒有局域網(wǎng)地址問題

    vue項目啟動后沒有局域網(wǎng)地址問題

    這篇文章主要介紹了vue項目啟動后沒有局域網(wǎng)地址問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • vue中的this.$refs,this.$emit,this.$store,this.$nextTick的使用方式

    vue中的this.$refs,this.$emit,this.$store,this.$nextTick的使用方式

    這篇文章主要介紹了vue中的this.$refs,this.$emit,this.$store,this.$nextTick的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 詳解vuelidate 對于vueJs2.0的驗證解決方案

    詳解vuelidate 對于vueJs2.0的驗證解決方案

    本篇文章主要介紹了vuelidate 對于vueJs2.0的驗證解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Vue使用Echart圖標插件之柱狀圖

    Vue使用Echart圖標插件之柱狀圖

    這篇文章主要為大家詳細介紹了Vue使用Echart圖標插件之柱狀圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 解決nuxt 自定義全局方法,全局屬性,全局變量的問題

    解決nuxt 自定義全局方法,全局屬性,全局變量的問題

    這篇文章主要介紹了解決nuxt 自定義全局方法,全局屬性,全局變量的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue 封裝公告滾動的方法

    Vue 封裝公告滾動的方法

    文章介紹了如何在需求系統(tǒng)中創(chuàng)建一個位于頁面上方的公告展示組件,展示了如何在App.vue或其他頁面組件中使用這個公告組件,感興趣的朋友一起看看吧
    2025-01-01
  • vue腳手架vue-cli的學習使用教程

    vue腳手架vue-cli的學習使用教程

    本篇文章主要介紹了vue腳手架vue-cli的學習使用教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 詳解vue-router 命名路由和命名視圖

    詳解vue-router 命名路由和命名視圖

    這篇文章主要介紹了詳解vue-router 命名路由和命名視圖,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06

最新評論

大余县| 凤城市| 湖南省| 简阳市| 贡山| 肇庆市| 巴东县| 龙山县| 志丹县| 富裕县| 卫辉市| 道真| 洪湖市| 团风县| 道真| 浦北县| 涿鹿县| 杭州市| 洪湖市| 天等县| 普洱| 清苑县| 龙州县| 仪陇县| 武邑县| 固始县| 沾益县| 玛纳斯县| 墨竹工卡县| 双鸭山市| 宁陵县| 永修县| 郧西县| 嘉定区| 稷山县| 凤阳县| 晋江市| 灯塔市| 芦山县| 蒲江县| 蕉岭县|