vue2中的mixin

2023-11-11

1、什么是Mixin混入:

混入(Mixin)是 Vue.js 中用于复用部分组件逻辑的一种技术。通过混入,你可以将组件的方法,生命周期钩子,甚至 data 都进行复用。

混入的基本工作原理是把一个特定的对象“混入”到另外一个对象之中,如方法,组件选项等。它允许你写出可复用的代码并且可以插入到Vue实例中,或者本地组件中。

举个例子,如果你有一些组件,他们都需要在创建时(created钩子)请求数据,那么你就可以把这个请求的逻辑写进一个混入的对象中。然后在需要请求数据的组件中引入这个混入对象,这些组件就会拥有相同的创建逻辑。

同样的,如果你想让许多组件有相同的方法,也可以将它们写入混入对象,然后将这个混入对象引入至你的组件中。这样就可以减少重复代码,提高代码复用性。

Vue2 中,可以使用 Vue.mixin() 方法来全局注册混入,也可以在单个 Vue 组件中使用mixins选项来使用混入。

注意的是,混入对象的钩子将在组件自身钩子之前调用遇到同名选项时,比如 methodscomponents或者 props混入对象的选项会被合并到组件的选项中。对于同名的方法,混入的方法会在组件的方法之前调用

2、使用场景:

当在多个组件中有相同的业务逻辑时,可以使用mixin,在mixin中定义这些公共的逻辑,然后在需要的组件中引入,在全局引入的时候可以用Vue.mixin,局部引入可以在组件的mixins选项中声明。
混入可以避免组件之间大量重复相同的方法或者逻辑代码,把这些公共的方法或者逻辑代码抽离出来,定义为一个混入对象,在不同的组件中调用,从而实现代码重用。

以下是一些可能会使用混入的场景

  1. 数据格式化:通常我们可能需要在多个组件中实现对某一类型的数据进行格式化,可以通过mixin编写一个统一的数据格式化方法并混入各个组件中。
let formatMixin = {
    methods: {
        formatData(data) {
            // 实现数据格式化逻辑
        }
    }
}
export default formatMixin;

然后在需要使用的组件中,使用import引入即可。

  1. 功能复用:例如我们在多个视图组件中都需要实现类似的滚动加载,可以通过mixin编写一段通用的滚动加载逻辑并混入。
let scrollMixin = {
    directives: {
        'scroll-more': {
            bind: (el, binding) => {
                let callback = binding.value;
                el.addEventListener('scroll', () => {
                    if (el.scrollHeight - el.scrollTop - el.clientHeight < 10) {
                        callback();
                    }
                })
            }
        }
    }
}
export default scrollMixin;
  1. 对外提供插件或工具:例如我们要编写一套跨项目使用的输入验证工具,我们可以通过mixin封装我们的验证逻辑并对外发布,让其他项目在使用时可以以混入的方式获得输入验证的能力。

每个组件使用 mixin 时,mixins 选项接收一个混入对象的数组。

import MyPlugin from 'my-plugin'
export default {
  mixins: [MyPlugin],
  // ...
}

需要注意的是,当组件和混入对象含有同名选项时,这些选项将以适当的方式进行“合并”。像 data,methods,components,directives 等选项的合并,采取的策略是:同名钩子函数将合并为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子之前调用。像 data 这样的对象选项,应当以组件的数据优先。

3、使用步骤:

以下是在 Vue2 中使用mixin的主要步骤:

  • 首先,我们需要创建一个 mixin对象。mixin 对象可以包含任何组件选项。当组件使用了这个 mixin 对象时,所有的 mixin 对象选项将被“混入”到这个组件的选项中。

示例:

//创建一个mixin
var myMixin = {
  data: function () {
    return {
      message: 'hello',
      foo: 'abc'
    }
  },
  methods: {
    showMessage: function () {
      alert(this.message);
    }
  }
}
  • 接下来,我们可以在一个组件中使用这个 mixin。用 Vue 的 mixins 选项让组件使用这个 mixin。如此一来,组件就得到了 mixin 中的数据和方法。

示例:

var Component = Vue.extend({
  mixins: [myMixin]
})

这样,Component 实例就可以直接使用 myMixin 定义的数据和方法了

需要注意的是,当发生冲突时(即组件和混入对象含有同名选项),会有一些规则:

  • 数据对象:在冲突的情况下,组件数据优先级高于mixin

  • 生命周期函数:不论是 Vue 的生命周期钩子还是自定义钩子,两者都会被调用。而且 mixin 的钩子在组件自己的钩子之前调用。

  • 选项合并Vue.js 使用自定义的合并策略来合并 methods, componentsdirectives等。如果组件与混入对象有冲突,则组件选项优先级较高。

var mixin = {
  created: function () {
    console.log('混入对象的钩子被调用')
  }
}

new Vue({
  mixins: [mixin],
  created: function () {
    console.log('组件的钩子被调用')
  }
})

// => "混入对象的钩子被调用"
// => "组件的钩子被调用"

4、与vuex的区别:

vuex是Vue的状态管理工具,它采用集中式存储管理应用的状态,适用于大型应用,mixin更多的是解决不同组件之间逻辑复用的问题,适用于任何类型的应用。

项目 Vue2中的Mixin混入 Vuex
定义 Mixins在Vue.js中是一种代码复用技术. 允许用户在多个组件中复用JavaScript功能 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,使用集中式存储来管理所有组件的状态
使用场景 对于那些多个组件间具有相同或类似功能的场景特别适合,避免代码冗余和重复。 比如全局的提醒/通知,共享一些工具函数等。 当你处理多个组件共享状态时,Vuex会更有益处. 如果几个视图需要处理同样的状态,那么你更应该使用Vuex了。 Vuex让我们可以在应用的所有组件中获取和设置应用状态的一个引用
组件访问 任何组件使用mixin后,mixin内容将融入到该组件本身,可以使用this来直接访问 Vuex的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地更新
插件兼容 不是必要的,可以在任何Vue项目中使用mixin,无需像Vuex一样作为插件来使用 Vuex是Vue的官方插件,需要在项目中单独通过Vue.use()方法来安装使用
开发团队 通常在一个团队中开发时,由于不同人的开发习惯和水平不同,频繁使用mixin可能会带来一些混乱问题,比如命名冲突,覆盖问题等 Vuex的状态管理模式使得状态的变化更为可预测和理解,对于协同开发和维护大型项目特别有用
数据源 mixin是分散的,每个组件都有可能有自己的mixin,无法做到像vuex一样集中管理 Vuex所有的状态信息都是集中在一个对象中,易于管理和维护

5、与公共组件的区别:

mixin是一种抽象出通用逻辑代码的手段,对于某些类似的逻辑或者相同的逻辑,只编写一次,可以分发到各个组件中,可以减少代码冗余,公共组件则是一个具体的、可视的代码片段,可以直接使用。例如,你可能会拥有一页公共头部、页脚或者侧边栏。

Mixin混入 公共组件
定义 Mixin在Vue2中是一种分发Vue组件中的可复用功能的非常灵活的方式。一个Mixin对象可以包含任意组件选项。当组件使用mixin对象时,所有mixin对象的选项将被混入该组件本身的选项。 公共组件是一种可在任何其他组件中复用的组件,它根据输入的属性和触发的事件有特定的功能。公共组件可以是任何的Vue component,只要它设置了正确的输入和输出。
用途 Mixin混入用于封装一些通用的方法和数据,不涉及DOM操作,没有具体的模板渲染,更易于代码的组织和复用,有利于代码的维护。 公共组件被用于重复利用模板和一些对应的逻辑。一旦我们创建了公共组件,我们就可以在任何其他组件中复用它,只需将需要的数据传入即可。
引入 Mixin扩展可以全局引入也可以局部引入,在全局引入的时候之后的所有组件中都可使用,局部引入则只有当前组件可使用。 公共组件经常在Vue的组件中通过import的方式引入,并在components选项内部局部注册后,才能在模板中使用。
注意项 Mixin会和Component进行合并操作,也就是说如果Component本身存在于Mixin相同的选项或者函数的话,Component的内容会覆盖mixin的内容。如果函数同名,执行顺序为先混入的后执行。 公共组件需要设计得足够通用,并具有清晰的输入和输出接口,才能保证在各种场景下都能使用。需要注意的是,当公共组件的内部状态发生更改时,应该及时发出事件来通知父组件,以保持数据的一致性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue2中的mixin 的相关文章

  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • 渲染货币和符号并与来自不同单元格的数据相结合

    我正在使用最新的 jQuery DataTables v1 10 7 我正在尝试将数字解析为以下格式 239 90 USD 我可以使用此命令使货币正常工作 columns data Price render fn dataTable ren
  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • 为什么 iife 在一个简单的例子中不起作用?

    我不明白为什么函数表达式调用不起作用并抛出错误 你能给我解释一下吗 var a function x alert x function a 1 谢谢大家 任务比我想象的要容易得多 这是因为 JS 将 IIFE 解析为函数的参数调用 这样做时
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • 在新的 Google 协作平台 <嵌入 HTML> 中使用 localStorage 和 IndexedDB 不起作用

    我正在尝试将新的 Google 协作平台用于我开发的网页 但是 我在存储本地数据时遇到了问题 本地文件在 Windows 和 Apple safari chrome 中运行良好 从 Google 协作平台尝试一下 没有什么乐趣 此外 在 s
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 如何针对 Node.js 中发生的每个错误发送电子邮件?

    假设我的 node js 应用程序正在运行 如果出现错误 我的意思是所有错误 不仅仅是网络错误 如果出现错误 则很重要 我如何调用函数向我发送电子邮件 基本上 在我希望它写入 err out 之前 我希望向我发送一封电子邮件 我正在使用no
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐

  • 如何使用 Java List 和 ListArray 的 remove() 方法

    介绍 Java列表remove 方法用于从列表中删除元素 ArrayList是最广泛使用的实现列表界面 所以这里的例子将使用ArrayList remove 方法 Java列表remove Methods 那里有两个remove 方法从列表
  • 在 SSH Unix 服务器上运行 Shell 命令的 Java JSch 示例

    今天我们将研究 JSch 示例教程 我们可以使用 JSch 在 java 中创建 SSH 连接 早些时候我写了一个程序来连接SSH服务器上的远程数据库 今天 我将介绍一个可用于连接到启用 SSH 的服务器并执行 shell 命令的程序 我在
  • R 中的 Paste() 函数 - 简要指南

    在R 中使用paste 函数将是直接且简单的 在本教程中 让我们看看如何使用paste 来连接字符串和值 paste 从多个向量中获取多个元素并将它们连接成一个元素 除了paste 函数之外 R还有另一个名为paste0 的函数 是的 你没
  • DigitalOcean 的技术写作指南

    DigitalOcean 很高兴能够继续构建与服务器管理和软件工程相关的技术文章集 为了确保 DigitalOcean 文章具有一致的质量和风格 我们制定了以下准则 本指南分为四个部分 Style 我们编写技术教程的高级方法 结构 对我们的
  • 如何使用 Vanilla JavaScript 和 HTML 创建拖放元素

    介绍 拖放是一种常见的用户交互 您可以在许多图形用户界面中找到它 有预先存在的 JavaScript 库可用于向您的应用程序添加拖放功能 但是 在某些情况下 库可能不可用 或者会引入项目不需要的开销或依赖项 在这些情况下 了解现代 Web
  • 如何在 Ubuntu 18.04 上安装 Apache Tomcat 9

    介绍 Apache Tomcat 是一个 Web 服务器和 servlet 容器 用于为 Java 应用程序提供服务 Tomcat 是 Java Servlet 和 JavaServer Pages 技术的开源实现 由 Apache Sof
  • 如何在 Apache Web 服务器中安装、配置和使用模块

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • 如何使用 Python 调试器

    介绍 在软件开发中 调试是查找并解决阻止软件正常运行的问题的过程 Python调试器为Python程序提供了调试环境 它支持设置条件断点 一次一行单步执行源代码 堆栈检查等 先决条件 您应该在计算机或服务器上安装 Python 3 并设置编
  • 如何在 Apache 上为 Debian 8 创建 SSL 证书

    介绍 本教程将引导您完成使用 SSL 证书保护的 Apache 服务器的设置和配置 在本教程结束时 您将拥有一个可通过 HTTPS 访问的服务器 SSL 基于将大整数解析为其同样大的质因数的数学难题 使用它 我们可以使用私钥 公钥对来加密信
  • 如何在 DigitalOcean 上使用 WordPress 一键安装

    介绍 WordPress是世界上最受欢迎的内容管理和博客平台之一 可让您高效地创建和管理网站内容 本教程将指导您使用以下命令设置 WordPress 网站WordPress 一键式应用程序 一键部署 除了常规 Ubuntu 20 04 Dr
  • localStorage和sessionStorage简介

    介绍 The localStorage and sessionStorage对象是 Web 存储 API 的一部分 是用于在本地保存键 值对的两个出色工具 使用localStorage and sessionStorage用于存储是使用 c
  • vue 遍历目录下的文件,获取图片名并直接遍历渲染

    使用场景 搭了个资源网站 想直接遍历显示当前图片目录下的所有图片 但是图片名字乱七八糟花里胡哨 举例说明获取目录下的文件名 新创建一个 vue 项目 获取 views 目录下的以 vue 结尾的文件的文件名 mounted 参数 1 路径
  • web安全漏洞总结

    目录 一 网络安全常见漏洞 1 sql注入漏洞 漏洞解释与形成原因 漏洞分类 漏洞存在常见地方 漏洞利用 漏洞防御 攻击流量特征 绕开waf拦截的常用方法 2 文件上传漏洞 漏洞解释与形成原因 漏洞利用 漏洞存在常见地方 漏洞防御 绕开wa
  • 各类常用符号

    常用符号 1 几何符号 2 代数符号 3 运算符号 如加号 减号 乘号 或 除号 或 两个集合的并集 交集 根号 对数 log lg ln 比 微分 dx 积分 曲线积分 等 4 集合符号 5 特殊符号 圆周率 6 推理符号 a
  • 项目环境由pytorch1.10升级1.11中间要改的东西

    1 THC THCDeviceUtils cuh 该文件弃用 nightly missing THC THCDeviceUtils cuh include
  • VMware中CentOS7.5 启用NAT模式配置静态IP连接外网

    1 在cmd中查看本机VMnet8的ipv4地址及子网掩码 C gt ipconfig 2 在VMware里 依次点击 编辑 虚拟网络编辑器 如下图 选择NAT模式 3 取消勾选 使用本地DHCP服务将IP分配给虚拟机 这个选项 配置子网i
  • STM32与BLE蓝牙通信 Android APP配置(二)

    事务的难度远远低于对事物的恐惧 0 前言 在 Android BLE蓝牙配置全流程 一 附APP源码 中已经完成了前期的准备工作 在这里我们得到了需要连接的蓝牙设备的名字和地址 需要完成蓝牙设备的连接和数据传输功能 1 初始化界面 首先需要
  • 成都瀚网科技:抖音发作品到底需要多久的时间才能够给流量呢?

    如果在抖音平台上面发作品 那自然也需要先去了解一下抖音发作品到底应该要怎么做才能够火 另外也要清楚抖音发作品到底需要多久的时间才能够给流量呢 1 视频时长 注意视频时长问题 一般抖音用户 只能上传60秒内的视频 但严格意义上 抖音最喜欢的是
  • 2.1.1 匹配位置的元字符

    匹配位置的元字符包括 3 个字符 和 b 其中 脱字符号 通常在文章中插入字时使用 和 美元符号 都匹配一个位置 它们分别匹配行的开始和结尾 以下正则表达式匹配以 String 开头的行 即被匹配的行的第一个字符串为 String Stri
  • vue2中的mixin

    1 什么是Mixin混入 混入 Mixin 是 Vue js 中用于复用部分组件逻辑的一种技术 通过混入 你可以将组件的方法 生命周期钩子 甚至 data 都进行复用 混入的基本工作原理是把一个特定的对象 混入 到另外一个对象之中 如方法