Vue学习(九)——混入

news2024/11/24 15:03:48

前言

混入(mixin)的使用非常简单,其实我原本打算直接写插件(plugin)的,但考虑到插件的使用范围也包括混入和自定义指令,还是先讲讲这两个的基本概念。

混入在我看来,就是给组件加上一些通用的属性和方法。比如说我们项目有很多个页面是要展示分页列表的,那页面组件都会包含当前页、每页记录、总记录数、总页数这些属性、还有页面增删查改操作的函数等等,其中有很多是完全一样,或者具备一定可复用性的。如果每个页面都搞这么一大坨,不单写起来繁琐,看起来也很乱。要是碰上不同的人开发,变量名定义还不一样,可读性可维护性就很差。所以我们想要有个东西能把这些共同的部分提取出来,这里面就要用到混入的概念。项目中如何使用大家可以参考一些开源的后台管理系统,比如jeecg的前端就用了混入。

使用混入

先利用vue-cli建一个项目test_mixin。不懂建的参考我第一篇vue文章《Vue学习(一)——组件基础》。

基本使用

现在我们假设我们项目的每个组件created方法都调用console.log('create'),并且每个组件都有一个hello方法,另外还有两个属性current、pageSize。

创建目录src/mixin,并在该目录下新建文件mixinHello.js:

export const mixinHello = {
  data(){
    return{
      current: 1,
      pageSize: 10
    }
  },
  created: function () {
    console.log('create')
  },
  methods: {
    hello: function () {
      console.log('hello from mixin!')
      console.log('current:' + this.current)
      console.log('pageSize:' + this.pageSize)
    }
  }
}

代码很简单,就是像我们这节开始说的那样,定义好current、pageSize属性,created方法、hello方法。接着我们在src/components目录下创建一个自定义按钮组件myBtn,并把混入加到其中:

<template>
  <div>
    <button @click="hello">测试混入</button>
  </div>
</template>

<script>
import {mixinHello} from '@/mixin/mixinHello.js'

export default {
  mixins: [mixinHello]
}
</script>

然后我们修改App.vue,引入muBtn

<template>
  <div>
    <my-btn></my-btn>
  </div>
</template>

<script>
import myBtn from '@/components/myBtn'

export default {
  name: 'App',
  components: {
    myBtn
  },
}
</script>

执行run server,访问localhost:8080,如图:

 我们点F12打开开发者工具,刷新页面,可以看到打印出create,证明调用了mixinHello的created方法:

然后点击按钮,打印出hello方法执行的内容。

当然如果这些方法和属性仅仅用在一个组件上,显然是没必要使用混入。混入的意义在于复用,如果很多组件都需要用到这些方法和属性,使用混入就恰到好处了。

选项合并

混入在复用时可以节省很多功夫,但是有衍生出另一个问题,如果我们在组件里面定义了名称相同的方法或者属性,执行的时候会用哪个?我们在src/components目录下创建零一个自定义按钮组件myBtnMerge.vue

<template>
  <div>
    <button style="margin: 10px" @click="hello">测试混入合并</button>
  </div>
</template>

<script>
import {mixinHello} from '@/mixin/mixinHello.js'

export default {
  mixins: [mixinHello],
  data(){
    return{
      current: 2,
      pageSize: 30
    }
  },
  created: function () {
    console.log('create merge')
  },
  methods: {
    hello: function () {
      console.log('hello merge!')
      console.log('current:' + this.current)
      console.log('pageSize:' + this.pageSize)
    }
  }
}
</script>

修改App.vue,注释掉myBtn,加上myBtnMerge

<template>
  <div>
    <!-- <my-btn></my-btn> -->
    <my-btn-merge></my-btn-merge>
  </div>
</template>

<script>
// import myBtn from '@/components/myBtn'
import myBtnMerge from '@/components/myBtnMerge'

export default {
  name: 'App',
  components: {
    // myBtn,
    myBtnMerge
  },
}
</script>

运行项目后,刷新网页,然后点击按钮,看到F12的输出:

这里我们有三个结论:

1、对于钩子函数,比如created、mounted、destroyed一类,组件自定义的方法和混入的方法同名时,会合并,并且混入的方法先于组件自定义的调用。

2、对于组件自定义的数据对象,和混入对象合并后,如果存在冲突的属性,则以组件自定义的优先。

3、对于methods、components 和 directives这一类,组件自定义的与混入的内部键值存在冲突时,以组件自定义的优先。

看起来这个有点像面向对象的继承。钩子函数像构造函数。其他则类似成员属性和成员方法。

如果不想使用默认的合并策略,混入还可以自定义合并的策略。具体实现读者可以自行搜索“optionMergeStrategies”这个关键词。

小结

混入的使用在我看来有点像面向对象里面的继承。好处是相同的属性和方法没必要重复写很多遍。尤其是做项目时,每个分页都要写一堆方法非常繁琐。当然对于钩子函数还是要谨慎使用混入,因为即使组件自定义了钩子函数,也不会覆盖混入的钩子函数。

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

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

相关文章

maya 卡通草地制作方法笔记

maya 卡通草地制作方法笔记 一、概述 maya制作草地的方法很多&#xff0c;有粒子替代种子法&#xff0c;painter笔刷法&#xff0c;xgen毛发模拟法&#xff0c;也有直接批量大量代理物体复制法等等。这次讨论的是用maya的painter笔刷法&#xff0c;审核制作卡通类简单的草地效…

Linux 进程概念 —— 冯 • 诺依曼体系结构

文章目录1. 冯诺依曼体系结构&#x1f351; 输入、输出设备&#x1f351; 中央处理器&#x1f351; 内存&#x1f351; 总线&#x1f351; 局部性原理&#x1f351; 总结2. 数据的流动过程1. 冯诺依曼体系结构 在 1945 年冯诺依曼和其他计算机科学家们提出了计算机具体实现的报…

URL和URI的区别

文章目录URLSchemeAuthorityPath to resourceParametersAnchorURL和URI参考URL 以下是 URL 的一些示例&#xff1a; https://developer.mozilla.org https://developer.mozilla.org/en-US/docs/Learn/ https://developer.mozilla.org/en-US/search?qURL这些 URL 中的任何一个…

[附源码]java毕业设计水库水面漂浮物WEB系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

攻防世界Check

Check 题目描述&#xff1a;套娃&#xff1f; 题目环境&#xff1a;https://download.csdn.net/download/m0_59188912/87097474 将图片放入winhex中打开&#xff0c;文件头与文件尾均正常&#xff0c;文件大小也正常。 判断为lsb隐写&#xff0c;查看三个颜色的plane 0通道&…

mysql复习【面试】

mysql复习【面试】前言mysql复习第08章 索引的创建与设计原则3.索引设计原则3.2哪些情况下适合创建索引3.4 哪些情况不适合创建索引第10章 索引优化与查询优化2.索引失效案例8.覆盖索引9. 如何给字符串添加索引10. 索引下推11. 普通索引 vs 唯一索引12.其他的优化策略13. 淘宝数…

深入浅出学习透析Nginx服务器的基本原理和配置指南「负载均衡篇」

负载均衡 之前的章节内容中【深入浅出学习透析Nginx服务器的基本原理和配置指南「初级实践篇 」】和 【深入浅出学习透析Nginx服务器的基本原理和配置指南「进阶实践篇」】&#xff0c;我们采用的代理仅仅指向一个服务器。但是网站在实际运营过程中&#xff0c;大部分都是以集群…

【万兴PDF专家】OCR引擎的离线安装方法,让你不受网速的折磨,PDF给OCR成可搜索的高级PDF,牛逼了我的万兴

一、问题背景 万兴PDF是一个很好用的PDF工具&#xff0c;它不仅可以实现PDF的浏览和批注常见功能&#xff0c;还具有OCR、压缩PDF&#xff0c;乃至批量化的功能。 因此&#xff0c;实在是一个非常值得花钱去买的PDF工具包&#xff01;&#xff01; 但是&#xff0c;软件里的O…

Prometheus与Grafana监控SpringBoot应用

Prometheus与Grafana监控SpringBoot应用 1.SpringBoot应用暴露端点 2.转换成Prometheus能解析得数据 3.向Prometheus注册时赋予项目名 docker部署 4701模板

七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例

七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例 文章目录七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例0.总体功能概述1.TIM硬件介绍1.1 TIM1/3级联硬件介绍1.1.1 主从模式介绍1.1.2 TIM1为主&#xff0c;TIM3为从&#xff0c;TIM3 的输入触发源选…

【计算机网络】习题(三)—— 数据链路层

【计算机网络】习题&#xff08;三&#xff09;—— 数据链路层2&#xff0e;数据链路层协议的功能不包括&#xff08;). A&#xff0e;定义数据格式 B。提供结点之间的可靠传输 C.控制对物理传输介质的访问 D.为终端结点隐蔽物理传输的细节 2.D 主是是数据链路层的主要功能包…

SECCON CTF 2022 web复现

skipinx 知识点&#xff1a;qs 参数解析错误qs简介 一句话介绍就是&#xff1a;qs是负责url参数转化的js库&#xff0c;当然也可以说是查询字符串解析和字符串化库。 详细了解移步&#xff1a;https://www.npmjs.com/package/qs qs简单用法 例如&#xff1a;我们 url 参数…

NTPv4协议解析

前言 本文的撰写基于RFC5905.NTP 是时间网络控制协议&#xff0c;V4版本相交V3版本&#xff0c;修复了V3存在的一些问题。尤其是NTPV4的拓展时间戳鼓励使用浮动双数据类型&#xff0c;这样使得NTP能够更好的支持1ns的场景&#xff0c;轮询间隔也从上一代的最多1024s拓展到了36…

上位机通信标准-OPC

OPC通信&#xff0c;基于OPC的通信是一种通信整合方案&#xff0c;通过OPC标准&#xff0c;整合各类协议并统一化接口。 1、上位机通信环境 - 品牌、各类繁多 - 通信环境的统一&#xff1a;OPC 2、OPC - 什么是OPC&#xff1a;OLE for Process Control Windows插件&#x…

数字集成电路设计(五、仿真验证与 Testbench 编写)(一)

文章目录引言1. Verilog HDL 电路仿真和验证概述2. Verilog HDL测试程序设计基础2.1 Testbench及其结构2.2 测试平台举例2.2.1 组合电路仿真环境搭建2.2.2 时序电路仿真环境搭建2.3 Verilog HDL仿真结果确认2.4 Verilog HDL仿真效率3. 与仿真相关的系统任务3.1 $display和\$wri…

Mybatis的二级缓存 (默认方式)

目录前置生效场景一场景二失效场景一场景二场景三场景四脏数据场景前置 什么是二级缓存: 一级缓存是基于sqlsession级别, 当一个sqlsession会话结束, 一级缓存也就结束了. 定义一级缓存为局部缓存, 那么二级缓存就是全局全局缓存 二级缓存是基于mapper文件的namespace级别&…

进程和线程的区别

进程和线程的区别 文章目录进程和线程的区别进程和线程的概念一、从属关系不同二、所属基本单位不同三、资源消耗不同四、是否同步和互斥额外补充问题&#xff1a;一个进程是不是可以创建无限数量的线程&#xff1f;参考链接进程和线程的概念 在了解区别之前&#xff0c;我们先…

【Java】IO流 - 字节流

文章目录FileInputStream 介绍FileOutputStream介绍文件输入输出综合使用【拷贝】FileInputStream 介绍 创建一个txt文件&#xff0c;写入 HelloWorld 并用Java读取&#xff1a; Test public void readFile01(){//提前创建一个文件hello.txt并编辑一个HelloWorldString filePa…

Nacos 注册中心的常用配置

1.服务端地址 spring.cloud.nacos.discovery.server-addr 无 Nacos Server 启动监听的 ip 地址和端口2.服务名 spring.cloud.nacos.discovery.s ervice ${spring.application.name} 给当前的服务命名3.服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP 设置服务所处的…

机器视觉之ros人脸识别

系列文章目录 机器视觉之ros人脸识别 ros人脸识别系列文章目录一、WIN下的环境设置二、连接摄像头设备到虚拟机三、安装摄像头驱动设备3.1判断安装usb还是uvc驱动包3.2查看摄像头设备3.3测试网络摄像头3.4安装摄像头驱动包四、调用视觉功能包五、人脸识别的调用一、WIN下的环境…