Mixin从理论到实践

news2025/1/15 14:09:29

mixin从理论到实践

  • mixin从理论到实践
    • 一、什么是mixin
    • 二、使用mixin
    • 三、mixin的合并策略
    • 四、mixin辨析
    • 五、个人实践

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app:自带的消息提示被遮挡的解决办法(自定义消息提示框)

效果&#xff1a; 代码&#xff1a; 1、在最外层或者根组件的模板中添加一个容器元素&#xff0c;用于显示提示消息。例如&#xff1a; <div class"toast-container" v-if"toastMessage"><div class"toast-content">{{ toastMessa…

shell脚本中分支结构、循环、以及函数的介绍和使用

练习 实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 #!/bin/bash function sum() {sum0for i in ${arr[*]}do((sumi))doneecho "数组和为&#xff1a;"$sum } read -p "请输入一个数组&#xff1a;" -a arr sum arr写一个函数&#xff0c…

华为云云服务器云耀L实例评测 | 从零开始:华为云云服务器L实例使用教程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Mediasoup源码介绍

一、Mediasoup 整体结构 整个Mediasoup库通过Nodejs管理&#xff0c;比如整体逻辑、worker、router、producer、consumer...都是通过JS进行管理的。 其底层的数据传输是通过C部分进行控制的&#xff0c;通过NodeJs来控制C部分&#xff0c;以实现整体的数据传输效 二、Mediasou…

Python最好用的可视化库(从低级到高级)

今天&#xff0c;我将深入探讨Python中的数据可视化世界&#xff0c;更具体地说&#xff0c;我们如何利用一些官方库来可视化SQL查询的结果&#xff0c;已有的“轮子”可以让这个过程变得轻松愉快。我们接下来将分别给出几个库的简介及运行结果。 Matplotlib&#xff1a;你可靠…

想要精通算法和SQL的成长之路 - 课程表IV

想要精通算法和SQL的成长之路 - 课程表IV 前言一. 课程表IV &#xff08;拓扑排序&#xff09; 前言 想要精通算法和SQL的成长之路 - 系列导航 做这个题目之前可以回顾一下&#xff1a;课程表II 一. 课程表IV &#xff08;拓扑排序&#xff09; 原题链接 这道题目在课程表I…

通过Git Bash将本地文件上传到本地github

1. 新建一个仓库&#xff08; Repository&#xff09; 1.1登录Github&#xff0c;点击个人头像&#xff0c;点击Your repositories&#xff0c;点击New。 1.2 填写信息 Repository name: 仓库名称 Description(可选): 仓库描述介绍,不是必填项目。~~建议填写上哦&#xff01;…

排序算法:快速排序(三种排序方式、递归和非递归)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

PMP中十大知识领域及敏捷部分

今天给大家分享一篇PMP考试中十大知识领域及敏捷部分。希望正在备考11月PMP的宝子们能够清楚地拿捏重难点&#xff0c;稳稳上岸&#xff01; 我是胖圆~欢迎大家关注留言&#xff01; 或者移步公众号【胖圆说PM】找我

SpringBoot-可视化监控

一、添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--采集应用的指标信息&#xff0c;prometheus--> <dependency…

牛客练习赛115 A Mountain sequence - 乘法原理

a 到 b有3条路&#xff0c;b到c有4条路&#xff0c;那a到c共有12种选择。 最大值作为顶点&#xff0c;统计每个数的数量&#xff0c;比如说最大值为9&#xff0c;且只有一个&#xff0c;7的数量为4 有的可能为 77779 77797 77977 79777 97777 共计5种可能性&#xff0c;设一…

windows 下载安装 mysql

windows 下载安装 mysql 官网地址&#xff1a;https://dev.mysql.com/ 下载地址&#xff1a;https://cdn.mysql.com//Downloads/MySQLInstaller/mysql-installer-community-8.0.34.0.msi 点击 Downloads 点击 MySQL Community (GPL) Downloads 点击 MySQL Installer for Window…

C高级day5

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 #!/bin/bashfunction sum() {i${#*}j0m0while [ $j -lt $i ]do((m${arr[j]}))((j))doneecho "数组和为$m"} read -a arr sum ${arr[*]} 写一个函数&#xff0c;输出当前用户的uid和gid&…

Android悬浮窗实现源码-悬浮球转盘悬浮加速小火箭效果悬浮播放视频图片

一、实现思路 悬浮窗是一种比较常见的需求&#xff0c;就是把需要展示的内容界面缩小成一个悬浮窗&#xff0c;然后用户可以在其他界面上处理事情。 基本实现原理&#xff1a; 主要是通过WindowManager这个类来实现 addView方法用于添加一个悬浮窗&#xff0c; updateViewLay…

如何拆卸滚珠螺杆的螺母?

现在滚珠螺杆的使用中&#xff0c;相信很多人都遇到过因外力原因需要拆卸螺母这种状况&#xff0c;对螺母不熟悉&#xff0c;在拆卸的过程中很容易会损坏螺母&#xff01;因此&#xff0c;掌握正确的拆卸方法是非常必要的。 拆卸滚珠螺杆螺母需要准备一些工具&#xff0c;包括扳…

提升运营效率:仓储可视化的实时监控与优化

当今&#xff0c;仓储管理已经不再是简单的储存和分发商品的过程。随着供应链的复杂性增加&#xff0c;企业需要更高效的方式来管理和优化其仓储运营。在这个背景下&#xff0c;仓储可视化成为了一项关键的技术&#xff0c;它利用先进的数字化工具和数据分析来提升仓储管理的效…

【Linux基础】权限管理

​&#x1f47b;内容专栏&#xff1a; Linux操作系统基础 &#x1f428;本文概括&#xff1a; 用户之间的切换、sudo提权、Linux权限管理、文件访问权限的相关方法、目录权限、粘滞位等 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.9.11 …

D1. Candy Party (Easy Version) Codeforces Round 896 (Div. 2)

Problem - D1 - Codeforces 题目大意&#xff1a;有一个n个数的数组a&#xff0c;要求令每一个数减去一个任意数&#xff0c;然后任选一个数加上&#xff0c;问能否使所有数相等 1<n<2e5 思路&#xff1a;因为要让每个数相等&#xff0c;首先检查他们的和能否平分成n份…

Linux文件属性操作函数

access函数 chmod函数 chown函数 修改文件的所在组或者所有者 truncate函数

RabbitMQ - 如保证消息的可靠性?

目录 一、消息可靠性 1.1、生产者消息确认&#xff08;生产者角度&#xff09; 1.1.1、理论 1.1.2、实践 1.2、消息持久化&#xff08;消息角度&#xff09; 1.2.1、理论 1.3、消费者消息确认&#xff08;消费者角度&#xff09; 1.3.1、理论 1.3.2、实践 1.4、失败重…