Vue組件基礎(chǔ)

Vue組件基礎(chǔ)

每用一次組件,就會(huì)有一個(gè)它的新實(shí)例被創(chuàng)建

data必須是一個(gè)函數(shù)

一個(gè)組件的data選項(xiàng)必須是一個(gè)函數(shù),因此每個(gè)函數(shù)可以維護(hù)一份被返回對(duì)象的獨(dú)立拷貝。

避免一個(gè)實(shí)例,影響到其他所有實(shí)例。

動(dòng)態(tài)傳遞prop

<blog-post
  v-for="post in posts"
  v-bind:key="post.id"
  v-bind:title="post.title"
></blog-post>

可以使用v-bind來(lái)動(dòng)態(tài)傳遞prop。一開始不清楚要渲染的具體內(nèi)容,比如從一個(gè)api獲取博文列表的時(shí)候,是非常有用的。

單個(gè)根元素

每個(gè)組件必須只有一個(gè)根元素

當(dāng)組件變得越來(lái)越復(fù)雜的時(shí)候,為每個(gè)相關(guān)信息定義一個(gè)prop會(huì)變得很麻煩。

所以讓它變成一個(gè)單獨(dú)的post prop

<blog-post
  v-for="post in posts"
  v-bind:key="post.id"
  v-bind:post="post"
></blog-post>
<script>
Vue.component('blog-post', {
  props: ['post'],
  template: `
    <div class="blog-post">
      <h3>{{ post.title }}</h3>
      <div v-html="post.content"></div>
    </div>
  `
})
</script>

在組件上使用v-model

自定義事件也可以用于創(chuàng)建v-model的自定義組件

v-mdoel實(shí)際上為語(yǔ)法糖

<input v-model="searchText">
//等價(jià)于
<input
  v-bind:value="searchText"
  v-on:input="searchText = $event.target.value"
>

當(dāng)用在組件上時(shí),v-model則會(huì)這樣

<custom-input
  v-bind:value="searchText"
  v-on:input="searchText = $event"
></custom-input>

為了讓它正常工作,這個(gè)組件內(nèi)的<input>

  • 將其value特性綁定到一個(gè)名叫value的prop上
  • 在其input事件被觸發(fā)時(shí),將新的值通過(guò)自定義的input事件拋出
Vue.component('custom-input', {
  props: ['value'],
  template: `
    <input
      v-bind:value="value"
      v-on:input="$emit('input', $event.target.value)"
    >
  `
})
//重寫input事件傳出的值,因?yàn)関-model在自定義組件和在<input>上不一致

通過(guò)插槽分發(fā)內(nèi)容

在需要的地方加入插槽

動(dòng)態(tài)組件

<!-- 組件會(huì)在 `currentTabComponent` 改變時(shí)改變 -->
<component v-bind:is="currentTabComponent"></component>

動(dòng)態(tài)和異步組件

解析DOM模版時(shí)的注意事項(xiàng)

有些 HTML 元素,諸如<ul>,<ol>,<table><select>,對(duì)于哪些元素可以出現(xiàn)在其內(nèi)部是有嚴(yán)格限制的。而有些元素,諸如 <li>,<tr>,<option>,只能出現(xiàn)在其它某些特定的元素內(nèi)部

使用這些有約束條件的元素時(shí)會(huì)遇到一些問(wèn)題

<table>
  <blog-post-row></blog-post-row>
</table>

這個(gè)自定義組件<blog-post-row> 會(huì)被作為無(wú)效的內(nèi)容提升到外部,并導(dǎo)致最終渲染結(jié)果出錯(cuò)。幸好這個(gè)特殊的 is 特性給了我們一個(gè)變通的辦法:

<table>
  <tr is="blog-post-row"></tr>
</table>

需要注意的是以下來(lái)源使用模版的話,這條限制是不存在的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 組件是可復(fù)用的Vue實(shí)例,且?guī)в幸粋€(gè)名字。我們可以在一個(gè)通過(guò)new Vue創(chuàng)建的Vue根實(shí)例中,把這個(gè)組件作為自定...
    oWSQo閱讀 357評(píng)論 0 0
  • 什么是組件? 組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝...
    youins閱讀 9,705評(píng)論 0 13
  • 組件是可復(fù)用的 Vue 實(shí)例,且?guī)в幸粋€(gè)名字:在這個(gè)例子中是 。我們可以在一個(gè)通過(guò) new Vue 創(chuàng)建的 Vu...
    波克比閱讀 216評(píng)論 0 0
  • 祭出demo 基礎(chǔ)示例 組件是可復(fù)用的 Vue 實(shí)例,所以它們與 new Vue 接收相同的選項(xiàng),例如 data、...
    rainbowboy閱讀 874評(píng)論 0 50
  • 傳遞靜態(tài)或動(dòng)態(tài)Prop 傳入靜態(tài)的值: 這時(shí)候值是一個(gè)字符串你也可以通過(guò)v-bind動(dòng)態(tài)賦值: 這時(shí)候值是一個(gè)js...
    A鄭家慶閱讀 444評(píng)論 0 0

友情鏈接更多精彩內(nèi)容