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.rhkb.cn/news/129908.html

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

相关文章

安全生产:CVE-2020-11022/CVE-2020-11023漏洞解析

文章目录 一、前言二、漏洞原理三、修复方案3.1 升级jQuery3.2 1.x 升级至 3.x 需要考虑的问题3.2.1 table表格元素自动添加tbody3.2.2 方法变更 3.3 jquery migrate是什么 四、拓展阅读 一、前言 代码安全扫描阶段&#xff0c;前端资源审计发现jQuery版本过低导致生产系统存在…

96. 不同的二叉搜索树

class Solution { public:int numTrees(int n) {if (n0) {return 1;}vector<int> dp(n1, 0);dp[0] 1;dp[1] 0;for (int i 1; i < n; i) {for (int j 0; j < i; j) {dp[i] dp[j] * dp[i - 1 - j];}}return dp[n];} };

grpc多语言通信之GO和DART

都是一个吗生的,找下例子 上一篇文章说到go实现的grpc方法已经实现了一个grpc的server端, 注意: 这两个项目的.proto文件应当是完全一致的,只是方法用各自的语言实现罢了 报错了: Caught error: gRPC Error (code: 12, codeName: UNIMPLEMENTED, message: grpc: Decompresso…

网络传输方式

1. 单播 1.1. 定义 单播是指一种向单个目标地址传送数据的方式&#xff0c;即单独的一对一通讯方式。 1.2. 可使用协议 UDP、TCP等协议 1.3. 常见的场景 发送电子邮件传输文件 2. 广播 2.1. 定义 一种向本地网络中所有设备发送数据的方式。 2.2. 常见的场景 电视和电…

SpringBoot+Vue 整合websocket实现简单聊天窗口

效果图 1 输入临时名字充当账号使用 2 进入聊天窗口 3 发送消息 &#xff08;复制一个页面&#xff0c;输入其他名字&#xff0c;方便展示效果&#xff09; 4 其他窗口效果 代码实现 后端SpringBoot项目&#xff0c;自行创建 pom依赖 <dependency><groupId…

有效回文字符串(Valid palindrome)

题目描述 思路分析 代码实践 java: public class Solutation1 {//定义一个方法&#xff0c;判断是否是有效数字或者字母private static boolean isValid(char c) {//如果不是字母或者数字&#xff0c;那就返回一个flase//这里调用了Character类里面的方法return Character.i…

Python - PyQt6、QDesigner、pyuic5-tool 安装使用

Python 开发可视化界面可以使用原生的 tkinter&#xff0c;但是原生框架使用起来颇为不方便&#xff0c;所以最流行的还是QT UI框架&#xff0c;QT是使用C语言开发&#xff0c;Python 想使用需要对其进行封装&#xff0c;所以就出现了PyQt框架&#xff0c;这个框架使用极其方便…

element的el-select给下拉框添加背景

第一步 :popper-append-to-body"false" <el-selectv-model"value"placeholder"请选择":popper-append-to-body"false"><el-optionv-for"item in options":key"item.value":label"item.label&quo…

【算法专题突破】双指针 - 最大连续1的个数 III(11)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;1004. 最大连续1的个数 III - 力扣&#xff08;Leetcode&#xff09; 这道题不难理解&#xff0c;其实就是求出最长的连续是1的子数组&#xff0c; 但是&#xff0c;他支…

Spring Reactive:响应式编程与WebFlux的深度探索

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

2023-简单点-什么是protobuf?

protobuf mother: 谷歌 作用 序列化 人话&#xff1a; 存储数据的一种结构 优势在&#xff1f; 类型安全 易用性好 序列化/反序列性能好 兼容性好 不仅可以定义结构体&#xff0c;还可以定义rpc服务接口 劣势在&#xff1f; 可读性较差&#xff1a;没有schema的情况下&a…

Linux--进程--进程-父进程退出

1.进程退出函数 进程退出分为正常退出&异常退出 正常退出&#xff1a; 1、main函数调用return 2、进程调用exit(),标准c库 3、进程调用_exit()或者_Exit(),属于系统调用 补充 1、进程最后一个线程返回 2、最后一个线程调用pthread_exit 异常退出&#xff1a; 1、调用abo…

【开箱即用】开发了一个基于环信IM聊天室的Vue3插件,从而快速实现仿直播间聊天窗功能

前言 由于看到有部分的需求为在页面层&#xff0c;快速的引入一个包&#xff0c;并且以简单的配置&#xff0c;就可以快速实现一个聊天窗口&#xff0c;因此尝试以 Vue3 插件的形式开发一个轻量的聊天窗口。 这次简单分享一下此插件的实现思路&#xff0c;以及实现过程&#xf…

OpenCV(二十二):均值滤波、方框滤波和高斯滤波

目录 1.均值滤波 2.方框滤波 3.高斯滤波 1.均值滤波 OpenCV中的均值滤波&#xff08;Mean Filter&#xff09;是一种简单的滤波技术&#xff0c;用于平滑图像并减少噪声。它的原理非常简单&#xff1a;对于每个像素&#xff0c;将其与其周围邻域内像素的平均值作为新的像素值…

5.9.Webrtc线程事件处理

在前面的课程中呢&#xff0c;我已经向你介绍了事件处理的一些基础知识&#xff0c;那今天呢&#xff0c;我们再来看一下外边儿rtc下事件处理的基本逻辑是什么&#xff1f; 那首先呢&#xff0c;我们来看一下事件是如何协调线程工作的&#xff0c;那就如果这张图所展示的有两个…

简单5步骤搞定windows server2019 配置IIS支持PHP

测试成功&#xff0c;记录一笔&#xff0c;感谢网上各位大佬的技术支持。 一、安装vcredist_x64.exe 否则可能会出现 FastCGI进程意外退出 二、IIS开启CGI&#xff08;可能需要重启&#xff09; 控制面板&#xff0c;启用或关闭windows程序&#xff0c;IIS--应用程序开发--CGI…

java封装国密SM4为 jar包,PHP调用

java封装国密SM4为 jar包,PHP调用 创建java工程引入SM4 jar包封装CMD可调用jar包PHP 传参调用刚用java弄了个class给php调用,本以为项目上用到java封装功能的事情就结束了,没想到又来了java的加密需求,这玩意上头,毕竟不是强项,没办法,只好再次封装。 但是这次的有点不…

CSS笔记(黑马程序员pink老师前端)盒子阴影,文字阴影

盒子阴影 属性值为box-shadow,盒子阴影不占空间,不影响盒子之间的距离. 值说明h-shadow必需,水平阴影位置,允许为负值v-shadow必需,水平阴影位置,允许为负值blur可选,模糊距离,数值越大影子越模糊spread可选,影子的尺寸color可选,影子的颜色inset可选, 将外阴影改为内阴影(省…

GO语言网络编程(并发编程)Goroutine池

GO语言网络编程&#xff08;并发编程&#xff09;Goroutine池 1. Goroutine池 1.1.1. worker pool&#xff08;goroutine池&#xff09; 本质上是生产者消费者模型可以有效控制goroutine数量&#xff0c;防止暴涨需求&#xff1a; 计算一个数字的各个位数之和&#xff0c;例…

router-link 和 router-view的区别

router-link 实现路由之间的跳转 router-view&#xff08;路由出口组件 -> 渲染路径匹配到的视图组件&#xff09; 当你访问的地址与路由path相符时&#xff0c;会将指定的组件替换该router-view router-link router-link 点击实现路由跳转&#xff0c;to属性指向目标地址&…