天天看點

Vue3 元件

元件(Component)是 Vue.js 最強大的功能之一。

元件可以擴充 HTML 元素,封裝可重用的代碼。

元件系統讓我們可以用獨立可複用的小元件來建構大型應用,幾乎任意類型的應用的界面都可以抽象為一個元件樹:

Vue3 元件

每個 Vue 應用都是通過用 createApp 函數建立的,傳遞給 createApp 的選項用于配置根元件。當我們挂載應用時,該元件被用作渲染的起點。

一個應用需要被挂載到一個 DOM 元素中。

以下執行個體我們将 Vue 應用挂載到 <div id="app"></div>,應該傳入 #app:

注冊一個全局元件文法格式如下:

my-component-name 為元件名,/* ... */ 部分為配置選項。注冊後,我們可以使用以下方式來調用元件:

一個簡單的 Vue 元件的執行個體:

注冊一個簡單的全局元件 runoob,并使用它:

<div id="app">

<runoob></runoob>

</div>

<script>

// 建立一個Vue 應用

const app = Vue.createApp({})

// 定義一個名為 runoob的新全局元件

app.component('runoob', {

template: '<h1>自定義元件!</h1>'

})

app.mount('#app')

</script>

接下來我們再注冊一個 button-counter 元件,在每次點選後,計數器會加 1:

// 定義一個名為 button-counter 的新全局元件

app.component('button-counter', {

  data() {

    return {

      count: 0

    }

  },

  template: `

    <button @click="count++">

      點了 {{ count }} 次!

    </button>`

注意:template 中 ` 是反引号,不是單單引号 '。

你可以将元件進行任意次數的複用:

<div id="components-demo">

  <button-counter></button-counter>

以上的執行個體中我們的元件都隻是通過 component 全局注冊的。

全局注冊的元件可以在随後建立的 app 執行個體模闆中使用,也包括根執行個體元件樹中的所有子元件的模闆中。。

// 定義一個名為 runoob 的新全局元件

全局注冊往往是不夠理想的。比如,如果你使用一個像 webpack 這樣的建構系統,全局注冊所有的元件意味着即便你已經不再使用一個元件了,它仍然會被包含在你最終的建構結果中。這造成了使用者下載下傳的 JavaScript 的無謂的增加。

在這些情況下,你可以通過一個普通的 JavaScript 對象來定義元件:

然後在 components 選項中定義你想要使用的元件:

對于 components 對象中的每個屬性來說,其屬性名就是自定義元素的名字(component-a、component-b),其屬性值就是這個元件的選項對象(ComponentA、ComponentB)。

我們也可以在執行個體選項中注冊局部元件,這樣元件隻能在這個執行個體中使用:

注冊一個簡單的局部元件 runoobA,并使用它:

<runoob-a></runoob-a>

var runoobA = {

}

const app = Vue.createApp({

components: {

'runoob-a': runoobA

prop 是子元件用來接受父元件傳遞過來的資料的一個自定義屬性。

父元件的資料需要通過 props 把資料傳給子元件,子元件需要顯式地用 props 選項聲明 "prop":

<site-name title="Google"></site-namet>

<site-name title="Runoob"></site-namet>

<site-name title="Taobao"></site-name>

app.component('site-name', {

props: ['title'],

template: `<h4>{{ title }}</h4>`

一個元件預設可以擁有任意數量的 prop,任何值都可以傳遞給任何 prop。

類似于用 v-bind 綁定 HTML 特性到一個表達式,也可以用 v-bind 動态綁定 props 的值到父元件的資料中。每當父元件的資料變化時,該變化也會傳導給子元件:

<site-info

v-for="site in sites"

:id="site.id"

:title="site.title"

></site-info>

const Site = {

data() {

return {

sites: [

{ id: 1, title: 'Google' },

{ id: 2, title: 'Runoob' },

{ id: 3, title: 'Taobao' }

]

const app = Vue.createApp(Site)

app.component('site-info', {

props: ['id','title'],

template: `<h4>{{ id }} - {{ title }}</h4>`

元件可以為 props 指定驗證要求。

為了定制 prop 的驗證方式,你可以為 props 中的值提供一個帶有驗證需求的對象,而不是一個字元串數組。例如:

當 prop 驗證失敗的時候,(開發環境建構版本的) Vue 将會産生一個控制台的警告。

type 可以是下面原生構造器:

<code>String</code>

<code>Number</code>

<code>Boolean</code>

<code>Array</code>

<code>Object</code>

<code>Date</code>

<code>Function</code>

<code>Symbol</code>

type 也可以是一個自定義構造器,使用 instanceof 檢測。