当前位置: 首页 > news >正文

Vue|mixin混入

目录

  • mixin混入
    • 什么是mixin
    • 代码准备
    • 如何混入?
    • 全局混合

在 Vue 中,混入(Mixins)是一种灵活的分发功能,可以将可复用的代码片段和功能注入到多个组件中。简单来说,混入允许你在多个组件之间共享逻辑,而无需重复代码。

主要特点:

  1. 代码复用:混入可以包含数据、计算属性、方法和生命周期钩子等,可以在多个组件中复用,减少代码冗余。
  2. 合并机制:当组件和混入中存在同名属性或方法时,组件的优先级高于混入。混入的内容会被合并到组件的选项中。
  3. 灵活性:可以在需要的地方选择性地使用混入,而不必在每个组件中都定义相同的逻辑。

mixin混入

什么是mixin

官方解释:混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

代码准备

在components目录下创建两个vue文件,分别为Company.vueStaff.vue。代码块如下:

  • Company.vue
<template><div><h1 ="alertName">公司名称:{{ name }}</h1><h1>地址:{{ address }}</h1></div>
</template><script>
export default {name: "Company",data() {return {name: "橘猫科技有限公司",address: "橘猫街道",};},methods: {alertName() {alert(this.name);},},
};
</script>
  • Staff.vue
<template><div><h1 ="alertName">用户名:{{ name }}</h1><h1>性别:{{ sex }}</h1></div>
</template><script>
export default {name: "Staff",data() {return {name: "摔跤猫子",sex: "男",};},methods: {alertName() {alert(this.name);},},
};
</script>

两个vue文件分别展示【员工信息】与【公司信息】,当点击员工名称与公司名称时都会将名称进行弹出显示;在App.vue中引入这两个vue文件并通过终端执行命令运行。

  • App.vue
<!-- 结构 -->
<template><StaffVue /><CompanyVue />
</template><!-- 交互 -->
<script>
import StaffVue from './components/Staff.vue'
import CompanyVue from './components/Company.vue'export default {name: 'App',components: {StaffVue,CompanyVue},
}
</script>
<!-- 样式 -->
<style>
#app {-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

控制台出现了报错 10:9 error Component name "Company" should always be multi-word vue/multi-word-component-names,10:9错误组件名称“Company”应始终为多字vue/多字组件名称

在这里插入图片描述

这个报错的原因是在组件命名的时候未按照 ESLint 的官方代码规范进行命名,根据 ESLint 官方代码风格指南,除了根组件(App.vue)以外,其他自定义组件命名要使用大驼峰命名方式或者用“-”连接单词进行命名;解决方案如下:

  • 找到vue.config.js文件
  • 添加 lintOnSave: false配置下,关闭eslint校验
  • 重新启动项目

在这里插入图片描述

项目启动后,页面点击交互效果如下:

在这里插入图片描述

如何混入?

通过对比Staff.vue以及Company.vue发现两个组件中有很多代码是一致的,这时候就可以把这两段代码分别删除,并且创建一个新的文件分别在各自的组件进行引用,这样就达到了混入的效果,所谓的混入就是多个组件共享混用一个配置。

在这里插入图片描述

在src目录下新建一个mixin_alertName.js的文件,这里叫什么名字都可以。

在这里插入图片描述

再把两个vue组件中的methods代码删掉

在这里插入图片描述

在这里插入图片描述

  • mixin_alertName.js中代码如下:
export const mixin_name = {methods:{alertName(){alert(this.name);}}
};

在需要用到该组件的vue文件中进行引入,form后填写该文件目录位置,mixin_name为混合组件中定义的名称,需保持一致。

在这里插入图片描述

如何应用这个混合呢?这里需要通过一个全新的配置项:mixins,相比mixin来说多了一个s,这里代表可以应用多个混合组件,它的值是一个数组。

在这里插入图片描述

将混合组件名称填入数组,在另外一个vue文件中也按上述步骤引入即可。

在这里插入图片描述

  • 保存文件后刷新页面,检查控制台是否有报错信息,点击用户名称及公司名称,即可发现使用混入组件与每个组件分别的定义效果一致。
    在这里插入图片描述

mixin_alertName.js中定义一个钩子函数,输出hello,我被调用了,可以在控制台中看到输出了两次,可以看出混合就是复用配置。

在这里插入图片描述
在这里插入图片描述

继续在mixin_alertName.js中增加一段,在这里不配置方法,只配置数据,同时在多个vue组件中进行引入。

在这里插入图片描述

//增加一个mixin_name2,在此处不配置方法,只配置数据
export const mixin_name2 = {data(){return{height:180,balance:100}}
};
  • Staff.vue文件

在这里插入图片描述

打开浏览器,通过插件查看数据,可以看到在Staff.vue中只写了namesex,但是还是出现了heightbalance,这是因为它将当前组件的数据以及引入组件的数据进行了一个整合,组合在一起展示。

在这里插入图片描述

如果在Staff.vue中也存在heightbalance两个字段的话,则以Staff.vue为主。

在这里插入图片描述

在这里插入图片描述

如果在Staff.vue以及mixin_alertName.js中同时定义mounted钩子函数,这时没有优先级,两者都会保留。

在这里插入图片描述
在这里插入图片描述

全局混合

上述步骤中,在每个组件中单独配置、单独引用的方式数据局部混合,什么页面用到了就得这么来一套。

在这里插入图片描述

这里介绍如何实现全局混合,首先在main.js中引入mixin_alertName.js,在创建Vue应用时,使用app.mixin 方法添加全局混入,此时应与上述步骤中的局部混入效果一致,但是在每个vue组件中,已不再重复单独引用。

  • Staff.vue以及Company.vue

在这里插入图片描述

  • main.js
import { createApp } from 'vue';
import App from './App.vue';
import { mixin_name, mixin_name2 } from './mixin_alertName';//创建Vue的实例对象->vm
const app = createApp(App);// 全局混入
app.mixin(mixin_name);
app.mixin(mixin_name2);app.mount('#app');

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【算法】动态规划—最长回文子序列
  • 排序-----选择排序
  • 开源ERP系统odoo的安装与配置
  • 【Linux】调试和Git及进度条实现
  • MATLAB绘图:5.三维图形
  • DockerLinux安装DockerDocker基础
  • 25届计算机专业毕设选题推荐-基于python的二手电子设备交易平台【源码+文档+讲解】
  • [数据集][目标检测]疟疾恶性疟原虫物种目标检测数据集VOC+YOLO格式948张1类别
  • Linux多块磁盘挂载同一目录
  • AI免费UI页面生成
  • 【LeetCode每日一题】——401.二进制手表
  • 2024/9/20 使用QT实现扫雷游戏
  • 基于Vue 3组合函数的分页、搜索与排序实践 —— nbsaas-boot项目的实际应用
  • 4. 密码协议
  • 一站式语音识别服务:中文、方言、多语言全覆盖
  • [PHP内核探索]PHP中的哈希表
  • Google 是如何开发 Web 框架的
  • 【css3】浏览器内核及其兼容性
  • 2018一半小结一波
  • docker容器内的网络抓包
  • github从入门到放弃(1)
  • jdbc就是这么简单
  • PAT A1092
  • Rancher-k8s加速安装文档
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • windows-nginx-https-本地配置
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 关于Java中分层中遇到的一些问题
  • 官方解决所有 npm 全局安装权限问题
  • 少走弯路,给Java 1~5 年程序员的建议
  • 思否第一天
  • 算法系列——算法入门之递归分而治之思想的实现
  • 小程序开发之路(一)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Linux权限管理(week1_day5)--技术流ken
  • ​TypeScript都不会用,也敢说会前端?
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (6)添加vue-cookie
  • (poj1.3.2)1791(构造法模拟)
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)C#调用WebService 基础
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)nsfocus-绿盟科技笔试题目
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .gitignore文件忽略的内容不生效问题解决
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .net 无限分类
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET连接MongoDB数据库实例教程
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET与java的MVC模式(2):struts2核心工作流程与原理