Vue.prototype 详解及使用
前言:
我们可能会在很多组件里用到数据/实用工具,但是不想污染全局作用域。这种情况下,可以通过在原型上定义它们使其在每个 Vue 的实例中可用。
1. 基本示例
在main.js中添加一个变量到 Vue.prototype
Vue.prototype.$appName = 'My App'
这样 $appName 就在所有的 Vue 实例中可用了,甚至在实例被创建之前就可以
beforeCreate: function () {console.log(this.$appName)}
控制台会打印出 My App
2. 为实例prototype设置作用域
为什么 appName 要以 $ 开头?
$ 是在 Vue 所有实例中都可用的 property 的一个简单约定。这样做会避免和已被定义的数据、方法、计算属性产生冲突。
如果我们设置:
Vue.prototype.appName = 'My App'
export default {data(){return{appName:'组件实例中的appName'}},beforeCreate: function () {console.log(this.appName)},created: function () {console.log(this.appName)},
}
</script>
日志中会先出现 “My App”,然后出现 “组件实例中的appName”,因为 this.appName 在实例被创建之后被 data 覆写了。我们通过 $ 为实例 property 设置作用域来避免这种事情发生。
3. 注册和使用全局变量
每个组件都是一个vue实例,Vue.prototype加一个变量,只是给每个组件加了一个属性,这个属性的值并不具有全局性。
比如以下例子:
Vue.prototype.$appName = 'main'
给所有组件注册了一个属性 $appName,赋予初始值 'main' ,所有组件都可以用 this.$appName 访问此变量;
如果组件中没有赋值,初始值都是'main'
app.vue
<template><div id="app">主组件name-》{{this.$appName}}<p>{{newName}}</p><button @click="changeName">更改name</button><button @click="$router.push('/cs')">跳转</button><hr><router-view></router-view></div>
</template><script>
export default {data(){return{newName:''}},methods:{changeName(){this.$appName = "changeName"this.newName=this.$appName}}
}
</script>
ce.vue
<template><div class="ce">跳转页面name-》{{this.$appName}}</div>
</template>
在app.vue中点击更改name,$appName值已发生改变,但cs.vue页面的值没有发生变化

如果要实现全局变量的功能,需要把属性变为引用类型
Vue.prototype.$appName = { name: 'main' }
使用 this.$appName.name 改变和引用相应的值
app.vue
<template><div id="app">主组件name-》{{this.$appName.name}}<p>{{newName}}</p><button @click="changeName">更改name</button><button @click="$router.push('/cs')">跳转</button><hr><router-view></router-view></div>
</template><script>
export default {data(){return{newName:''}},methods:{changeName(){this.$appName.name = "changeName"this.newName=this.$appName.name}}
}
</script>
cs.vue
<template><div class="ce">跳转页面name-》{{this.$appName.name}}</div>
</template>

在app.vue中点击更改name,$appName值已发生改变,cs.vue页面的值也发生了变化
4. 原型方法的上下文
在 JavaScript 中一个原型的方法会获得该实例的上下文,也就是说可以使用 this 访问:数据、计算属性、方法或其它任何定义在实例上的东西。
让我们将其用在一个名为 $reverseText 的方法上:
// main.js
Vue.prototype.$reverseText = function (propertyName) {this[propertyName] = this[propertyName].split('').reverse().join('')
}
<script>
export default {data() {return{message: 'Hello'}},created() {console.log(this.message) // => "Hello"this.$reverseText('message')console.log(this.message) // => "olleH"}
}
</script>

5. 应用示例
引入bus
const bus = new Vue()
Vue.prototype.$bus = bus
this.$bus.$emit("fun",'A组件传来的值')
axios…
6.Vue.prototype中的api
Vue.prototype是Vue.js框架中一个重要的原型对象,通过它可以在全局范围内定义和共享Vue实例方法、指令、过滤器等。在Vue.prototype对象上定义的属性和方法,会被挂载到所有Vue实例的原型链上,从而可以在组件中通过this访问。
一些常见的Vue.prototype中的API包括:
$emit(eventName[, ...args]):触发当前实例上的事件。可以通过该方法向父组件或同级组件传递数据。
$on(eventName, callback):监听当前实例上的事件。可以通过该方法在组件间传递数据。
$nextTick(callback):在下次 DOM 更新循环结束之后执行延迟回调。常用于更新后立即操作 DOM。
$watch(exprOrFn, callback[, options]):监听一个表达式或计算属性的变化,并在回调函数中处理变化。
$set(target, key, value):在一个已有的响应式对象上添加一个属性,并确保这个新属性同样是响应式的,可以通过该方法解决对象添加新属性时无法响应式更新的问题。
$delete(target, key):删除一个对象的属性,可以通过该方法解决对象删除属性时无法响应式更新的问题。
$refs:一个对象,持有所有注册过 ref 的子组件。
$el:当前组件的根 DOM 元素。
$options:当前实例的初始化选项对象,包括组件的各种选项。
我们可以解析某个api源码
7.$nextTick源码
$nextTick是Vue.js框架中一个常用的异步更新方法,用于在下一次DOM更新循环结束后执行回调函数。其源码如下:
Vue.prototype.$nextTick = function(fn) {return nextTick(fn, this)
}// _nextTickId存储下一个tick的id号
let _nextTickId = 0
// _callbacks存储回调函数
let _callbacks = []
// _pending存储是否正在执行
let _pending = false// nextTick函数
function nextTick(fn, ctx) {let id, callbackcallback = () => {// 如果传入了fn,则执行回调函数if (fn) {try {fn.call(ctx)} catch (e) {handleError(e, ctx, 'nextTick')}} else if (callback) {callback.id = null// 如果没有传入fn,但存在回调函数,则从_callbacks中移除该回调函数let index = _callbacks.indexOf(callback)if (index > -1) {_callbacks.splice(index, 1)}}}// 每次nextTick都会将该回调函数推入_callbacks中,等待执行_callbacks.push(callback)if (!_pending) {_pending = true// 使用微任务将回调函数异步执行if (typeof Promise !== 'undefined') {id = Promise.resolve().then(flushCallbacks)} else if (typeof MutationObserver !== 'undefined') {let observer = new MutationObserver(flushCallbacks)let textNode = document.createTextNode(String(_nextTickId))observer.observe(textNode, {characterData: true})id = () => {textNode.data = String(++_nextTickId)}} else if (typeof setImmediate !== 'undefined') {id = setImmediate(flushCallbacks)} else {id = setTimeout(flushCallbacks, 0)}}// 返回id,方便使用者手动取消nextTickif (!fn && typeof Promise !== 'undefined') {return id}
}// flushCallbacks函数,用于执行_callbacks中的所有回调函数
function flushCallbacks() {_pending = falseconst copies = _callbacks.slice(0)_callbacks.length = 0for (let i = 0; i < copies.length; i++) {copies[i]()}
}
$nextTick方法首先将回调函数推入_callbacks数组中,并使用一个_pending变量记录是否有回调函数正在执行。
如果_pending为false,则说明当前没有回调函数正在执行,需要异步执行flushCallbacks函数,从而依次执行_callbacks数组中的所有回调函数。在异步执行时,$nextTick方法会优先使用Promise的微任务方式执行回调函数,如果浏览器不支持Promise,则会尝试使用MutationObserver、setImmediate和setTimeout等方式执行。
当传入的回调函数为空时,$nextTick方法会返回一个id,方便使用者手动取消nextTick。
需要注意的是,$nextTick方法只会在组件实例的更新周期内生效,如果需要在Vue.js框架初始化后立即执行回调函数,可以使用Vue.nextTick()全局方法。
相关文章:
Vue.prototype 详解及使用
前言: 我们可能会在很多组件里用到数据/实用工具,但是不想污染全局作用域。这种情况下,可以通过在原型上定义它们使其在每个 Vue 的实例中可用。 1. 基本示例 在main.js中添加一个变量到 Vue.prototype Vue.prototype.$appName My App这…...
音视频八股文(3)--ffmpeg常见命令(2)
07-ffplay命令播放媒体 播放本地文件 播放本地 MP4 视频文件 test.mp4 的命令,从第 2 秒位置开始播放,播放时长为 10 秒,并且在窗口标题中显示 “test time”: ffplay -window_title "test time" -ss 2 -t 10 -autoe…...
使用bert4keras出现的问题(Process finished with exit code -1073741819 (0xC0000005))
1、环境 python 3.7.12 tensorflow 1.15 keras 2.3.1 bert4keras 0.9.7 protobuf 3.19.0 numpy 1.16.5 2、出现问题 numpy版本不兼容问题所以你就直接按照我的版本就可以了(numpy 1.16.5) Process finished with exit code -1073741819 (0xC0000005) …...
python协程实战
协程简介 协程(Coroutine)又称微线程、纤程,协程不是进程或线程,其执行过程类似于 Python 函数调用,Python 的 asyncio 模块实现的异步IO编程框架中,协程是对使用 async 关键字定义的异步函数的调用; 一个进程包含多个线程,类似…...
【论文笔记】VideoGPT: Video Generation using VQ-VAE and Transformers
论文标题:VideoGPT: Video Generation using VQ-VAE and Transformers 论文代码:https://wilson1yan. github.io/videogpt/index.html. 论文链接:https://arxiv.org/abs/2104.10157 发表时间: 2021年9月 Abstract 作者提出了…...
scala之基础面向对象
scala 既是面向对象 也是函数式编程 从Java 发展而来,依赖JVM环境 一、 scala 在linux中运行 scala 模式中直接编写运行 scala文件,load执行 scala编译程序 编译 运行 scala java 二、scala 数据类型 基础数据类型 val 不可变变量 函数式编程 …...
Qt5.12实战之多线程编程概念
1.为什么要使用多线程? a. 基于线程,同时处理多个任务,软件响应更灵敏 b.充分利用CPU的多核心功能增加应用运行效率 c.多线程在同一进程间使用共享通信更加高效 d.多个线程之间进行切换比多个进程之间进行切换,线程开销更少. 2.操作系统与进程关系 a. MS-DOS系统 属于单进程…...
格式化数据恢复怎么做?超实用的3种方法在这!
案例:格式化数据怎么恢复 【我的电脑前段时间中病毒了,无奈之下我只能将其格式化,但是很多重要的文件和图片之类的也一起被删除了,有什么方法可以恢复这些格式化的数据吗?非常着急!】 格式化数据恢复&…...
【Java|golang】1105. 填充书架---动态规划
给定一个数组 books ,其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架上(它们的厚度之和小于等于书架的宽度 shelfWidt…...
linux基础命令
linux基础命令 一、linux命令 熟悉账务linux命令对运维的好处是巨大的,只有熟悉了命令咱们在运维的操作上才能如鱼得水。 系统信息 arch #显示机器的处理器架构(1) uname -m #显示机器的处理器架构(2) uname -r #显示正在使用的内核版本 dmidecode -q …...
【三十天精通Vue 3】 第十八天 Vue 3的国际化详解
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、Vue 3 国际化概述1.1 国际化的概念1.2 国际化的作用1.3 V…...
02 - 学会提问
学会提问 一、引言 1.1 GPT简介 GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的大型预训练语言模型。 凭借其强大的文本生成、理解和处理能力,GPT已在诸如自然语言处理、机器翻译、文本摘要等多个领域取得了显著的…...
Java经典的Main方法面试题
mian方法是做什么用的? main方法是Java程序的入口方法,JVM在运行的时候会首先查找main方法不用main方法如何运行一个类? 不行,没有main方法我们不能运行Java类 在Java7之前,你可以通过使用静态初始化运行Java类。但是&…...
世界大学电子电气工程TOP10,国内大学哪家强?
EE究竟是什么专业 ? 在中国,工程系中跟电相关的专业,一般都切分得非常细。有电子工程、电气工程、通信工程、信息工程、自动化、测控仪器等。但在国外,一般把这些领域都归类到 Electrical Engineering 中,也就是我们常说的EE。 …...
5.3 牛顿-科茨公式
学习目标: 理解微积分基础知识,例如导数和微分的概念。学习牛顿-科茨公式的推导过程。这个公式实际上是使用泰勒公式对被积函数进行展开,并使用微积分的基本原理进行简化得到的。学习如何使用牛顿-科茨公式进行数值积分。这通常涉及到将被积…...
全注解下的SpringIoc 续2-bean的生命周期
spring中bean的生命周期 上一个小节梳理了一下Spring Boot的依赖注入的基本知识,今天来梳理一下spring中bean的生命周期。 下面,让我们一起看看bean在IOC容器中是怎么被创建和销毁的。 bean的生命周期大致分为四个部分: #mermaid-svg-GFXNEU…...
【VQ-VAE代码实战】Neural Discrete Representation Learning
【VQ-VAE代码实战】Neural Discrete Representation Learning 0、前言1、简介2、Basic IdeaLoss3、代码Load DataVector Quantizer LayerEncoder & Decoder ArchitectureTrainPlot LossView ReconstructionsView EmbeddingReference0、前言 论文地址:基于神经网络的,离散…...
gpt3.5和gpt4区别-gpt3.5和gpt4
gpt系列 GPT系列是OpenAI公司开发的一组基于人工智能深度学习技术的自然语言处理模型。GPT代表Generative Pre-trained Transformer,即预训练生成模型。目前,GPT模型已经推出了三代(GPT-1,GPT-2,GPT-3)&am…...
java获取当前系统时间
在Java中,可以使用以下几种方法获取当前系统时间: 方法1:使用java.util.Date类 java import java.util.Date; public class Main { public static void main(String[] args) { Date date new Date(); System.out.println("当前时间&…...
pbootcms自动配图出图插件
pbootcms文章无图自动出图配图插件的优点 1、提高文章的可读性和吸引力:插入图片可以丰富文章的内容和形式,增强读者的阅读体验和吸引力,提高文章的点击率和转化率。 2、节省时间和精力:手动添加图片需要花费大量时间和精力去寻找…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
