为什么 Mixin 被认为是有害的

news2024/11/27 22:38:26

为什么 Mixin 被认为是有害的

Mixin 是在 Vue 2 中引入的,作为组件之间共享代码的解决方案,这种方式成为许多代码库不可或缺的一部分。然而,随着时间的推移,它们的使用开始出现问题。尽管 mixins 最初很有吸引力,但现在许多开发人员认为它是有害的。在本文中,我们将探讨Mixin的缺点和更好的共享代码的方法。

缺点

复杂

Mixin 可以向组件添加过多的逻辑,使其变得更加复杂且难以理解,从而导致意想不到的后果和维护困难。例如,如果一个组件有多个 mixin,每个 mixin 都有自己的属性和方法,那么该组件将有很多逻辑,并且很难确定每个属性和方法如何影响组件的行为。由于混入而导致组件过于复杂,使得扩展或调试变得具有挑战性。

为了避免这种情况,明智地选择 mixins 并确保它们简化而不是使得组件的逻辑复杂化至关重要。Mixin 会给组件带来偶然和本质的复杂性。偶然复杂性是指在不影响功能的情况下可以消除的不必要的复杂性,而本质复杂性是解决问题所固有的,无法避免。使用 mixins 时考虑这两种类型的复杂性非常重要。

命名冲突和模糊的合并策略

Mixin 可能与组件具有重叠的属性,从而导致命名冲突和意外行为。

比如说我们有一个包含特定员工逻辑的mixin,其中包括声明增值税金额。

// mixins/employee.js
export default {
  data() {
    return {
      vat: 20
    };
  },
  computed: {
    calculateSalary() {
      return this.baseSalary - (this.baseSalary * this.vat) / 100;
    }
  }
};

以及还声明了增值税金额的薪资显示组件:

<template>
  <div id="app">工资: {{ calculateSalary }}</div>
</template>

<script>
import employee from "./mixins/employee.js";

export default {
  name: "App",
  mixins: [employee],
  data() {
    return {
      baseSalary: 100000,
      vat: 30,
    };
  },
};
</script>

在这种情况下,计算函数里声明的增值税金额(vat)将被忽略,并且在具有更复杂逻辑的现实示例中,这很难发现,并且如果我们对 mixin 进行隔离单元测试,可能会得到误报。

当两个不同 mixins 之间的命名冲突时,这可能会更加令人困惑。在这种情况下,最后声明的一个会覆盖另一个!

可重用性降低

Mixins 使得重用组件变得更加困难,因为它们增加了组件的依赖性并使其与特定功能的耦合更加紧密。

例如,想象一个使用 mixin 的组件,该 mixin 为该组件提供了特定的样式。如果另一个组件也想使用相同的样式,则它必须使用相同的 mixin。这意味着组件的样式与现在的 mixin 紧密耦合,并且如果不使用 mixin 则无法重用。

这使得组件的可重用性降低,因为如果不包含 mixin 及其依赖项,它就无法在应用程序的其他部分中使用。这可能会导致代码重复并使应用程序更难以维护。

解决方案

组合式api

组合式api 是 Vue 3 的亮点。主要优点是以可组合函数的形式实现干净、高效的逻辑重用。它解决了 mixin 的缺点。社区里有非常多使用该方式的项目,例如VueUse。此外,它还是一种干净的机制,可以轻松地将有状态的第三方服务或库集成到 Vue 的响应性系统中,例如不可变数据、状态机和RxJS。

前面提到了使用 mixin 会创建高度耦合且难以扩展或维护的代码:

在这里插入图片描述
另一种方法是让每个组件显式导入其所有依赖项。这样,一切都是透明的并且易于推理。设计上消除了命名冲突,并且测试也更加简单。

在这里插入图片描述
实际上,Composition API 是一组实用帮助程序,使我们能够使用显式导入的函数而不是声明选项来编写组件。它是一个涵盖以下 API 的总称:

  • Reactivity API(响应式api):例如ref()reactive(),它允许我们直接创建反应状态、计算状态和观察者。
  • Lifecycle Hooks(生命周期钩子):例如onMounted()onUnmounted(),它允许我们以编程方式挂钩到组件生命周期。
  • 依赖注入,即provide()inject(),它允许我们在使用 Reactivity API 时利用 Vue 的依赖注入系统。

简单示例:

// mouse.js
import { ref, onMounted, onUnmounted } from 'vue'

export function useMouse() {
  const x = ref(0)
  const y = ref(0)
  function update(event) {
    x.value = event.pageX
    y.value = event.pageY
  }
  onMounted(() => window.addEventListener('mousemove', update))
  onUnmounted(() => window.removeEventListener('mousemove', update))

  return { x, y }
}
<script setup>
import { useMouse } from './mouse.js'

const { x, y } = useMouse()
</script>

<template>鼠标位置: {{ x }}, {{ y }}</template>

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

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

相关文章

今天我花了一个通宵的时间安装Windows11系统居然失败,忍不住哭了!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

Python爬虫:抓取表情包的下载链接

Python爬虫:抓取表情包的下载链接 1. 前言2. 具体实现3. 实现代码 1. 前言 最近发现了一个提供表情包的网址&#xff0c;觉得上面的内容不错&#xff0c;于是就考虑用Python爬虫获取上面表情包的下载链接。整体而言&#xff0c;实现这个挺简单的&#xff0c;就是找到提供表情包…

Kubernetes pod调度约束[亲和性 污点] 生命阶段 排障手段

调度约束 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和 Container。 APIServer…

如何学习大数据

文章目录 每日一句正能量前言一、什么是大数据二、大数据的应用领域三、社会对大数据的人才需求四、大数据的学习路线后记 每日一句正能量 多数人认为&#xff0c;一旦达到某个目标&#xff0c;人们就会感到身心舒畅。但问题是你可能永远达不到目标。把快乐建立在还不曾拥有的事…

B057-spring增强 依赖注入 AOP 代理模式 创建Bean

目录 AOP概念代理模式引出AOP实现方式xml方式实现注解方式实现 AOP 概念 事务管理&#xff1a;比如可以抽取try catch的重复代码 日志监控&#xff1a;比如业务逻辑前后打印关于当前订单数量的日志&#xff0c;了解业务做了什么 性能监控&#xff1a;比如业务前后打印时间&…

《最强大模型平台上线,被很多行业“盯”上了》

千帆大模型 1、国内最多的模型2、国内最全的Prompt模板3、总结 千帆大模型平台是面向企业开发者的一站式大模型开发及服务运行平台&#xff0c;也是百度智能云推出的全球首个一站式企业级大模型平台。在提供全套文心大模型服务的基础上&#xff0c;还支持第三方开源大模型、各种…

记录更换若依框架的用户和部门两种表的过程

背景&#xff1a; 公司使用若依框架快速构建项目&#xff0c;客户那边原有的数据要同步过来&#xff0c;且要求字段与原先的字段一致&#xff0c;可以让数据丝滑无畅导入。用户表和部门表是基础在代码出现的地方比较多&#xff0c;该如何考虑去过度去更换&#xff09; 如何快速…

虹科案例 | 建筑物邻近挖掘工地的结构健康监测

一、 前言 工程与建筑 行业<<<< 工程与建筑——建筑结构健康监测 摘要<<<< 在现代城市环境中&#xff0c;重型建筑施工常常必须在毗邻的邻近建筑和结构附近进行&#xff0c;而这些建筑和结构在挖掘和施工期间必须保持开放以供商业或居住使用。 传…

ModaHub魔搭社区——Milvus 、Qdrant、Waeviate、Pinecone、ElasticSearch矢量数据库对比

资本市场上,2022年也是风起云涌的一年的,各大向量数据库公司纷纷完成了千万美元级别新一轮的融资。可以预见,2023年将会是向量数据库继续快速发展的一年,也会是这一新兴技术由发展走向成熟的一年。这里针对Milvus 、Qdrant、Waeviate、Pinecone、ElasticSearch这五个流行的…

掌握Python的X篇_27_Python中标准库文档查阅方法介绍

前面的博文介绍了python的基本语法、模块及其导入方法。前人将各种方法封装成模块、库、函数供我们使用&#xff0c;如何去使用前人做好的东西&#xff0c;那就需要去查阅文档。今天就介绍python中官方文档的查阅方式。对于初学者而言&#xff0c;python自带的文档就已经足够好…

SQL-每日一题【1484. 按日期分组销售产品】

题目 表 Activities&#xff1a; 编写解决方案找出每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。 结果表结果格式如下例所示。 示例 1: 解题思路 前置知识 group_concat函数的功能   将group by产生的…

6.2.0在线编辑:GrapeCity Documents for Word (GcWord) Crack

GrapeCity Word 文档 (GcWord) 支持 Office Math 函数以及转换为 MathML GcWord 现在支持在 Word 文档中创建和编辑 Office Math 内容。GcWord 中的 OMath 支持包括完整的 API&#xff0c;可处理科学、数学和通用 Word 文档中广泛使用的数学符号、公式和方程。以下是通过 OMa…

92. 反转链表 II

92. 反转链表 II 题目-中等难度示例1. 获取头 反转中间 获取尾 -> 拼接2. 链表转换列表 -> 计算 -> 转换回链表 题目-中等难度 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点…

生信豆芽菜-山峦图分析使用说明

网站&#xff1a;http://www.sxdyc.com/visualsRidges 一、山峦图简介 山峦图&#xff08;Ridgeline plots&#xff09;&#xff0c;本质上是多个核密度曲线图的相互重叠组合&#xff0c;也可以看作是只有半个“小提琴”的横向小提琴图&#xff0c;主要用于展示和比较数据&…

Typecho建站:腾讯云轻量应用服务器搭建网站博客方法

腾讯云轻量应用服务器自带Typecho应用模板镜像&#xff0c;腾讯云提供的Typecho模板镜像是基于CentOS 7.6 64位操作系统&#xff0c;并已预置Nginx、PHP、MariaDB软件程序&#xff0c;使用Typecho应用模板可以快速搭建博客、企业官网、电商及论坛等各类网站。腾讯云服务器网分享…

爱立信网管工具使用-Tools for Export Import(TEI)

1、TEI使用 2、数据导出 打开 OSS Common Explorer&#xff0c;如下图&#xff0c;右键“ONRM_ROOT_MO_R”,选择“Export” MO type filter:为了避免生产的 BULK CM export 文件太大&#xff08;可能会达到几个 G&#xff0c;TEI 转换时&#xff0c;对输入的 BULK CM expor…

多线程与并发编程面试题总结

多线程与并发编程 多线程 线程和进程的区别&#xff1f; 从操作系统层面上来讲&#xff1a;进程(process)在计算机里有单独的地址空间&#xff0c;而线程只有单独的堆栈和局部内存空间&#xff0c;线程之间是共享地址空间的&#xff0c;正是由于这个特性&#xff0c;对于同…

使用Python和pymupdf创建简单的PDF阅读器

使用Python和wxPython编写一个简单的PDF阅读器&#xff0c;并展示了PDF文件的内容。 介绍&#xff1a; 在日常工作和学习中&#xff0c;我们经常需要查看和阅读PDF文件。本文将介绍如何使用Python编程语言和wxPython库创建一个简单的PDF阅读器&#xff0c;让我们能够打开文件夹…

【雕爷学编程】Arduino动手做(54)---大按键微动按钮模块3

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

C语言 金币问题

目录 一、题目介绍 二、题目要求 三、解题思路 四、代码演示 一、题目介绍 国王将金币作为工资&#xff0c;发放给忠诚的骑士。 第一天&#xff0c;骑士收到一枚金币&#xff1b;之后两天&#xff08;第二天和第三天&#xff09;&#xff0c;每天收到两枚金币&#xff1b;…