初识Vue-混入mixins(详解分发 Vue 组件中可复用功能)

目录

一、mixins混入介绍

概念

特点

功能

用法

应用

 二、mixins混入语法

1.简单示例

2.选项合并

3.全局混入

4.混入对象选项:

5.注意事项:

三、mixins混入应用实例

1.身份验证逻辑混入

2.表单验证混入

3.全局工具函数混入

 四、总结


一、mixins混入介绍

概念

混入是一种将可复用功能注入到 Vue 组件中的方式,它允许你将组件中的一些选项混合到多个组件中。

特点

  • 可复用性: 可以定义一次,然后在多个组件中重复使用。
  • 灵活性: 可以根据需要在不同的组件中混合不同的选项。
  • 优先级: 如果组件和混入对象具有相同的选项,则组件选项将会覆盖混入对象的选项。

功能

  • 数据: 可以在混入对象中定义数据属性。
  • 方法: 可以在混入对象中定义方法,这些方法将被注入到组件中。
  • 生命周期钩子: 可以在混入对象中定义生命周期钩子函数,它们将与组件的生命周期钩子函数合并。
  • 计算属性、观察者和指令: 你可以在混入对象中定义计算属性、观察者和指令。
  • 组件配置: 你还可以在混入对象中定义组件的配置选项。

用法

  1. 全局混入: 可以在 Vue 实例创建之前通过 Vue.mixin() 全局注册一个混入,这样在所有组件中都可以使用。
  2. 局部混入: 在组件中使用 mixins 选项来引入一个或多个混入对象。

应用

  • 共享逻辑: 当多个组件需要共享相同的逻辑时,可以将该逻辑封装在一个混入对象中,并在需要时引入。
  • 跨项目复用: 如果有一些通用的功能需要在多个项目中使用,可以将其封装为混入对象,方便在不同的项目中复用。

 二、mixins混入语法

1.简单示例

混入 (mixins)定义了一部分可复用的方法或者计算属性。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。

// 定义混入对象
const myMixin = {created() {this.hello()},methods: {hello() {console.log('欢迎来到混入实例-RUNOOB!')}}
}// 定义一个应用,使用混入
const app = Vue.createApp({mixins: [myMixin]
})app.mount('#app') // => "欢迎来到混入实例-RUNOOB!"

2.选项合并

当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合。

比如,数据对象在内部会进行浅合并 (一层属性深度),在和组件的数据发生冲突时以组件数据优先。

以下实例中,Vue 实例与混入对象包含了相同的方法。从输出结果可以看出两个选项合并了。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id = "app"></div>
<script type = "text/javascript">
const myMixin = {data() {return {message: 'hello',foo: 'runoob'}}
}const app = Vue.createApp({mixins: [myMixin],data() {return {message: 'goodbye',bar: 'def'}},created() {document.write(JSON.stringify(this.$data)) }
})

输出结果为

{"message":"goodbye","foo":"runoob","bar":"def"}

 同名钩子函数将合并为一个数组,因此都将被调用。另外,mixin 对象的钩子将在组件自身钩子之前调用。

const myMixin = {created() {console.log('mixin 对象的钩子被调用')}
}const app = Vue.createApp({mixins: [myMixin],created() {console.log('组件钩子被调用')}
})// => "mixin 对象的钩子被调用"
// => "组件钩子被调用"

值为对象的选项,例如 methods、components 和 directives,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。

const myMixin = {methods: {foo() {console.log('foo')},conflicting() {console.log('from mixin')}}
}const app = Vue.createApp({mixins: [myMixin],methods: {bar() {console.log('bar')},conflicting() {console.log('from self')}}
})const vm = app.mount('#app')vm.foo() // => "foo"
vm.bar() // => "bar"
vm.conflicting() // => "from self"

以上实例,我们调用了以下三个方法:

vm.foo();
vm.bar();
vm.conflicting();

从输出结果 methods 选项中如果碰到相同的函数名则 Vue 实例有更高的优先级会执行输出。

3.全局混入

也可以全局注册混入对象。注意使用! 一旦使用全局混入对象,将会影响到 所有 之后创建的 Vue 实例。使用恰当时,可以为自定义对象注入处理逻辑。

const app = Vue.createApp({myOption: 'hello!'
})// 为自定义的选项 'myOption' 注入一个处理器。
app.mixin({created() {const myOption = this.$options.myOptionif (myOption) {document.write(myOption)}}
})app.mount('#app') // => "hello!"

谨慎使用全局混入对象,因为会影响到每个单独创建的 Vue 实例 (包括第三方模板)。

4.混入对象选项:

混入对象可以包含以下选项:

  • 数据(data): 可以是对象或函数,用于定义组件的数据属性。
  • 方法(methods): 包含组件的方法。
  • 生命周期钩子(lifecycle hooks): 包含组件的生命周期钩子函数。
  • 计算属性、观察者和指令: 可以在混入对象中定义计算属性、观察者和指令等组件选项。

5.注意事项:

  • 如果组件和混入对象具有相同的选项,则组件选项将会覆盖混入对象的选项。
  • 当混入对象和组件本身有相同的生命周期钩子函数时,它们都会被调用,混入对象的钩子将在组件自身钩子之前调用。

三、mixins混入应用实例

1.身份验证逻辑混入

如果你的应用有多个需要身份验证的组件,你可以创建一个身份验证逻辑混入对象,并在需要的组件中引入它。这个混入对象可以包含登录、注销等身份验证相关的方法,以及判断用户是否已经登录的逻辑。

const authMixin = {methods: {login() {// 登录逻辑},logout() {// 注销逻辑}},computed: {isAuthenticated() {// 判断用户是否已经登录}}
};Vue.mixin(authMixin);

2.表单验证混入

如果你的应用有多个需要表单验证的组件,你可以创建一个表单验证混入对象,并在需要的组件中引入它。这个混入对象可以包含各种常见的表单验证规则和方法。

const formValidationMixin = {methods: {validateEmail(email) {// 邮箱验证逻辑},validatePassword(password) {// 密码验证逻辑}}
};Vue.mixin(formValidationMixin);

3.全局工具函数混入

如果你的应用中有一些常用的工具函数需要在多个组件中使用,你可以创建一个全局工具函数混入对象,并在需要的组件中引入它。

const utilsMixin = {methods: {formatDate(date) {// 格式化日期},formatCurrency(amount) {// 格式化货币金额}}
};Vue.mixin(utilsMixin);

 四、总结

  1. 混入是什么: 混入是一种Vue.js提供的一种灵活的代码复用方式,允许将一组组件选项合并到一个对象中,然后将其应用到多个组件中。

  2. 全局混入: 可以使用Vue.mixin()在Vue实例创建之前全局注册一个混入,使得混入对象中的选项对所有组件都可用。

  3. 局部混入: 在组件中使用mixins选项引入一个或多个混入对象,使得这些混入对象中的选项对该组件及其子组件可用。

  4. 混入对象选项: 混入对象可以包含数据、方法、生命周期钩子、计算属性、观察者和指令等组件选项。

  5. 选项合并规则: 如果组件和混入对象具有相同的选项,则组件选项将会覆盖混入对象的选项。当混入对象和组件本身有相同的生命周期钩子函数时,它们都会被调用,混入对象的钩子将在组件自身钩子之前调用。

  6. 应用实例: 混入可以用于共享身份验证逻辑、表单验证规则、全局工具函数等多种场景,提高代码的复用性和可维护性。

 

 

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

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

相关文章

Java集合简介

单列集合 双列集合

PWN入门--栈溢出

PWN入门–栈溢出 栈概要 介于网上各种wp在栈溢出利用脚本方面浅入浅出&#xff0c;深入讲一下栈溢出利用时&#xff0c;地址如何计算&#xff0c;栈中垃圾数据如何填充&#xff0c;函数调用时 参数 在栈中的分布&#xff0c; 栈帧的生成&#xff0c;函数返回值ip在栈中的摆放…

【强化学习】公平性Actor-Critic算法

Bringing Fairness to Actor-Critic Reinforcement Learning for Network Utility Optimization 阅读笔记 Problem FormulationLearning AlgorithmLearning with Multiplicative-Adjusted RewardsSolving Fairness Utility Optimization Evaluations 在网络优化问题中&#xff…

若依前端-APP中使用数据字典

1 在main.js文件中注册有关字典的组件和相关的属性等&#xff0c;如下所示&#xff0c;有添加字典注解的地方 import Vue from vue import App from ./App import wx from weixin-js-sdk import store from ./store // store import plugins from ./plugins // plugins import…

日志traceId追踪

文章目录 背景MDC简介 背景 在定位问题时&#xff0c;我们希望通过grep traceIdxxx *.log快速的过滤出某次请求的所有日志。 MDC简介 SLF4J日志框架提供了一个MDC(Mapped Diagnostic Contexts)工具类&#xff0c; MDC可以帮我们记录追踪日志的功能&#xff0c;它支持 Log4J和…

了解外汇震荡类货币对特征与交易策略

外汇市场是全球最大的金融市场&#xff0c;每天的交易量超过6万亿美元。在这个市场上&#xff0c;货币对之间的价格变动反映了全球经济和政治动态。外汇货币对通常被分为三类&#xff1a;主要货币对、次要货币对和外来货币对。而在交易这些货币对时&#xff0c;市场表现通常分为…

适合小白使用的编译器(c语言和Java编译器专属篇)

本节课主要讲如何安装适合编程小白的编译器 废话不多说&#xff0c;我们现在开始 c/c篇 首先&#xff0c;进入edge浏览器&#xff0c;在搜索框输入visual studio &#xff0c;找到带我画圈的图标&#xff0c;点击downloads 找到community版&#xff08;社区版&#xff09;的下…

BFS Ekoparty 2022 -- Linux Kernel Exploitation Challenge

前言 昨天一个师傅给了我一道 linux kernel pwn 题目&#xff0c;然后我看了感觉非常有意思&#xff0c;题目也不算难&#xff08;在看了作者的提示下&#xff09;&#xff0c;所以就花时间做了做&#xff0c;在这里简单记录一下。这个题是 BFS Lab 2022 年的一道招聘题&#…

原型模式类图与代码

现要求实现一个能够自动生成求职简历的程序&#xff0c;简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同&#xff0c;并尽量减少程序中的重复代码。 采用原型模式(Prototype)来实现上述要求&#xff0c;得到如图 7.25 所示的类图。 原…

go Gin项目实战

Gin项目实战 Gin博客项目-项目架构Gin博客项目-集成gormGin博客项目-集成Bootstrap创建用户表单Gin 博客项目-实现控制器和路由Gin 博客项目-设计静态页面Gin 博客项目-用户注册Gin 博客项目-用户登录Gin 博客项目-集成markdown编辑器Gin 博客项目-创建博客模型和DAOGin 博客项…

FME学习之旅---day26

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 【由于上周&#xff0c;上班状态不是很好&#xff0c;事情多又杂&#xff0c;没有学习的劲头&#xff0c;就短暂的休息了一下下。双休爬山&#xff0c;给自己上了强度&#xff0c;今天才缓过来…

codeforce#938 (div3) 题解

C. Inhabitant of the Deep Sea 数组第一个元素减一下&#xff0c;最后一个元素减一下&#xff0c;一共能减k次&#xff0c;问有多少元素能减到0.细节模拟我是傻逼&#xff0c;有问题建议直接看tc面像tc编程 #include <iostream> #include <string.h> #include &…

品高虚拟化后端存储的发展演进

在品高虚拟化技术不断发展的过程中&#xff0c;虚拟化的后端存储一直是关注的焦点之一。 本文将从最初的文件存储和NFS开始&#xff0c;追溯到集中式存储SAN&#xff0c;然后选择了Ceph的RBD方式&#xff0c;并最终抵达选择支持vhost协议的后端存储的现状&#xff0c;我们将探…

bash: pip: command not found

随笔 不同系统安装pip command 目录 1. 对于 CentOS/RHEL 系统 2. 对于 Debian/Ubuntu 系统 3. 有些 Linux 发行版可能默认使用 python2 4. 如果你已经安装了 python3&#xff0c;可尝试通过 get-pip.py 脚本安装 4.1 首先&#xff0c;下载 get-pip.py 脚本 4.2 在脚…

Android 桌面小组件 AppWidgetProvider

Android 桌面小组件 AppWidgetProvider 简介 小组件就是可以添加到手机桌面的窗口。点击窗口可以进入应用或者进入应用的某一个页面。 widget 组件 如需创建 widget&#xff0c;您需要以下基本组件&#xff1a; AppWidgetProviderInfo 对象 描述 widget 的元数据&#xff0…

一键式手机文件传输,让你生活更便捷!

随着手机功能不断增强&#xff0c;我们经常需要在不同设备之间传输文件&#xff0c;如照片、音乐、视频、文档等。不过&#xff0c;现在有许多应用程序和技术可以帮助我们实现手机文件传输的便捷和快速。本文将介绍2类让手机文件传输一键完成的方法&#xff0c;让你的生活更加便…

学习使用js给指定日期加减指定天数

学习使用js给指定日期加减指定天数 具体代码 具体代码 function add_day(date, days) {if (days undefined || days ) {days 1;}let date_new new Date(date);date_new.setDate(date_new.getDate() days);let month date_new.getMonth() 1; //月份从0开始所以需要1var d…

vue3 下载图片(包括多图片下载)

单图片下载 //使用 download(https://img1.baidu.com/it/u1493209339,2544178769&fm253&app138&sizew931&n0&fJPEG&fmtauto?sec1715101200&t854f3434686cfd2cba9d6a528597d15c)//下载逻辑 const download async (modelUrl) > {const respons…

redis 使用记录

redis 使用记录 下载运行配置文件启动 参考 下载 github: Redis for Windows 或者从百度网盘下载 Redis version 3.2.100 链接: https://pan.baidu.com/s/1kxNOuZFunvVhVy1cfQzCDA?pwdpibh 运行 双击运行 运行效果 如果出错&#xff1a;查看是否项目路径是否包含中文 配…

如何用virtualbox 来跑openwrt 镜像?

1.下载好openwrt源代吗&#xff0c;编译之前先配置&#xff0c;让编译产生x86的virtualbox 镜像&#xff1a; 编译完成之后会产生vdi镜像文件&#xff0c; 在virtualbox 中创建一虚拟机&#xff0c;类型选择linux,版本other linux 64: 内存选择512&#xff1a; 这个地方把镜像…