文章

透過 Mixins 重複利用邏輯

在 Vue 3 中,Mixins 是一種複用邏輯的方式,允許你將可重用的邏輯提取到一個共享的代碼塊中,並在多個組件中使用它們。這對於多個組件需要相同的行為或功能時非常有用,避免了代碼重複。

1. 什麼是 Mixins?

Mixin 是一個包含可重用邏輯的對象,它可以包含數據、生命周期鉤子、方法、計算屬性等。當一個組件使用了某個 mixin 時,mixin 的邏輯會合併到該組件中。這樣組件可以共享相同的邏輯,無需重複編寫。

2. 定義和使用 Mixin

定義 Mixin:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// mixins/myMixin.js
export default {
  data() {
    return {
      message: '這是來自 mixin 的訊息',
    };
  },
  methods: {
    greet() {
      console.log('你好,這是來自 mixin 的方法');
    },
  },
  mounted() {
    console.log('mixin 的 mounted 被調用');
  },
};

在這個範例中:

  • message 是來自 Mixin 的數據屬性。
  • greet 是來自 Mixin 的方法。
  • mounted 是來自 Mixin 的生命周期鉤子。

使用 Mixin:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// MyComponent.vue
<template>
  <div>
    <p></p>
    <button @click="greet">點擊我</button>
  </div>
</template>

<script>
import myMixin from './mixins/myMixin.js';

export default {
  mixins: [myMixin],
};
</script>

在這個組件中:

  • mixins 選項用於引入 Mixin,並將其邏輯合併到組件中。
  • 這樣 messagegreet 都會成為該組件的一部分,可以在模板中使用。

3. Mixins 的合併策略

Vue 會將組件和 Mixin 中的選項合併。對於數據、方法和生命周期鉤子,有不同的合併策略:

  • 數據:如果組件和 Mixin 都有 data 屬性,會優先使用組件的數據。如果數據是對象,Vue 會合併這些對象。
  • 方法:組件和 Mixin 中的方法會合併,當它們有相同的名稱時,會優先使用組件的版本。
  • 生命周期鉤子:組件和 Mixin 中的鉤子會被合併,並按順序執行,先執行 Mixin 的鉤子,再執行組件的鉤子。

生命週期鉤子合併範例:

1
2
3
4
5
6
// mixins/myMixin.js
export default {
  mounted() {
    console.log('來自 mixin 的 mounted');
  },
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// MyComponent.vue
<template>
  <div>組件內容</div>
</template>

<script>
import myMixin from './mixins/myMixin.js';

export default {
  mixins: [myMixin],
  mounted() {
    console.log('來自組件的 mounted');
  },
};
</script>

結果:

1
2
來自 mixin 的 mounted
來自組件的 mounted

4. Mixins 的應用場景

Mixins 適合在多個組件之間共享邏輯的場景。常見應用包括:

  • 表單處理:多個表單組件需要相似的驗證邏輯,可以將驗證邏輯放在 Mixin 中,並在每個表單組件中重複使用。
  • API 請求:如果多個組件需要相同的 API 請求邏輯,可以將請求邏輯提取到 Mixin 中進行共享。
  • 事件監聽器:例如,所有組件都需要監聽窗口大小變化,這樣的邏輯可以封裝在 Mixin 中。

5. Mixins 的缺點和替代方案

儘管 Mixins 在邏輯重用方面很有用,但它也有一些缺點:

  • 來源不明:當組件使用了多個 Mixins 時,組件的行為可能會變得不明確,因為邏輯可能來自多個地方。
  • 命名衝突:如果不同的 Mixins 定義了相同名稱的數據或方法,可能會導致意想不到的覆蓋問題。

為了減少這些問題,Vue 3 提供了 組合式 API (Composition API),作為 Mixins 的替代方案。組合式 API 通過將邏輯封裝在可重用的 setup 函數中,讓代碼更加明確和可控。


總結

  • Mixins 是 Vue 3 中一種強大的邏輯重用工具,允許你將可重用的邏輯提取到共享對象中,並在多個組件中使用。
  • 合併策略 讓你能夠將組件和 Mixin 中的邏輯合併在一起,避免重複代碼。
  • 雖然 Mixins 提供了便捷的代碼重用方式,但隨著應用的規模增大,可能會導致組件行為變得不明確,這時可以考慮使用 組合式 API 作為替代方案。

Mixins 非常適合小型或中型應用中進行簡單邏輯重用,但在更大型的應用中,應根據需求選擇最合適的解決方案。

本文章以 CC BY 4.0 授權