Mixin从理论到实践

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.hqwc.cn/news/109312.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python模板注入(SSTI)

概念 发生在使用模板引擎解析用户提供的输入时。模板注入漏洞可能导致攻击者能够执行恶意代码或访问未授权的数据。 模板引擎可以让&#xff08;网站&#xff09;程序实现界面与数据分离&#xff0c;业务代码与逻辑代码分离。即也拓宽了攻击面&#xff0c;注入到模板中的代码可…

数据清洗:数据挖掘的前期准备工作

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

异步FIFO设计的仿真与综合技术(4)

概述 本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文&#xff0c;添加了笔者的个人理解与注释&#xff0c;文中蓝色部分为笔者注或意译。前文链接&#xff1a; 异步FIFO设计的仿真与综合技术&#xf…

开源网安入选广东省网络空间安全标准化技术委员会新技术及应用安全技术工作组成员单位

近日&#xff0c;第二届广东省网络空间安全标准化技术委员会&#xff08;GD/TC 124&#xff09;&#xff08;以下简称省网安标委&#xff09;正式成立。为进一步发挥省网安标委在支撑网络强国建设、推进网络安全产业高质量发展过程中&#xff0c;示范引领核心技术攻关、创新产品…

Redis 7 第九讲 微服务集成Redis 应用篇

Jedis 理论 Jedis是redis的java版本的客户端实现&#xff0c;使用Jedis提供的Java API对Redis进行操作&#xff0c;是Redis官方推崇的方式&#xff1b;并且&#xff0c;使用Jedis提供的对Redis的支持也最为灵活、全面&#xff1b;不足之处&#xff0c;就是编码复杂度较高。 …

堆与栈的区别

OVERVIEW 栈与堆的区别一、程序内存分区中的堆与栈1.栈2.堆3.堆&栈 二、数据结构中的堆与栈1.栈2.堆 三、堆的深入1.堆插入2.堆删除&#xff1a;3.堆建立&#xff1a;4.堆排序&#xff1a;5.堆实现优先队列&#xff1a;6.堆与栈的相关练习 栈与堆的区别 自整理&#xff0c;…

Haproxy集群与常见的Web集群调度器

文章目录 1. Web集群调度器概述1.1 Web集群调度器简介1.2 调度器类别1.2.1 常用软件类1.2.2 常用硬件类 2. Haproxy软件介绍2.1 Haproxy简介2.2 支持功能2.3 主要特性2.4 常用调度算法2.4.1 轮询&#xff1a;RR&#xff08;Round Robin&#xff09;2.4.2 最小连接数&#xff1a…

基于Streamlit的应用如何通过streamlit-authenticator组件实现用户验证与隔离

Streamlit框架中默认是没有提供用户验证组件的&#xff0c;大家在基于streamlit快速实现web应用服务过程中&#xff0c;不可避免的需要配置该应用的访问范围和权限&#xff0c;即用户群体&#xff0c;一般的做法有两种&#xff0c;一种是通过用户密码验证机制&#xff0c;要求只…

LeetCode每日一题:1222. 可以攻击国王的皇后(2023.9.14 C++)

目录 1222. 可以攻击国王的皇后 题目描述&#xff1a; 实现代码与解析&#xff1a; 模拟 原理思路&#xff1a; 1222. 可以攻击国王的皇后 题目描述&#xff1a; 在一个 8x8 的棋盘上&#xff0c;放置着若干「黑皇后」和一个「白国王」。 给定一个由整数坐标组成的数组 …

小美的数组操作2---牛客周赛 Round 11

注意给a[ 0 ]赋一个最小值 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e55; int t,n,m,a[N],cnt[N]; int main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i1;i<n;i){scanf(&q…

go语言基础--面向对象杂谈

面向过程 所谓的面向过程就是&#xff1a;强调的是步骤、过程、每一步都是自己亲自去实现的。 面向对象 所谓的面向对象其实就是找一个专门做这个事的人来做&#xff0c;不用关心具体怎么实现的。 所以说&#xff0c;面向过程强调的是过程&#xff0c;步骤。而面向对象强调的…

【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套

蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套 第十四届蓝桥杯省赛真题 1、要把下面4张图片重新排列成蜗牛的画像,该如何排列这些图片 A、 B、 C、 D、 答案:A 考点分析:主要考查小朋友们的观察能力空