vue2中的mixins混入

news/2024/11/30 9:46:21/

目录

引言:

一、什么是混入?

mixins

基础

选项合并

全局混入

自定义选项合并策略

二、mixins混入的优势

三、mixins混入的最佳实践

结论:


引言:

在Vue.js开发中,我们经常会遇到一些场景,多个组件之间需要共享一些相似的逻辑或功能。如果每个组件都独立实现这些逻辑,会导致代码冗余和维护困难。为了解决这个问题,Vue.js提供了mixins混入功能,它允许我们将可复用的代码逻辑封装成一个混入对象,然后在多个组件中引入并使用。

一、什么是混入?

在Vue.js中,mixins混入是一种将可复用的代码逻辑封装成一个对象,然后通过混入机制将其注入到组件中的一种方式。混入对象可以包含组件选项、生命周期钩子、方法等,它们会被合并到组件中,从而实现代码的复用。、

mixins

  • 类型Array<Object>

  • 详细

    mixins 选项接收一个混入对象的数组。这些混入对象可以像正常的实例对象一样包含实例选项,这些选项将会被合并到最终的选项中,也就是说,如果你的混入包含一个 created 钩子,而创建组件本身也有一个,那么两个函数都会被调用。

    Mixin 钩子按照传入顺序依次调用,并在调用组件自身的钩子之前被调用。

  • var mixin = {created: function () { console.log(1) }
    }
    var vm = new Vue({created: function () { console.log(2) },mixins: [mixin]
    })
    // => 1
    // => 2

    基础

混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

例子:

// 定义一个混入对象
var myMixin = {created: function () {this.hello()},methods: {hello: function () {console.log('hello from mixin!')}}
}// 定义一个使用混入对象的组件
var Component = Vue.extend({mixins: [myMixin]
})var component = new Component() // => "hello from mixin!"

选项合并

当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”。

比如,数据对象在内部会进行递归合并,并在发生冲突时以组件数据优先。

var mixin = {data: function () {return {message: 'hello',foo: 'abc'}}
}new Vue({mixins: [mixin],data: function () {return {message: 'goodbye',bar: 'def'}},created: function () {console.log(this.$data)// => { message: "goodbye", foo: "abc", bar: "def" }}
})

同名钩子函数将合并为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子之前调用。

var mixin = {created: function () {console.log('混入对象的钩子被调用')}
}new Vue({mixins: [mixin],created: function () {console.log('组件钩子被调用')}
})// => "混入对象的钩子被调用"
// => "组件钩子被调用"

值为对象的选项,例如 methodscomponents 和 directives,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。

var mixin = {methods: {foo: function () {console.log('foo')},conflicting: function () {console.log('from mixin')}}
}var vm = new Vue({mixins: [mixin],methods: {bar: function () {console.log('bar')},conflicting: function () {console.log('from self')}}
})vm.foo() // => "foo"
vm.bar() // => "bar"
vm.conflicting() // => "from self"

全局混入

混入也可以进行全局注册。使用时格外小心!一旦使用全局混入,将影响每一个之后创建的 Vue 实例。使用恰当时,这可以用来为自定义选项注入处理逻辑。

// 为自定义的选项 'myOption' 注入一个处理器。
Vue.mixin({created: function () {var myOption = this.$options.myOptionif (myOption) {console.log(myOption)}}
})new Vue({myOption: 'hello!'
})
// => "hello!"

请谨慎使用全局混入,因为它会影响每个单独创建的 Vue 实例 (包括第三方组件)。大多数情况下,只应当应用于自定义选项,就像上面示例一样。推荐将其作为插件发布,以避免重复应用混入。

自定义选项合并策略

自定义选项将使用默认策略,即简单地覆盖已有值。如果想让自定义选项以自定义逻辑合并,可以向 Vue.config.optionMergeStrategies 添加一个函数:

Vue.config.optionMergeStrategies.myOption = function (toVal, fromVal) {// 返回合并后的值
}

对于多数值为对象的选项,可以使用与 methods 相同的合并策略:

var strategies = Vue.config.optionMergeStrategies
strategies.myOption = strategies.methods

可以在 Vuex 1.x 的混入策略里找到一个更高级的例子:

const merge = Vue.config.optionMergeStrategies.computed
Vue.config.optionMergeStrategies.vuex = function (toVal, fromVal) {if (!toVal) return fromValif (!fromVal) return toValreturn {getters: merge(toVal.getters, fromVal.getters),state: merge(toVal.state, fromVal.state),actions: merge(toVal.actions, fromVal.actions)}
}

二、mixins混入的优势

使用mixins混入功能有以下几个优势:

  1. 代码复用:通过将可复用的代码逻辑封装成混入对象,可以在多个组件中共享使用,减少代码冗余。

  2. 组件解耦:混入功能可以将组件的逻辑和功能解耦,使得组件更加清晰和可维护。

  3. 灵活性:混入对象的选项可以被组件中的选项覆盖,使得我们可以根据具体需求进行定制和扩展。

三、mixins混入的最佳实践

在使用mixins混入时,我们需要注意以下几点最佳实践:

  1. 避免命名冲突:混入对象中的选项可能会和组件中的选项冲突,为了避免命名冲突,我们可以使用命名空间或者前缀来区分。

  2. 明确混入顺序:当一个组件使用多个混入对象时,混入对象的选项会按照数组中的顺序进行合并。因此,我们需要明确混入对象的顺序,以确保选项的正确合并。

  3. 谨慎使用全局混入:Vue.js还提供了全局混入功能,可以在所有组件中自动注入混入对象。但是,全局混入可能会导致命名冲突和意外的行为,因此需要谨慎使用。

结论:

在Vue.js开发中,mixins混入功能是一个强大的工具,可以帮助我们实现代码的复用和组件的解耦。通过混入对象的合并规则,我们可以灵活地定制和扩展组件的功能。然而,在使用mixins混入时,我们需要注意避免命名冲突和明确混入顺序等最佳实践。希望本文能够帮助读者更好地理解和应用Vue.js中的mixins混入功能。


http://www.ppmy.cn/news/1205527.html

相关文章

MSR015/MSR025低温漂、低功耗电压基准

MSR015/MSR025 是低温漂、低功耗、高精度 CMOS 电压基准&#xff0c; 具有 0.05% 初始精度、低功耗特点。该器件的低输出电压迟滞和低长期输出电压 漂移特性&#xff0c;进一步提高稳定性和系统可靠性。 此外&#xff0c;器件的小尺寸和低运行 电流特性使其非常适合便携…

windows环境下PHP7.4多线程设置

windows环境下的PHP设置多线程时有一定的难度&#xff0c;难点主要是PHP版本的选择&#xff0c;多线程扩展的选择&#xff0c;以及相关的设置等。 环境 windows 10php-7.4.33-Win32-vc15-x64php_parallel-1.1.4-7.4-ts-vc15-x64phpstudy 8.1.1.2 为了快速的部署PHP环境&…

innovus:解决报告复制时一行拆成两行的问题

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; innovus复制报告时一行的东西出现在两行上&#xff0c;解决只需要一条命令: set_table_style -no_frame_width

FlinK之检查点与保存点机制

检查点与保存点 检查点Checkpoint概述保存时机保存与恢复检查点算法 检查点配置启用检查点指定存储位置其它配置通用增量 保存点Savepoint概述使用保存点切换状态后端 检查点Checkpoint 概述 在 Flink 中&#xff0c;检查点是用于实现状态一致性和故障恢复的关键机制。检查点功…

【MySQL数据库】 七

本文主要介绍了Java的JDBC编程的过程. 超详细 !!! 一.JDBC JDBC就是通过Java代码,来操作数据库 由于我们在实际开发中,绝大部分都是用代码来操作数据库的 , 因此一个成熟的数据库,都会提供一些API让程序员来使用. 常见的数据库比如mysql / oracl / sqlserver / SQLite 都会提…

git clone单个文件/文件夹、wget下载单文件

文章目录 1. 暂时没找到方法用git命令方便地clone单个文件/文件夹2. 通过wget手动下载单个文件 1. 暂时没找到方法用git命令方便地clone单个文件/文件夹 复杂&#xff0c;未测试 https://www.cnblogs.com/impw/p/15629514.html 2. 通过wget手动下载单个文件 在github/gitee网…

10 # 手写 every 方法

every 使用 every() 方法测试一个数组内的所有元素是否都能通过指定函数的测试。它返回一个布尔值。 ele&#xff1a;表示数组中的每一个元素index&#xff1a;表示数据中元素的索引array&#xff1a;表示数组 <script>var arr [1, 3, 5, 7, 8];var result arr.ever…

3D全景技术,为我们打开全新宣传领域

随着科技的发展&#xff0c;3D全景技术正在融入我们的生活&#xff0c;这种全新视觉体验方式为我们打开了一扇全新的宣传领域&#xff0c;可以让我们多方位、多视角地探索各个行业&#xff0c;无论是对教育、商业、还是其他领域&#xff0c;都产生了深远的影响。 3D全景技术结合…