天天看點

VUE基礎之概述

VUE是什麼

Vue (讀音 /vjuː/,類似于 view) 是一套用于建構使用者界面的漸進式架構。Vue 的核心庫隻關注視圖層,不僅易于上手,還便于與第三方庫或既有項目整合。

元件系統是 Vue 的另一個重要概念,因為它是一種抽象,允許我們使用小型、獨立和通常可複用的元件建構大型應用。仔細想想,幾乎任意類型的應用界面都可以抽象為一個元件樹。

元件

在 Vue 裡,一個元件本質上是一個擁有預定義選項的一個 Vue 執行個體。

注冊元件

元件的注冊分為全局注冊和局部注冊,下面的注冊是全局注冊。

// 定義名為 todo-item 的新元件
Vue.component('todo-item', {
  template: '<li>這是個待辦項</li>'
})
           

1.使用元件,并通過父元件往子元件傳遞參數。

Vue.component('todo-item', {
  // todo-item 元件現在接受一個
  // "prop",類似于一個自定義特性。
  // 這個 prop 名為 todo。
  props: ['todo'],
  template: '<li>{{ todo.text }}</li>'
})


var app7 = new Vue({
  el: '#app-7',
  data: {
    groceryList: [
      { id: 0, text: '蔬菜' },
      { id: 1, text: '奶酪' },
      { id: 2, text: '随便其它什麼人吃的東西' }
    ]
  }
})

<div id="app-7">
  <ol>
    <!--
      現在我們為每個 todo-item 提供 todo 對象
      todo 對象是變量,即其内容可以是動态的。
      我們也需要為每個元件提供一個“key”,稍後再
      作詳細解釋。
    -->
    <todo-item
      v-for="item in groceryList"
      v-bind:todo="item"
      v-bind:key="item.id">
    </todo-item>
  </ol>
</div>
           
元件複用

有如下的元件:

// 定義一個名為 button-counter 的新元件
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})
           

使用該元件的形式如下:

<div id="components-demo">
  <button-counter></button-counter>
</div>

new Vue({ el: '#components-demo' })
           

因為元件是可複用的 Vue 執行個體,是以它們與new Vue接收相同的選項,例如data computed watch methods 以及生命周期鈎子等,僅有的特殊例外像el這樣的根執行個體特有選項

<div id="components-demo">
  <button-counter></button-counter>
  <button-counter></button-counter>
  <button-counter></button-counter>
</div>
           
注意當點選按鈕時,每個元件都會各自獨立維護它的 count。因為你每用一次元件,就會有一個它的新執行個體被建立

data必須是一個函數

一個元件的data選項必須是一個函數,是以每個執行個體可以維護一份被傳回對象的獨立的拷貝,如果 Vue 沒有這條規則,點選一個按鈕就可能會影響到其它所有執行個體

通過 Prop 向子元件傳遞資料

Prop 是你可以在元件上注冊的一些自定義特性。當一個值傳遞給一個 prop 特性的時候,它就變成了那個元件執行個體的一個屬性。為了給博文元件傳遞一個标題,我們可以用一個props選項将其包含在該元件可接受的 prop 清單中。

Vue.component('blog-post', {
  props: ['title'],
  template: '<h3>{{ title }}</h3>'
})
           
一個元件預設可以擁有任意數量的 prop,任何值都可以傳遞給任何 prop。
<blog-post title="My journey with Vue"></blog-post>
<blog-post title="Blogging with Vue"></blog-post>
<blog-post title="Why Vue is so fun"></blog-post>
           

正在的應用場景如下:

//真實的資料應該是一個數組
new Vue({
  el: '#blog-post-demo',
  data: {
    posts: [
      { id: 1, title: 'My journey with Vue' },
      { id: 2, title: 'Blogging with Vue' },
      { id: 3, title: 'Why Vue is so fun' }
    ]
  }
})

<blog-post v-for "post in posts" 
    v-bind:key="post.id" v-bind:title="post.title">
</blog-post>
           
單個根元素

每個元件都需要有且僅有一個元素。

并且傳遞的資料需要盡量友善。

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

傳輸的資料需要盡可能友善:

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

而不是按照如下規則進行:
<blog-post
  v-for="post in posts"
  v-bind:key="post.id"
  v-bind:title="post.title"
  v-bind:content="post.content"
  v-bind:publishedAt="post.publishedAt"
  v-bind:comments="post.comments"
></blog-post>
           
向父元件傳遞資料
<!--在父元件上聲明布局-->
new Vue({
    el:'enlarge-text-demo',
    postFontSize:20
})

<div id='enlarge-text-demo'>
    <blog-post style="{font-size: postFontSize + 'em'}" v-for:"post in posts" :key="post.id" :post="post" v-on:enlarge-text="postFontSize += 0.1">
    </blog-post>
<div>


<!--子元件-->
<!--注冊元件-->
Vue.component('blog-post',{
    props:['post'],
    templete:`
        <div class='blog-post'>
        <h3>{{ post.title }}</h3>
          <button v-on:click="$emit('enlarge-text')">
            Enlarge text
          </button>
          <div v-html="post.content"></div>
        </div>
    `
})
           

子控件往父控件傳遞參數

<button v-on:click="$emit('enlarge-text', 0.1)">
  Enlarge text
</button>

<blog-post
  ...
  v-on:enlarge-text="postFontSize += $event"
></blog-post>
或者,如果這個事件處理函數是一個方法:

<blog-post
  ...
  v-on:enlarge-text="onEnlargeText"
></blog-post>

methods: {
  onEnlargeText: function (enlargeAmount) {
    this.postFontSize += enlargeAmount
  }
}
           
使用v-model
V-model是雙選綁定,上面的内容是單向綁定
<input v-model="searchText"/>
等效于
<input :value="searchText"
@input="searchText=$event.target.value"/>

是以,要想使用v-model,必須按照如下方式使用:
<custom-input
  v-bind:value="searchText" //自定義屬性
  v-on:input="searchText = $event" //自定義屬性
></custom-input>

vue的子元件的寫法如下:

Vue.component('custom-input', {
  props: ['value'],
  template: `
    <input
      v-bind:value="value"
      v-on:input="$emit('input', $event.target.value)" //回傳屬性
    >
  `
})


是以 可以使用v-model
<custom-input v-model="searchText"></custom-input>
           

通過插槽分發内容

和 HTML 元素一樣,我們經常需要向一個元件傳遞内容,像這樣:

<alert-box>
  Something bad happened.
</alert-box>

Vue.component('alert-box', {
  template: `
    <div class="demo-alert-box">
      <strong>Error!</strong>
      <slot></slot>
    </div>
  `
})
           

輸出結果:

Error! Something bad happened.

t:插槽傳遞内容

動态元件

有的時候,在不同元件之間進行動态切換是非常有用的,比如在一個多标簽的界面。

<component v-bind:is="currentTabComponent"></component>