【 Vue 2 中的 Mixins 模式】

Vue 2 中的 Mixins 模式

在 Vue 2 里,mixins 是一种灵活的复用代码的方式,它能让你在多个组件间共享代码。借助 mixins,你可以把一些通用的选项(像 datamethodscomputed 等)封装到一个对象里,然后在多个组件中使用。

下面是 mixins 的基本使用示例:

javascript 复制代码
// 定义一个 mixin
const myMixin = {
    data() {
        return {
            mixinData: '这是 mixin 中的数据'
        }
    },
    methods: {
        mixinMethod() {
            console.log('这是 mixin 中的方法');
        }
    }
};

// 定义一个组件并使用 mixin
const MyComponent = {
    mixins: [myMixin],
    data() {
        return {
            componentData: '这是组件中的数据'
        }
    },
    methods: {
        componentMethod() {
            console.log('这是组件中的方法');
        }
    }
};

在这个例子中,MyComponent 组件使用了 myMixin,这意味着 MyComponent 能够访问 myMixin 里定义的 datamethods

选项合并规则

当组件使用 mixins 时,若组件和 mixin 存在同名选项,就需要依据一定规则进行合并:

数据对象(data

如果组件和 mixin 都定义了 data 选项,它们会递归合并。当出现键名冲突时,组件的数据会覆盖 mixin 的数据。

javascript 复制代码
const myMixin = {
    data() {
        return {
            message: 'mixin 消息'
        }
    }
};

const MyComponent = {
    mixins: [myMixin],
    data() {
        return {
            message: '组件消息'
        }
    }
};

// 创建组件实例
const vm = new Vue(MyComponent);
console.log(vm.message); // 输出: 组件消息

钩子函数

如果组件和 mixin 都定义了相同的钩子函数(如 createdmounted 等),这些钩子函数会被合并成一个数组,并且都会被调用。mixin 的钩子函数会先于组件的钩子函数执行。

javascript 复制代码
const myMixin = {
    created() {
        console.log('mixin 的 created 钩子');
    }
};

const MyComponent = {
    mixins: [myMixin],
    created() {
        console.log('组件的 created 钩子');
    }
};

// 创建组件实例
const vm = new Vue(MyComponent);
// 输出:
// mixin 的 created 钩子
// 组件的 created 钩子

方法、计算属性和 watch

如果组件和 mixin 存在同名的方法、计算属性或 watch,组件的定义会覆盖 mixin 的定义。

结合你提供的代码,MapBaseMarker.js 组件混入了 MapBaseMixin.js,两个文件里都有 init 方法。当 MapBaseMarker 组件实例化时,调用的 init 方法是 MapBaseMarker.js 文件里定义的 init 方法,而非 MapBaseMixin.js 里的 init 方法。

javascript 复制代码
// MapBaseMixin.js
const MapBaseMixin = {
    methods: {
        init() {
            console.log('MapBaseMixin 中的 init 方法');
        }
    }
};

// MapBaseMarker.js
export default {
    mixins: [MapBaseMixin],
    methods: {
        init() {
            console.log('MapBaseMarker 中的 init 方法');
        }
    }
};

// 当创建 MapBaseMarker 组件实例时,调用的 init 方法是 MapBaseMarker 中的 init 方法

综上所述,当组件和 mixin 存在同名方法时,组件自身的方法会覆盖 mixin 里的同名方法。

相关推荐
GIS之路5 分钟前
GDAL 实现矢量裁剪
前端·python·信息可视化
是一个Bug8 分钟前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu1213810 分钟前
React面向组件编程
开发语言·前端·javascript
计算机毕设VX:Fegn089514 分钟前
计算机毕业设计|基于springboot + vue二手家电管理系统(源码+数据库+文档)
vue.js·spring boot·后端·课程设计
持续升级打怪中32 分钟前
Vue3 中虚拟滚动与分页加载的实现原理与实践
前端·性能优化
GIS之路35 分钟前
GDAL 实现矢量合并
前端
hxjhnct38 分钟前
React useContext的缺陷
前端·react.js·前端框架
冰暮流星1 小时前
javascript逻辑运算符
开发语言·javascript·ecmascript
前端 贾公子1 小时前
从入门到实践:前端 Monorepo 工程化实战(4)
前端
菩提小狗1 小时前
Sqlmap双击运行脚本,双击直接打开。
前端·笔记·安全·web安全