Vue之混入的重要性

对于Java后端来说继承是必不可少的,对于Vue来说混入就像继承不可或缺。但是很多人都不喜欢或者很少用混入,那么今天就来谈谈Vue混入的重要性。

1. 通用组件混合

想必大家都创建过公用组件,对于一些组件来说,往往都存在共通性,如选择器,我们可以将选择器通用的参数、方法等单独提取

/*** 下拉选择器混入*/
export default {model: {event: 'input-change', // 这个事件与下面的emit事件与之对应prop: 'value' //},props: {value: {type: String,default: ''},/*** 监听值改变,回调change*/listenValue: Boolean},data() {return {val: this.value,loading: false,options: []}},watch: {value: {handler(n) {this.val = n;if (this.listenValue) {this.toChange(n);}}}},methods: {onChange(value) {this.$emit('input-change', value);if (!this.listenValue) {this.toChange(value);}},toChange(value) {if (this.dataKey && this.options) {const data = this.options.find(item => String(item[this.dataKey]) === value);this.$emit('change', data);}}}
}

然后一个选择器组件就能轻而易举的实现:

<template><el-selectv-model="val"filterableremoteplaceholder="请输入关键词":remote-method="remoteMethod":loading="loading"@change="onChange"v-bind="$attrs"><el-optionv-for="item in options":key="item.deviceTypeId":label="item.name":value="item.deviceTypeId"></el-option></el-select>
</template><script>
import {listByKeyWord} from "@/api/bayonet/device_type";
import selectMixin from "@/components/Selector/selectMixin";export default {name: "DeviceTypeSelect",mixins: [selectMixin],methods: {remoteMethod(query) {this.loading = true;listByKeyWord({searchValue: query}).then(res => {this.options = res.data;this.loading = false;});}},created() {listByKeyWord('').then(res => {this.options = res.data;});}
}
</script>

2. 可选择性混入

对于页面,可能仅有一小部分需要某项功能,那么我们就可以将这些功能封装,做成混入,在有必要时引入混入,如:

import {mapState} from "vuex";export default {data() {return {roleMap: {/*** 超管*/admin: 'admin',/***服务中心*/fuwuzhongxin: 'fuwuzhongxin',/***企业*/enterprise: 'enterprise',/***应急办*/yingjiban: 'yingjiban',/***审批管理部*/shenpi: 'shenpi',/***企业用户*/enterprise_user: 'enterprise_user',/*** 司机用户*/driver: 'driver'}}},computed: {...mapState({user: state => state.user,}),/*** 当前用户是否为管理员* @returns {*|boolean}*/isAdmin() {return this.user.userInfo.admin || false;},/*** 当前用户是否为企业* @returns {boolean}*/isEnterprise() {if (!this.user || !this.user.roles) {return false;}return this.user.roles.includes(this.roleMap.enterprise) || this.user.roles.includes(this.roleMap.enterprise_user) || false;},/*** 当前用户是否为服务中心* @returns {boolean}*/isFuwuzhongxin() {if (!this.user || !this.user.roles) {return false;}return this.user.roles.includes(this.roleMap.fuwuzhongxin) || false;},},methods: {/*** 判断当前用户是否某一角色* @param roleCode 角色编码* @returns {boolean}*/isRole(roleCode) {if (!this.user || !this.user.roles) {return false;}return this.user.roles.includes(roleCode) || false;},/*** 判断当前用户包含某一角色* @param roleCodes 角色列表* @returns {boolean}*/isAnyRole(...roleCodes) {if (!this.user || !this.user.roles) {return false;}return roleCodes.some(roleCode => this.user.roles.includes(roleCode));},/*** 判断当前用户包含所有角色* @param roleCodes 角色列表* @returns {boolean}*/isEveryRole(...roleCodes) {if (!this.user || !this.user.roles) {return false;}return roleCodes.every(roleCode => this.user.roles.includes(roleCode));}}
}

然后在需要的地方引入:

import userMixin from "@/mixins/userMixin";
export default {name: "Form",mixins: [userMixin]
}

3. 全局工具混入

对于一些比较常用的工具,我们可以使用全局混入将其添加到所有组件

export default function (Vue) {Vue.mixin({methods: {isExternal(path) {return /^(https?:|mailto:|tel:)/.test(path)},validUsername(str) {const valid_map = ['admin', 'editor']return valid_map.indexOf(str.trim()) >= 0},validURL(url) {const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/return reg.test(url)},validLowerCase(str) {const reg = /^[a-z]+$/return reg.test(str)},validUpperCase(str) {const reg = /^[A-Z]+$/return reg.test(str)},validAlphabets(str) {const reg = /^[A-Za-z]+$/return reg.test(str)},validEmail(email) {const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/return reg.test(email)},isString(str) {if (typeof str === 'string' || str instanceof String) {return true}return false},isArray(arg) {if (typeof Array.isArray === 'undefined') {return Object.prototype.toString.call(arg) === '[object Array]'}return Array.isArray(arg)}}})
}

然后再main.js中引入,然后就能再任何组件中使用这些方法了

import globalUtils from '@/mixins/globalUtils';
Vue.use(globalUtils);

总结

其实还有很多使用方式,混入具有很强的灵活性,在于自己的不断探索。
很多框架也凭借者混入实现了全局性的各种功能,混入其实能够使得代码更容易集中维护,更加灵活,简单,甚至规范。

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

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

相关文章

通过adb命令查看当前界面的Activity

1、先进入shell 2、输入如下命令 dumpsys activity | grep "mFoc"执行效果如下&#xff1a; 从上图可以看到当前正在运行app的进程名称和当前显示的Activity完整路径类名。

操作系统-文件管理

文件的属性 文件名&#xff1a;由创建文件的用户决定文件名&#xff0c;主要说为了方便用户找到文件&#xff0c;同一个目录下不允许有重名文件。 标识符&#xff1a;一个系统内的各文件标识符唯一&#xff0c;对用户来说毫无可读性&#xff0c;因此标识符只是操作系统用于区分…

dolphinscheduler安装与配置:使用脚本一键安装配置dolphinscheduler单机版(配置MySQL版本)

使用shell脚本一键安装配置dolphinscheduler 前言&#xff1a;使用此脚本可以帮助您自动下载安装配置dolphinscheduler单机版&#xff0c;包括设置MySQL保存元数据。自动下载、解压dolphinscheduler安装包&#xff0c;自动修改dolphinscheduler的配置&#xff0c;配置MySQL连接…

【linux】日志有哪些

Linux系统日志主要有以下几种类型&#xff1a; 内核及系统日志&#xff1a;这种日志数据由系统服务rsyslog统一管理&#xff0c;根据其主配置文件/etc/rsyslog.conf中设置决定内核消息及各种系统程序消息记录到什么位置。/var/log/message&#xff1a;该日志文件存放了内核消息…

CentOS 部署 WBO 在线协作白板

1&#xff09;WBO 白板工具介绍 1.1&#xff09;WBO 白板简介 WBO 是一个自由和开源的在线协作白板。它允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用户实时更新&#xff0c;并且状态始终保持。它可以用于许多不同的目的&#xff0c;包括艺术、娱乐、设计和…

C语言实现ARM MCU SWD离线调试器

以下是一个使用C语言实现ARM MCU SWD离线调试器的示例代码&#xff0c;该代码可以读取目标设备的寄存器和内存&#xff1a; #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h>#define SWDIO_PIN 0 #define SWCLK_PIN …

服务器和Linux ,安装R rstudio ,常用软件

服务器的基本概念&#xff1a; 如服务器的基本结构&#xff0c;节点&#xff0c;端口的概念等。 服务器的基本设置和管理&#xff1a; 如何配置新服务器&#xff0c; 如何管理服务器&#xff0c;如何分配账户并确保他们互不访问&#xff0c; 如何全局安装软件让所有人都可以…

《明解C语言》第三版 (入门篇) 第十一章练习答案

练习11-1 #include <stdio.h>int main(void) {char* p "123";printf("p \"%s\"\n", p);p "456"1; printf("p \"%s\"\n", p);return 0; } //输出“56”&#xff0c;p指向的地址1后&#xff0c;往…

python/C混合编程

目录 1、实现方式 2、通过setuptools编译.c文件的实现 1、实现方式 Python和C语言混合编程可以通过以下方式实现&#xff1a; 使用Python的C扩展&#xff1a;Python提供了C扩展的功能&#xff0c;允许我们在Python中调用C语言代码。我们可以编写C语言扩展模块&#xff0c;并…

mysql面试题——日志与MVCC

一&#xff1a;什么是MVCC&#xff1f; 多版本并发控制&#xff0c;更好的方式去处理读-写冲突&#xff0c;就是为了查询一些正在被另一个事务更新的行&#xff0c;并且可以看到它们被更新之前的值&#xff0c;这样在做查询的时候就不用等待另一个事务释放锁。 二&#xff1a…

TZOJ 1386 十转换转R进制

答案&#xff1a; #include<stdio.h> char fun(int n) {if (n > 0 && n < 10) //如果是小于10进制的return n 48; //ASCII值48else if (n > 10 && n < 16) //如果是大于10进制小于16进制的return n 55; //ASCII值55elseretur…

PD QC快充协议诱骗取电sink受电芯片大全_测试报告

随着Type-C接口的充电器普及&#xff0c;市面上的PD充电器越来越多&#xff0c;小家电产品可不配充电器&#xff0c;使用Type-C接口&#xff0c;然后加入一颗PD协议取电协议芯片XSP08即可让充电器/充电宝/车充等电源输出9V/12V/15V/20V电压给产品供电。 快充取电芯片应用场景&a…

从0开始学习JavaScript--JavaScript ES6 模块系统

JavaScript ES6&#xff08;ECMAScript 2015&#xff09;引入了官方支持的模块系统&#xff0c;使得前端开发更加现代化和模块化。本文将深入探讨 ES6 模块系统的各个方面&#xff0c;通过丰富的示例代码详细展示其核心概念和实际应用。 ES6 模块的基本概念 1 模块的导出 ES…

【算法刷题】Day10

文章目录 15. 三数之和题干&#xff1a;算法原理&#xff1a;1、排序 暴力枚举 利用set 去重2、排序 双指针 代码&#xff1a; 18. 18. 四数之和题干&#xff1a;算法原理&#xff1a;1、排序 暴力枚举 利用set 去重2、排序 双指针 代码&#xff1a; 15. 三数之和 原题链…

springboot数据格式验证——自定义日期格式验证及list验证

我们在工作中经常需要对日期格式进行定义&#xff0c;如果客户端传来的日期字符串不符合要求&#xff0c;那么根本无法保存&#xff0c;但是已有的注解并没有日期格式的验证&#xff0c;那我们就自己实现一个 一、自定义日期格式验证的注解DateFormat import javax.validatio…

2023年阅读类APP如何发展?怎么做好商业化? | TopOn观察

前言 阅读类APP作为泛娱乐应用的重要板块&#xff0c;近年来在全球都发展火热。本文将主要从阅读类应用的市场规模、头部产品及地区特点、商业化模式及提升商业变现几个方面入手&#xff0c;解析2023年阅读类APP的发展趋势&#xff0c;希望为阅读类应用开发者带来参考价值。 一…

28.线段树与树状数组基础

一、线段树 1.区间问题 线段树是一种在算法竞赛中常用来维护区间的数据结构。它思想非常简单&#xff0c;就是借助二叉树的结构进行分治&#xff0c;但它的功能却非常强大&#xff0c;因此在很多类型的题目中都有它的变种&#xff0c;很多题目都需要以线段树为基础进行发展。…

分享一个关于 Go 错误处理的新提案

在比较一段长的时间里&#xff0c;Go 的错误处理已经没有什么特别的进展和新改进了。看着已经到了瓶颈期。 今天在 GitHub 上学习时&#xff0c;看到 Go 社区里有人提了个错误处理的优化提案《proposal: Go 2: Error-Handling Paradigm with !err Grammar Sugar》&#xff0c;…

【PyTorch】(五)模型训练

文章目录 1. 基本步骤 1. 基本步骤 for epoch in range(num_epochs):for _X, _y in dataloader:# 将数据转移到GPU_X, _y _X.to(device), _y.to(device)# 前向传播计算损失loss criterion(model(_X).reshape(_y.shape), _y)# 清空优化器梯度缓存optimizer.zero_grad()# 误差…

SELinux refpolicy详解(7)

接前一篇文章&#xff1a;SELinux refpolicy详解&#xff08;6&#xff09; 三、refpolicy内容详解 1. README 文件路径&#xff1a;refpolicy源码根目录/README。 文件内容如下&#xff1a; 1) Reference Policy make targets:General Make targets:install-src Install …