From 39e7447e704c43f08a7b2994acbec9d4ad8c2264 Mon Sep 17 00:00:00 2001
From: bunny <1319900154@qq.com>
Date: Thu, 19 Jun 2025 07:25:00 +0800
Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Vue2=20Mixins=20=E6=B7=B7=E5=85=A5?=
=?UTF-8?q?=E6=9C=BA=E5=88=B6=E8=AF=A6=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
vue2-tutorials/single-file/demo2/package.json | 2 +-
vue2-tutorials/single-file/demo2/src/App.vue | 5 +-
vue2-tutorials/single-file/demo2/src/main.js | 13 +-
.../views/demo3/Vue2 Mixins 混入机制详解.md | 173 ++++++++++++++++++
.../src/views/demo3/components/SchoolInfo.vue | 23 +++
.../demo2/src/views/demo3/index.vue | 14 ++
.../demo2/src/views/demo3/mixins/test1.js | 12 ++
7 files changed, 233 insertions(+), 9 deletions(-)
create mode 100644 vue2-tutorials/single-file/demo2/src/views/demo3/Vue2 Mixins 混入机制详解.md
create mode 100644 vue2-tutorials/single-file/demo2/src/views/demo3/components/SchoolInfo.vue
create mode 100644 vue2-tutorials/single-file/demo2/src/views/demo3/index.vue
create mode 100644 vue2-tutorials/single-file/demo2/src/views/demo3/mixins/test1.js
diff --git a/vue2-tutorials/single-file/demo2/package.json b/vue2-tutorials/single-file/demo2/package.json
index efc0f1a..5a2e6e7 100644
--- a/vue2-tutorials/single-file/demo2/package.json
+++ b/vue2-tutorials/single-file/demo2/package.json
@@ -41,4 +41,4 @@
"not dead"
],
"packageManager": "pnpm@10.8.1+sha512.c50088ba998c67b8ca8c99df8a5e02fd2ae2e2b29aaf238feaa9e124248d3f48f9fb6db2424949ff901cffbb5e0f0cc1ad6aedb602cd29450751d11c35023677"
-}
+}
\ No newline at end of file
diff --git a/vue2-tutorials/single-file/demo2/src/App.vue b/vue2-tutorials/single-file/demo2/src/App.vue
index 5371a20..31109f7 100644
--- a/vue2-tutorials/single-file/demo2/src/App.vue
+++ b/vue2-tutorials/single-file/demo2/src/App.vue
@@ -3,15 +3,18 @@
+
+
diff --git a/vue2-tutorials/single-file/demo2/src/main.js b/vue2-tutorials/single-file/demo2/src/main.js
index d74624b..74f1ec5 100644
--- a/vue2-tutorials/single-file/demo2/src/main.js
+++ b/vue2-tutorials/single-file/demo2/src/main.js
@@ -1,9 +1,8 @@
-import Vue from 'vue'
-import App from './App.vue'
+import Vue from "vue";
+import App from "./App.vue";
-Vue.config.productionTip = false
+Vue.config.productionTip = false;
-new Vue({
- render: h => h(App),
-})
-.$mount('#app')
+new Vue({
+ render: (h) => h(App),
+}).$mount("#app");
diff --git a/vue2-tutorials/single-file/demo2/src/views/demo3/Vue2 Mixins 混入机制详解.md b/vue2-tutorials/single-file/demo2/src/views/demo3/Vue2 Mixins 混入机制详解.md
new file mode 100644
index 0000000..d907e20
--- /dev/null
+++ b/vue2-tutorials/single-file/demo2/src/views/demo3/Vue2 Mixins 混入机制详解.md
@@ -0,0 +1,173 @@
+# Vue2 Mixins 混入机制详解
+
+## 一、基本概念
+
+Mixins(混入)是 Vue2 中用于分发组件可复用功能的灵活方式。一个混入对象可以包含任意组件选项,当组件使用混入对象时,所有混入对象的选项将被"混合"进入组件本身的选项。
+
+## 二、代码示例解析
+
+### 1. 混入对象定义 (test1.js)
+```javascript
+export const test1 = {
+ data() {
+ return {
+ username: "Bunny" // 将被合并到组件data中
+ };
+ },
+ methods: {
+ showMessage() { // 将被合并到组件methods中
+ alert(`展示消息:${this.username}`);
+ }
+ }
+};
+```
+
+### 2. 组件中使用混入 (SchoolInfo.vue)
+```html
+
+
+
学生姓名-showMessage:{{ username }}
+ 学习性别:{{ sex }}
+ 学生年龄:{{ age + 1 }}
+
+
+
+
+```
+
+## 三、合并策略详解
+
+### 1. 选项合并规则
+| 选项类型 | 合并策略 | 示例结果 |
+| ------------ | ---------------------- | ---------------------------- |
+| data | 递归合并,组件优先 | 同名属性以组件为准 |
+| methods | 合并,组件优先 | 同名方法覆盖 |
+| 生命周期钩子 | 合并为数组,混入先执行 | 都会调用,顺序: mixin → 组件 |
+| 其他对象值 | 组件优先 | 如components, directives等 |
+
+### 2. 合并过程示例
+```javascript
+// 混入data
+{ username: "Bunny" }
+
+// 组件data
+{
+ username: "Bunny", // 同名属性被保留
+ sex: "🚺",
+ age: 16
+}
+
+// 最终合并结果
+{
+ username: "Bunny", // 来自组件
+ sex: "🚺", // 来自组件
+ age: 16 // 来自组件
+}
+```
+
+## 四、最佳实践
+
+### 1. 命名规范
+- 混入文件使用 `mixin-` 前缀(如 `mixin-logger.js`)
+- 混入变量使用 `mixin` 后缀(如 `userMixin`)
+- 避免与组件属性和方法重名
+
+### 2. 使用建议
+- **适合场景**:
+ - 多个组件共享相同逻辑
+ - 功能模块解耦
+ - 插件开发
+
+- **避免场景**:
+ - 过度使用导致代码难以追踪
+ - 复杂的多层级混入
+
+### 3. 全局混入
+```javascript
+// 谨慎使用!会影响所有Vue实例
+Vue.mixin({
+ created() {
+ console.log('全局混入的created钩子');
+ }
+});
+```
+
+## 五、高级用法
+
+### 1. 自定义合并策略
+```javascript
+Vue.config.optionMergeStrategies.myOption = (parent, child, vm) => {
+ return child || parent;
+};
+```
+
+### 2. 混入组合
+```javascript
+// featureMixin.js
+export const featureMixin = {
+ methods: {
+ featureMethod() { /*...*/ }
+ }
+};
+
+// 组件中使用多个混入
+import { userMixin, featureMixin } from './mixins';
+export default {
+ mixins: [userMixin, featureMixin]
+}
+```
+
+### 3. 混入与插件结合
+```javascript
+// plugin.js
+export default {
+ install(Vue) {
+ Vue.mixin({
+ mounted() {
+ console.log('来自插件的混入');
+ }
+ });
+ }
+};
+```
+
+## 六、常见问题
+
+1. **属性冲突**:
+ - 数据对象:组件data优先
+ - 方法:组件methods优先
+ - 钩子函数:都会执行,混入的先执行
+
+2. **调试技巧**:
+ ```javascript
+ mounted() {
+ console.log(this.$options); // 查看合并后的选项
+ }
+ ```
+
+3. **与Vue3的区别**:
+ - Vue3 使用 Composition API 替代混入
+ - 提供 `setup` 函数更好地组织逻辑
+
+## 七、替代方案比较
+
+| 方案 | 优点 | 缺点 |
+| --------------- | -------------- | ---------------- |
+| Mixins | 逻辑复用简单 | 命名冲突风险 |
+| 高阶组件 | 明确props传递 | 组件嵌套层次深 |
+| 插件 | 全局功能扩展 | 过度使用影响性能 |
+| Composition API | 更好的代码组织 | 仅Vue3支持 |
diff --git a/vue2-tutorials/single-file/demo2/src/views/demo3/components/SchoolInfo.vue b/vue2-tutorials/single-file/demo2/src/views/demo3/components/SchoolInfo.vue
new file mode 100644
index 0000000..0c96ed4
--- /dev/null
+++ b/vue2-tutorials/single-file/demo2/src/views/demo3/components/SchoolInfo.vue
@@ -0,0 +1,23 @@
+
+
+
学生姓名-showMessage:{{ username }}
+ 学习性别:{{ sex }}
+ 学生年龄:{{ age + 1 }}
+
+
+
+
diff --git a/vue2-tutorials/single-file/demo2/src/views/demo3/index.vue b/vue2-tutorials/single-file/demo2/src/views/demo3/index.vue
new file mode 100644
index 0000000..e59dea5
--- /dev/null
+++ b/vue2-tutorials/single-file/demo2/src/views/demo3/index.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/vue2-tutorials/single-file/demo2/src/views/demo3/mixins/test1.js b/vue2-tutorials/single-file/demo2/src/views/demo3/mixins/test1.js
new file mode 100644
index 0000000..edd12bb
--- /dev/null
+++ b/vue2-tutorials/single-file/demo2/src/views/demo3/mixins/test1.js
@@ -0,0 +1,12 @@
+export const test1 = {
+ data() {
+ return {
+ username: "Bunny",
+ };
+ },
+ methods: {
+ showMessage() {
+ alert(`展示消息:${this.username}`);
+ },
+ },
+};