Mixin从理论到实践

2023-11-15

mixin从理论到实践


一、什么是mixin

  • mixin混入 — Vue.js (vuejs.org)

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

  • 个人理解: 如果在写vue组件时,发现有几个组件的逻辑类似,那么就可以使用vue的mixin(混入),把类似的逻辑抽离出来封装成js,然后在各个组件引入使用。mixin是一种可以在Vue组件中复用代码的方式。mixin可以包含任意的组件选项,例如data、methods、computed、watch等。当一个组件使用mixin时,它会将mixin中的选项与组件本身的选项合并。如果有选项名称冲突,一般情况下组件选项将覆盖mixin选项。

  • 优势:

    • 代码重用和维护性:通过使用混入,可以将常用的样式、功能或逻辑集中在一个地方定义,避免了代码的重复编写,提高了代码的重用性。当需要修改或更新某个样式或功能时,只需修改混入的定义,所有使用该混入的组件或模板都会自动应用更新,提高了代码的维护性。
    • 抽象和可配置性:混入可以将通用的代码逻辑抽象出来,并提供参数以使其具有灵活性。通过传递不同的参数给混入,可以根据具体的需求来定制代码逻辑和样式,实现更强的可配置性。
    • 组件模块化和复合性:混入能够将多个功能或样式组合在一起,形成更丰富的组件模块。通过将不同的混入组合使用,可以快速创建出具有复杂功能和样式的组件,提高了前端开发的效率和灵活性。
  • 劣势:

    • 命名冲突和可读性:过度使用混入可能导致命名冲突,特别是当多个混入定义了相同的样式或功能时。这可能会增加代码的复杂性和维护成本,并降低代码的可读性。
    • 依赖关系和耦合:使用混入可能导致组件之间产生依赖关系,并增加它们之间的耦合度。如果修改了一个混入的定义,可能会影响到多个组件或模板,需要特别注意修改带来的潜在风险。
    • 性能影响:当多个混入被应用到一个组件或模板中时,可能会导致多余的代码和样式加载。这可能会对页面的性能产生一定影响,特别是在加载大量混入的情况下。
  • 由于mixin会导致命名冲突和混乱的依赖关系、灵活性和可读性问题,以及会导致编译效率和性能问题,在 Vue 3 中引入了更加灵活和可组合的 Composition API。Composition API 允许以函数的形式编写逻辑,并将其作为可复用的组合函数在组件中使用。这种方式提供了更好的代码组织结构、更明确的依赖关系和更高的可读性。通过 Composition API,开发者可以更灵活地组合功能并避免命名冲突。

  • 但并不意味着 mixin 完全没有价值,混入仍然可以在某些情况下提供一些价值和灵活性。在 Vue 2 中,它仍然是一种常用的代码重用机制。特别是对于较小规模的项目或具有简单需求的组件,使用 mixin 可以提供一种简单且灵活的方式来组织和复用代码。

  • 在使用混入时,需要权衡利弊,合理使用,并确保良好的代码组织和命名规范,以最大化地发挥混入的优势并减少其潜在的缺点。


二、使用mixin

// 定义一个 Mixin 对象
const myMixin = {
  data() {
    return {
      message: 'Hello, Mixin!'
    }
  },
  methods: {
    greet() {
      console.log(this.message);
    }
  }
}
// 在组件中引入 Mixin
Vue.component('my-component', {
  mixins: [myMixin],
  mounted() {
    this.greet(); // 输出:Hello, Mixin!
  }
})
  • 在这个例子中,定义了一个名为 myMixin 的 Mixin 对象,它包含了一个名为 message 的数据属性和一个名为 greet 的方法。然后,我们在一个组件中通过 mixins 选项引入了这个 Mixin。最终,在组件的 mounted 生命周期钩子中调用了 greet 方法,控制台输出了 Hello, Mixin!

三、mixin的合并策略

data选项

  • 当一个组件和Mixin都拥有相同的data属性时,Vue会将它们合并成一个新的对象。如果是基本类型,组件的data属性将覆盖Mixin中的data属性,如果两个属性的值都是对象,则Vue会将它们深度合并递归对比key,如果是同名key则会覆盖,如果不是同名的,则保留。

生命周期钩子

  • 当一个组件和Mixin都定义了相同的生命周期钩子时,同名钩子函数将合并为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子之前调用

方法与计算属性

  • 当一个组件和Mixin都包含相同名称的方法或计算属性时,组件的方法或计算属性会覆盖Mixin的方法或计算属性

  • 除了上面这些选项,还有比如components(组件),和directives(指令)等也是一样的逻辑,同名的会覆盖,以组件的为优先。


四、mixin辨析

与 Vuex 的区别

  • Vuex: 用来做状态管理,vuex中定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改。相当于所有组件共享。

  • Mixins: 可以定义共用的变量,在每个组件中使用,引用组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响。组件直接使用是相互隔离的,数据互不影响。

与公共组件的区别

  • 组件: 在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据 prop 来传值,但本质上两者是相对独立的。

  • Mixins: 在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。


五、个人实践

  • 前置情况:使用nust对项目进行重构,还是使用Vue2为主,且查询方案大量冗余,故使用mixin将相同代码进行抽离。

在这里插入图片描述

  • 目录结构定义mixins的文件夹,并创建queryPlan.js文件
//导出
export const QueryPlan = {
    data() {
        return {
            list: {
                markets: [],
                themes: [],
                styles: [],
                plays: [],
            },
            // ......
        };
    },
    methods: {
        getMarkets() {
            // ...
        },
        getThemeList() {
            // ...
        },
        getPlays() {
            // ...
        },
        getStyles() {
            // ...
        },
        // ......
    },
    created() {
        // ......
    },
    mounted() {
        // ......
    },
};
  • 创建好之后在.vue文件中引入即可
<template>
    <div id="main">
        <!-- ... -->
</template>

<script>
// 引入
import { QueryPlan } from "~/mixins/queryPlan.js";

export default {
    name: "index",
    mixins: [QueryPlan],
    data() {
    return {
        // ...
    };
    },
    mounted() {
        // ...
    },
    methods: {
        // ...
    },
    watch: {
        // ...
    },
    computed: {
        // ...
    },
};
</script>
<style lang="scss" scoped>

</style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mixin从理论到实践 的相关文章

随机推荐

  • OpenWrt入门完美教程

    近来由于毕业设计需要用到摄像头模块 考虑利用 OpenWrt UVC mjpg streamer 方案驱动摄像头模块 学习了一篇很好的OpenWrt入门美文 原文链接如下 http zhidx com p 186 html 从零开始学习Op
  • 【Ubuntu 3090 CUDA配置】一文缕清 驱动+CUDA Toolkit+cuDNN+pytorch+cudatoolkit 环境配置流程

    2021年12月9日更新 可查看本人最新的CUDA环境配置博客 https zhuanlan zhihu com p 443114377 系对本文的提炼 归纳与总结 目录 环境配置流程总结 2021年6月10日更新 重要概念 务必看 写在开
  • 数字信号处理第二次试验:时域采样与频域采样

    数字信号处理第二次试验 时域采样与频域采样 前言 一 实验目的 二 实验原理与方法 三 实验环境 四 实验内容及步骤 五 实验结果截图 含分析 实验程序运行结果及分析讨论 六 思考题 想说点啥 前言 为了帮助同学们完成痛苦的实验课程设计 本
  • js去掉字符串的空格

    1 trim方法 过滤字符串两端的空格 var str xin xiang console log str trim xin xiang trim 是最常用的方法 也是最方便的方法 缺点 只能去除字符串两端的空格 不能去除中间的空格 2 r
  • Node.js基础入门第七天

    经过前面六天的知识学习 对Node js开发的基础知识 有了一个初步的掌握 今天继续学习Node js后端web开发的相关知识 本篇文章作为Node js服务端程序开发的基础入门知识 仅供学习分享使用 如有不足之处 还请指正 创建服务端程序
  • JS的findIndex在对象中依值查找相应的索引

    博大精深的JS 永远都学不完的好东东 JS根据对象值查找对应索引 let arr id 1 name a id 2 name b id 3 name c 查找id 3记录的索引号 let i arr findIndex v gt v id
  • 一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

    目录导航 前言 一 准备工作 二 创建Maven项目 三 pom xml配置 四 配置web xml spring xml文件 五 编写Controller和相应jsp页面 六 集成mybatis 七 测试 八 TroubleShootin
  • 某资产配置平台系统方案建设规划

    整个平台规划分为前台与后台以及微平台的建设 其中前台系统囊括首页概览 固定收益产品 阳光私募产品 PE VC产品 地产投资产品 海外保险产品 理财学堂 会员中心八大模块 后台系统包含理财中心 产品中心 基础管理与账号管理四个版块 微平台后续
  • Rusr Error: linker `x86_64-w64-mingw32-gcc` not found

    Error linker x86 64 w64 mingw32 gcc not found 问题描述 解决办法 For Self For Windows 问题描述 交叉编译时 在 Mac OS 平台下为 Windows 打 EXE 包报错
  • 基于Spring Boot的个人博客系统的设计与实现毕业设计源码271611

    目 录 摘要 1 绪论 1 1研究意义 1 2开发背景 1 3系统开发技术的特色 1 4论文结构与章节安排 2 个人博客系统系统分析 2 1 可行性分析 2 2 系统流程分析 2 2 1数据增加流程 2 3 2数据修改流程 2 3 3数据删
  • 后端配置跨域

    仅为记录 Configuration public class CorsConfig 当前跨域请求最大有效时长 这里默认1天 private static final long MAX AGE 24 60 60 private CorsCo
  • CAN分析仪、USBCAN卡连接失败常见问题

    CAN分析仪对CAN总线开发的工程师来说是很常用的工具 但是对第一次将USB连接到CAN上的人来说可能会遇到很多问题 本文列举可能会遇到的问题 然后列出解决方法 问题1 设备打开失败 如下图所示 可能原因 设备型号选错 解决办法 来可针对不
  • 逆向破解学习-单机斗地主

    试玩 破解思路 9000 是成功的代码 Hook代码 import de robv android xposed XC MethodHook import de robv android xposed XposedHelpers impor
  • 开发ssm框架软件系统常见问题及解决方法

    在SSM框架开发软件系统中 可能会遇到一些常见的问题 如下所述 1 配置文件错误 在SSM框架开发软件系统中 配置文件往往是一个非常重要的部分 当配置文件存在错误时 可能会导致软件系统无法正常运行 解决这个问题的方法是检查配置文件的语法 路
  • 计算机术语表达因果,我翻译的维基百科关于福多的词条(下)

    意向实在论 福多对丹尼特的批评 福多对所谓的标准实在论提出了批评 根据他自己的想法 这个观点可以被描绘为两个独立的断言 其中一个诉诸心理状态的内在结构并且断言这些状态是非关联的 另一个主张关注心理内容的语义学理论并且断言在这些内容的因果作用
  • linux创建、删除文件夹的软链接

    在 home tom 下有个叫 a 的文件夹 想在 home dataset 下建一个软链接 b 指向它 即 hom dataset b rightarrow home tom a Create ln s home tom a home d
  • Android流行UI布局 BottomNavigationView+ViewPager+Fragment的使用

    1 概述 Android端采用底部导航栏的app非常多 一般我们都采用RadioGroup RadiaButton来进行界面的切换 今天我们要讲的是一个新的控件BottomNavigationView 用于替换RadioGroup 这个控件
  • 1023 买书(完全背包问题求方案数)

    1 问题描述 小明手里有n元钱全部用来买书 书的价格为10元 20元 50元 100元 问小明有多少种买书方案 每种书可购买多本 输入格式 一个整数 n 代表总共钱数 输出格式 一个整数 代表选择方案种数 数据范围 0 n 1000 输入样
  • 【ESP8266 快速入门】示例5:Arduino环境实现OTA无线升级固件功能WebServer网页服务器方式

    主题 使用 ESP8266 Arduino环境实现OTA无线升级固件功能 由LED闪烁程序通过OTA升级为PWM呼吸灯程序 目录 主题 0 引言 1 环境准备 2 OTA步骤 2 1 OTA的基础程序 LED闪烁 2 2 OTA的升级程序
  • Mixin从理论到实践

    mixin从理论到实践 mixin从理论到实践 一 什么是mixin 二 使用mixin 三 mixin的合并策略 四 mixin辨析 五 个人实践 mixin从理论到实践 一 什么是mixin mixin混入 Vue js vuejs o