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 + + + +``` + +## 三、合并策略详解 + +### 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 @@ + + + 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}`); + }, + }, +};