iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
Modern Web

淺入淺出 Rails with Vue系列 第 13

【Day 13】淺入淺出 Rails with Vue - Vue 的基本概念 - 12

  • 分享至 

  • xImage
  •  

前言

本系列將介紹 Rails with Vue 的基本概念,並且以一個簡單的專案 Todo 來說明如何使用 Rails with Vue。我將透過這一系列的文章記錄我學習的過程,並且將我所學到的知識分享給大家。

Array Change Detection

Mutation Methods

Vue 包裝了一些可以改變陣列的方法,這些方法會觸發陣列的變更通知,這些方法包含:

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

你可以打開 console 來測試先前的範例:

example1.items.push({ message: 'Baz' })

Replacing an Array

比起 mutation 方法會改變原本的陣列,你也可以使用一些 non-mutation 的方法來取代原本的陣列,像是 filter()concat()slice()。這些方法不會改變原本的陣列,而是回傳一個新的陣列,所以你需要將新的陣列指派給原本的陣列:

example1.items = example1.items.filter(function (item) {
  return item.message.match(/Foo/)
})

在上面的範例中,我們使用 filter() 來過濾掉不符合條件的項目,並且將結果指派給 example1.items

Displaying Filtered/Sorted Results

在上一節中,我們使用 filter() 來過濾掉不符合條件的項目,並取代原本的陣列。但是,如果我們想要保留原本的陣列,並且只是顯示過濾後的結果呢?這時候我們可以使用 computed 屬性來處理,
舉例來說,在下面的範例中,我們使用 computed 屬性來處理 evenNumbers,並且將結果回傳。

<li v-for="n in evenNumbers">{{ n }}</li>
data: {
  numbers: [ 1, 2, 3, 4, 5 ]
},
computed: {
  evenNumbers: function () {
    return this.numbers.filter(function (number) {
      return number % 2 === 0
    })
  }
}

若在某些條件下無法使用 computed 屬性,你也可以使用一個方法來處理,
例如以下範例中,我們使用 methods 屬性來處理 even,並且將結果回傳。

<ul v-for="set in sets">
  <li v-for="n in even(set)">{{ n }}</li>
</ul>
data: {
  sets: [[ 1, 2, 3, 4, 5 ], [6, 7, 8, 9, 10]]
},
methods: {
  even: function (numbers) {
    return numbers.filter(function (number) {
      return number % 2 === 0
    })
  }
}

v-for with a Range

你可以使用 v-for 也可以使用一個數字範圍,例如以下的範例中,我們使用 v-for 來產生一個 1 到 10 的數字範圍:

<div>
  <span v-for="n in 10">{{ n }} </span>
</div>

將會輸出

<div>
  <span>1</span>
  <span>2</span>
  <span>3</span>
  <span>4</span>
  <span>5 </span>
  <span>6</span>
  <span>7</span>
  <span>8</span>
  <span>9</span>
  <span>10</span>
</div>

v-for on a <template>

若要顯示一個項目的多個元素,你可以使用 <template> 來包裝這些元素,例如以下的範例中,我們使用 <template> 來包裝一個項目的多個元素,並透過 v-for 迭代這些元素:

<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider" role="presentation"></li>
  </template>
</ul>

v-for with v-if

特別注意不太建議 v-forv-if 一起使用

v-forv-if 一起使用時,v-for 的優先權比較高,例如以下的範例中,我們使用 v-for 來迭代一個陣列,並且使用 v-if 來過濾掉不符合條件的項目,
所以在這個範例中,v-if 會在每個迭代中被檢查,並且過濾掉不完成的項目。

<li v-for="todo in todos" v-if="!todo.isComplete">
  {{ todo }}
</li>

如果你想要在迭代之前過濾掉不符合條件的項目,你可以先用 v-if wrapper 一個 element(or template),並且在 element 中使用 v-for
在以下範例中,我們使用 v-if wrapper 一個 <ul>,並且在 <ul> 中使用 v-for 來迭代一個陣列,
todos 陣列的長度大於 0 時,<ul> 會被渲染,並且在 <ul> 中使用 v-for 來迭代 todos 陣列,
反之,<p> 會被渲染。

<ul v-if="todos.length">
  <li v-for="todo in todos">
    {{ todo }}
  </li>
</ul>
<p v-else>No todos left!</p>

Reference


上一篇
【Day 12】淺入淺出 Rails with Vue - Vue 的基本概念 - 11
下一篇
【Day 14】淺入淺出 Rails with Vue - Vue 的基本概念 - 13
系列文
淺入淺出 Rails with Vue30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言