中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Vue中使用render函數

發布時間:2021-03-17 15:00:28 來源:億速云 閱讀:520 作者:Leah 欄目:web開發

本篇文章為大家展示了如何在Vue中使用render函數,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

render函數

vue通過 template 來創建你的 HTML。但是,在特殊情況下,這種寫死的模式無法滿足需求,必須需要js的編程能力。此時,需要用render來創建HTML。

什么情況下適合使用render函數

在一次封裝一套通用按鈕組件的工作中,按鈕有四個樣式(default success error )。首先,你可能會想到如下實現

 <div v-if="type === 'success'">success</div>
 <div v-else-if="type === 'error'">error</div>
 <div v-else-if="type === 'warm'">warm</div>
 <div v-else>default</div>

這樣寫在按鈕樣式少的時候完全沒有問題,但是試想,如果需要的按鈕樣式有十多個,按鈕內的文字根據實際情況而定(如success按鈕內的文字可能是OK、GOOD等等)。那么template寫死的方式就顯得很無力了。遇上類似這樣的情況,使用render函數可以說最優選擇了。

根據實際情況改寫按鈕組件

首先render函數生成的內容相當于template的內容,故使用render函數時,在.vue文件中需要先把template標簽去掉。只保留邏輯層。

export default {
 render(h) {
  return h('div',{
   'class': {
    btn: true,
    success: this.type === 'success',
    error: this.type === 'error',
    warm: this.type === 'warm',
    default: this.type === 'default'
   },
   domProps: {
    innerHTML: this.$slots.default[0].text
   },
   on: {
    click: this.clickHandle
   }
  })
 },
 methods: {
  clickHandle() {
   // dosomething
  }
 },
 props: {
  type: {
   type: String,
   default: 'default'
  },
  text: {
   type: String,
   default: 'default'
  }
 }
};

根據組件化思維,能抽象出來的東西絕不寫死在邏輯上。這里的clickHandle函數可以根據按鈕的type類型觸發不同的邏輯,就不多敘述了。

然后在父組件調用

<btn
 v-for="(btn, index) in testData"
 :type="btn.type"
 :text="btn.text"
 :key="index">{{btn.text}}
</btn>

使用jsx

是的,要記住每個參數的類型同用法,按序傳參實在是太麻煩了。那么其實可以用jsx來優化這個繁瑣的過程。

return (
 <div
  class={{
   btn: true,
   success: this.type === 'success',
   error: this.type === 'error',
   warm: this.type === 'warm',
   default: this.type === 'default'
  }}
  onClick={this.clickHandle}>
  {this.$slots.default[0].text}
 </div>
)

示例二:

在遇到寫類似的組件的時候需要寫很多很長的代碼,出于簡潔(懶惰使人進步)的角度來說,我們應該找到更合適的方法來實現該效果。

 <body> 
    <div id="app"> 
      <mycomment :level="2"> 
        這是h3元素 
      </mycomment> 
    </div> 
  </body> 
  <script type="text/x-template" id="is"> 
 <div> 
  <h2 v-if="level === 1"> 
   <slot></slot> 
  </h2> 
  <h3 v-if="level === 2"> 
    <slot></slot> 
  </h3> 
  <h4 v-if="level === 3"> 
   <slot></slot> 
  </h4> 
  <h5 v-if="level === 4"> 
   <slot></slot> 
  </h5> 
  <h6 v-if="level === 5"> 
   <slot></slot> 
  </h6> 
  <h7 v-if="level === 6"> 
   <slot></slot> 
  </h7> 
 </div> 
</script> 
  <script> 
    Vue.component('mycomment',{ 
      template:'#is', 
      props:{ 
        level:{ 
          type:Number, 
          required:true, 
        } 
      } 
    }) 
    var app =new Vue({ 
      el:'#app', 
    }) 
   </script>

這時候Render 函數就很好的解決了這個問題,先來簡單一點額例子,算是有基本的骨架了

 <body> 
  <div id="app"> 
    <render-teample :level="4"> 
      render function 
 
    </render-teample> 
  </div> 
 
</body> 
<script> 
Vue.component('render-teample',{ 
  render:function(createElement){ 
    return createElement( 
      'h'+this.level, 
      this.$slots.default 
      ) 
  }, 
   props: { 
  level: { 
   type: Number, 
   required: true 
  } 
} 
  var app=new Vue({ 
    el:"#app", 
 
  }); 
 </script>

然后進一步給你的組件加入你想要的樣式需要事件,變得有血有肉

 <body> 
    <div id="app"> 
      <render-teample :level="4" > 
 
        <div class="jah" slot="myslot">render function</div> 
      </render-teample> 
    </div> 
 
  </body> 
  <script> 
  Vue.component('render-teample',{ 
    render:function(createElement){ 
      return createElement( 
        'h'+this.level, 
        { 
          'class':{ 
            show:true, 
            hide:false, 
          }, 
          style:{ 
            width:'200px', 
            height:'400px', 
            background:'red', 
          }, 
          attrs:{ 
            name:'h-ex', 
            id:'h-id' 
          }, 
          props:{ 
            myprops:true, 
          }, 
           on: { 
          click: function(event){ 
            alert(this.num) 
          } 
        }, 
          nativeOn:{ 
            click:function(event) { 
 
              alert(1111) 
            } 
          } 
 
        }, 
        [ 
          this.$slots.myslot, 
          createElement('div',{ 
             domProps:{ 
            innerHTML:'holle render' 
          } 
          }) 
        ] 
 
        ) 
    }, 
     props: { 
    level: { 
     type: Number, 
     required: true 
    } 
  } 
});  
    var app=new Vue({ 
      el:"#app", 
      data:{ 
        num:110 
      } 
    }); 
  </script>

注意:約束組件中 VNodes 必須是唯一的。

直接把所有元素寫在一個createElement()下是很痛苦的,不利于維護。

所以通常會

var com1= createElement('p','item1');var
com2= createElement('p','item1');

可以使用return createElement('div',[com1,com2])

這種情況是禁止的return createElement('div',[com1,com1])

上述內容就是如何在Vue中使用render函數,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赣榆县| 张北县| 盐城市| 阿克陶县| 西林县| 石台县| 买车| 新竹县| 阜新| 达日县| 泾阳县| 思南县| 洞头县| 屏东县| 卫辉市| 麻阳| 阳江市| 黔南| 仙居县| 浠水县| 阿克陶县| 镇江市| 师宗县| 和政县| 化德县| 克什克腾旗| 曲松县| 普格县| 奎屯市| 平定县| 航空| 收藏| 基隆市| 阳西县| 潞城市| 黔东| 万源市| 尤溪县| 苍山县| 安徽省| 苗栗市|