iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
Modern Web

30 天我與 Vue 的那些二三事系列 第 9

Day 9 - 元件的資料傳輸(1)

  • 分享至 

  • xImage
  •  

在Vue中,元件間資料溝通傳遞的方式,一直都是個不容忽視的問題,妥善處理資料流,也是身為工程師的必學課題。

如果沒用元件,當我們今天想要分離多個資料流的問題的時候,可能就會面臨以下的情況。

<template>
  <div id="app">
  <button @click="count++">You clicked me {{ count }} times.</button>
  <button @click="count++">You clicked me {{ count }} times.</button>
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return {
      count:0
    };
  },
};
</script>

上面是一個點擊計數器的範例,當我們點擊畫面按鈕的時候,按鈕裡面的數字也會隨著增加。
https://ithelp.ithome.com.tw/upload/images/20210924/20128925RbxlzxN6ni.png

當我按下其中一個按鈕的時候,兩個按鈕內的 count 都增加了! 這是因為這兩個按鈕共用同一份 count 的資料流。

我們雖然可以新增新的物件去儲存別的資料,可以用 count1 、 count2 ,這樣新增下去。

我們雖然透過這樣來避開錯誤,讓每一個按鈕擁有各自的物件來儲存資料流,但這樣我們的程式也失去了彈性,有幾個按鈕就必須事先新增幾個 count 的屬性,這樣將難以reuse與maintain。

如果將其元件化,並把資料流抽離出來,可以寫成以下的程式碼:

<template>
  <div id="app">
    <!--<button @click="count++">You clicked me {{ count }} times.</button>
    <button @click="count++">You clicked me {{ count }} times.</button>-->
    <buttonCount></buttonCount>
    <buttonCount></buttonCount>
  </div>
</template>

<script>
const local_component = {
  // options
  data() {
    return {
      count: 0,
    };
  },
  template: `<button @click="count++">You clicked me {{ count }} times.</button>`,
};
export default {
  name: "App",
  components: {
    buttonCount: local_component,
  },
};
</script>

像這樣,我們將計數器包裝成獨立的元件 <buttonCount>,雖然同樣是計數器元件,但各自的 count 資料屬性都是獨立的,並不會因為按了 A 按鈕,B 按鈕就跟著加一。

如果要新增多組計數器,我們也只需要在 View 中繼續增加 <buttonCount>的數量就可以了,不必擔心彼此的資料是否衝突。


Hi, I am Grant.

個人部落格 - https://grantliblog.wordpress.com/
個人網站 - https://grantli-website.netlify.app/#/mainpage
我的寫作專題 - https://vocus.cc/user/5af2e9b5fd89780001822db4#


上一篇
Day 8 - 初探Vue Component
下一篇
Day 10 - 元件的資料傳輸(2)
系列文
30 天我與 Vue 的那些二三事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言