Vue.observable 是什么
Observable 翻译过来我们可以理解成可观察的
Vue.js2.6新增
Vue.observable,让一个对象变成响应式数据。Vue内部会用它来处理data函数返回的对象 。
返回的对象可以直接用于渲染函数和计算属性内,并且会在发生变更时触发相应的更新。也可以作为最小化的跨组件状态存储器
Vue.observable({ count : 1})
其作用等同于
new vue({ count : 1})
在 Vue 2.x 中,被传入的对象会直接被 Vue.observable 变更,它和被返回的对象是同一个对象
在 Vue 3.x 中,则会返回一个可响应的代理,而对源对象直接进行变更仍然是不可响应的
Observable 是什么
Vue.observable 是 Vue.js 提供的一个 API,它可以将一个普通的 JavaScript 对象转换为响应式对象。通过使用 Vue.observable,可以在任何地方创建一个响应式对象,而不仅仅是在 Vue 实例中使用。它在 Vue.js 的响应式系统中扮演了很重要的角色,可以用于管理状态、状态共享等场景。
Observable 作用
使用 Vue.observable 可以将一个普通对象转换为响应式对象,从而使其成为 Vue.js 的响应式系统的一部分。在转换之后,可以对该对象进行读取、修改等操作,并且在修改后,Vue.js 会自动进行重新渲染。
解决了什么问题
Vue.observable 的出现解决了在 Vue.js 中管理状态的问题。在 Vue.js 中,通过将状态保存在 Vue 实例的 data 属性中,可以实现状态管理,但是这种方式只能在 Vue 实例中使用,无法在其他地方使用。通过使用 Vue.observable,我们可以在任何地方创建一个响应式对象,从而更加灵活地管理状态。
适用场景
在非父子组件通信时,可以使用通常的bus或者使用vuex,但是实现的功能不是太复杂,而使用上面两个又有点繁琐。这时,observable就是一个很好的选择。
举个例子:
// utils.js 文件
import Vue from 'vue'
// 创建响应式对象
export const state = Vue.observable({count: 1
})export const mutations = Vue.observable({increase() {state.count++}
})
// 在 vue 文件中使用
<template><div id="app"><button @click="increaseCount">+</button>{{ num }}</div>
</template><script>
import { state, mutations } from '@/utils/index'
export default {name: 'App',computed: {num() {return state.count}},methods: {increaseCount: mutations.increase}
}
</script>
原理分析
源码位置:src\core\observer\index.js
export function observe (value: any, asRootData: ?boolean): Observer | void {if (!isObject(value) || value instanceof VNode) {return}let ob: Observer | void// 判断是否存在__ob__响应式属性if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {ob = value.__ob__} else if (shouldObserve &&!isServerRendering() &&(Array.isArray(value) || isPlainObject(value)) &&Object.isExtensible(value) &&!value._isVue) {// 实例化Observer响应式对象ob = new Observer(value)}if (asRootData && ob) {ob.vmCount++}return ob
}
Observer类
export class Observer {value: any;dep: Dep;vmCount: number; // number of vms that have this object as root $dataconstructor (value: any) {this.value = valuethis.dep = new Dep()this.vmCount = 0def(value, '__ob__', this)if (Array.isArray(value)) {if (hasProto) {protoAugment(value, arrayMethods)} else {copyAugment(value, arrayMethods, arrayKeys)}this.observeArray(value)} else {// 实例化对象是一个对象,进入walk方法this.walk(value)}
}
walk函数
walk (obj: Object) {const keys = Object.keys(obj)// 遍历key,通过defineReactive创建响应式对象for (let i = 0; i < keys.length; i++) {defineReactive(obj, keys[i])}
}
defineReactive方法
export function defineReactive (obj: Object,key: string,val: any,customSetter?: ?Function,shallow?: boolean
) {const dep = new Dep()const property = Object.getOwnPropertyDescriptor(obj, key)if (property && property.configurable === false) {return}// cater for pre-defined getter/settersconst getter = property && property.getconst setter = property && property.setif ((!getter || setter) && arguments.length === 2) {val = obj[key]}let childOb = !shallow && observe(val)// 接下来调用Object.defineProperty()给对象定义响应式属性Object.defineProperty(obj, key, {enumerable: true,configurable: true,get: function reactiveGetter () {const value = getter ? getter.call(obj) : valif (Dep.target) {dep.depend()if (childOb) {childOb.dep.depend()if (Array.isArray(value)) {dependArray(value)}}}return value},set: function reactiveSetter (newVal) {const value = getter ? getter.call(obj) : val/* eslint-disable no-self-compare */if (newVal === value || (newVal !== newVal && value !== value)) {return}/* eslint-enable no-self-compare */if (process.env.NODE_ENV !== 'production' && customSetter) {customSetter()}// #7981: for accessor properties without setterif (getter && !setter) returnif (setter) {setter.call(obj, newVal)} else {val = newVal}childOb = !shallow && observe(newVal)// 对观察者watchers进行通知,state就成了全局响应式对象dep.notify()}})
}
相关文章:
Vue.observable 是什么
Observable 翻译过来我们可以理解成可观察的 Vue.js2.6 新增 Vue.observable,让一个对象变成响应式数据。Vue 内部会用它来处理 data 函数返回的对象 。 返回的对象可以直接用于渲染函数和计算属性内,并且会在发生变更时触发相应的更新。也可以作为最小化…...
【五年创作纪念日】
机缘 我成为创作者的过程并不复杂,可以说是一个自然的发展。我是一名软件工程师,日常的工作主要是编程和解决问题。在工作的过程中,我发现有很多时候我需要查找一些特定的技术问题或者寻找一些最佳实践来解决我遇到的问题。在这个过程中&…...
数据库基础入门 — SQL排序与分页
我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…...
WordPress站点屏蔽过滤垃圾评论教程(Akismet反垃圾评论插件)
前段时间我的WordPress站点经常收到垃圾评论的轰炸,严重时一天会收到几十条垃圾评论。我这个小破站一没啥流量,二又不盈利,实在是不太理解为啥有人要这么执着地浪费资源在上面。 Akismet反垃圾评论插件 其实用了 Akismet 反垃圾评论插件后&a…...
Modbus-RTU协议讲解与实战
1、背景 工作需要,需要使用Modbus-RTU实现RS485通信,于是简单学习并实践了一下。 2、参考资料 一文看懂Modbus协议 3、协议说明 3.1、协议类型 当前设备采用Modbus-RTU协议,采用CRC-16_Modbus校验算法,数据链路层使用用标准串口协议,物理层采用RS485进行数据传输。 …...
数据结构 查找基本概念
敬请期待。。。 1. 适用于折半查找的表的存储方式及元素排列要求为(顺序方式存储,元素有序 )。 2. 有一个按元素值排好序的顺序表(长度大于2),分别用顺序查找和折半查找与给定值相等的元素,比较次数分别是s和b&am…...
『Linux升级路』基础开发工具——gcc/g++篇
🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、快速认识gcc/g 二、预处理 📒1.1头文件展开 📒1…...
面试:RocketMQ相关问题
文章目录 什么是 RocketMQ,有哪些使用场景?RocketMQ 由哪些⻆色组成,每个⻆色作用和特点是什么?RocketMQ 中的 Topic 和 JMS 的 queue 有什么区别?RocketMQ 消费模式有几种?RocketMQ 的 Consumer 是如何消费…...
2304. 网格中的最小路径代价 : 从「图论最短路」过渡到「O(1) 空间的原地模拟」
题目描述 这是 LeetCode 上的 「2304. 网格中的最小路径代价」 ,难度为 「中等」。 Tag : 「最短路」、「图」、「模拟」、「序列 DP」、「动态规划」 给你一个下标从 0 开始的整数矩阵 grid,矩阵大小为 m x n,由从 0 到 的不同整数组成。 你…...
【机器学习】算法性能评估常用指标总结
考虑一个二分问题,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被 预测成正类,即为真正类(True positive࿰…...
前端 JavaScript 与 HTML 怎么实现交互?
前端的交互性是通过JavaScript与HTML结合实现的。JavaScript作为一种脚本语言,可以嵌入HTML中,通过对DOM(文档对象模型)的操作,实现与用户的交互。以下将详细介绍前端JavaScript与HTML如何实现交互,包括事件…...
命令执行总结
之前做了一大堆的题目 都没有进行总结 现在来总结一下命令执行 我遇到的内容 这里我打算按照过滤进行总结 依据我做过的题目 过滤system 下面是一些常见的命令执行内容 system() passthru() exec() shell_exec() popen() proc_open() pcntl_exec() 反引号 同shell_exec() …...
机器学习——词向量模型(CBOW代码实现-未开始)
本来是不打算做这个CBOW代码案例的,想快马加鞭看看前馈神经网络 毕竟书都买好了 可是…可是…我看书的时候,感觉有点儿困难,哭的很大声… 感觉自己脑细胞可能无法这么快接受 要不,还是退而求个稍微难度没那么大的事,想…...
智慧海岛/海域方案:助力海洋空间智慧化、可视化管理
随着我国海洋经济的快速发展,海域海岛的安防技术也获得了进步。传统的安防监控模式已经满足不了海域海岛的远程监管需求。伴随着人工智能、边缘计算、大数据、通信传输技术、视频技术、物联网等信息化技术的发展,海岛海域在监管手段上,也迎来…...
Bin、Hex、ELF、AXF的区别
1.Bin Bin文件是最纯粹的二进制机器代码, 或者说是"顺序格式"。按照assembly code顺序翻译成binary machine code,内部没有地址标记。Bin是直接的内存映象表示,二进制文件大小即为文件所包含的数据的实际大小。 BIN文件就是直接的二进制文件&…...
IDEA安装教程
文章目录 1 下载IntelliJ IDEA2 安装3 IDEA配置4 创建项目 1 下载IntelliJ IDEA 官方网站上下载最新版本的IntelliJ IDEA。官方网站提供了两个版本:Community版和Ultimate版。 Community版是免费的,适用于个人和非商业用途。Ultimate版则需要付费购…...
DRF-项目-(1):构建纯净版的drf项目,不再使用django的后台管理,django的认证,django的session等功能,作为一个纯接口项目
项目的目录结构: -HeartFailure |-- apps |--user |--HeartFailure |-- static |--manage.py 一、django项目相关的 1、命令行中创建django项目 #1、切换到指定的虚拟环境中 workon my_drf#2、该虚拟环境已经安装好django和rest_framework了 django-admin startp…...
ubuntu 手动清理内存cache
/proc是一个虚拟文件系统,我们可以通过对它的读写操作来做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。 那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。操作如下: …...
gitBash中如何使用Linux中的tree命令
文章目录 在gitBash中安装tree的目的如何安装安装完成,就可以直接完美适配Linux系统了 在gitBash中安装tree的目的 如下图,powershell虽然可以看做是window下的Linux系统,但是根本就不适配很多Linux中的命令 如何安装 tree.exe安装网址 下载 tree 命令的 二进制包…...
【鸿蒙应用ArkTS开发系列】- 灌水区,鸿蒙ArkTs开发有问题可以在该帖中反馈
大家好, 这是一篇水贴,给大家提供一个交流沟通鸿蒙开发遇到问题的地方。 新增新增这个文章呢,大家在开发使用ArkTS开发鸿蒙应用或者鸿蒙服务的时候,有遇到疑问或者问题,可以在本文章评论区提问,我看到了如果知道怎么…...
智能体评估与传统语言模型评估的四大核心差异
1. 为什么智能体评估与传统语言模型评估截然不同评估一个能够自主决策、调用工具并完成多步骤任务的AI智能体,与评估一个仅生成文本的语言模型,完全是两回事。就像测试一台计算器的显示屏和测试整个银行系统的区别——前者只关心输出内容是否清晰&#x…...
5分钟搞定!让Switch手柄在PC上完美工作的终极指南
5分钟搞定!让Switch手柄在PC上完美工作的终极指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.com/gh_m…...
如何永久保存微信聊天记录:5步实现数据自主与智能分析
如何永久保存微信聊天记录:5步实现数据自主与智能分析 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...
VSCode 2026农业插件正式发布:支持遥感影像实时渲染、土壤pH热力图动态建模与IoT传感器流式接入(附官方API白皮书下载链接)
更多请点击: https://intelliparadigm.com 第一章:VSCode 2026农业数据可视化插件概览 VSCode 2026 农业数据可视化插件(AgriViz Extension v3.2)是专为精准农业开发者与农科研究人员设计的轻量级扩展,支持在本地编辑…...
AI技能工作流:一键为编程助手注入专业领域知识
1. 项目概述:告别重复教学,让AI助手瞬间拥有专业领域技能如果你和我一样,每天都在和Claude Code、Cursor这类AI编程助手打交道,那你一定经历过这个场景:每次开启一个新的对话,你都得从头开始教它——“写博…...
从零实现朴素贝叶斯分类器:原理与Python实战
1. 项目概述:从零实现朴素贝叶斯分类器三年前我第一次用scikit-learn的GaussianNB时,那个"黑箱"让我浑身不自在。直到亲手用Python从零实现朴素贝叶斯,才真正理解为什么这个诞生于18世纪的算法至今仍是文本分类的黄金标准。本文将带…...
“Token 第一股”迅策科技上市百日市值破千亿,A 轮投资人回报超 500 倍!
创投圈诞生超级回报这要从 4 个月前说起,“Token 第一股”迅策科技登陆港交所,当时股价起伏不定。没想到短短百余天后,公司市值一举突破 1000 亿港元,上市以来股价最新累计上涨高达 500%。迅策背后是一对父子,刘呈喜在…...
豆包 LeetCode 1872.石子游戏 VIII TypeScript实现
LeetCode 1872 石子游戏 VIII TypeScript 实现题目大意给定数组 stones ,两人轮流进行操作:- 每次选择至少前 k 个石子(k≥2) - 拿走前 k 个石子,得分 前 k 个石子总和 - 拿走后,后面石子向前拼接&#x…...
02华夏之光永存:黄大年茶思屋榜文解法「19期二题」 Data-free/Label-free模型压缩算法 专项解法
华夏之光永存:黄大年茶思屋榜文解法「19期二题」 Data-free/Label-free模型压缩算法 专项解法 一、摘要 本题为数据安全受限场景下模型轻量化部署的核心技术瓶颈,本文采用工程化可复现逻辑,提供两条标准化解题路径,全程符合工程师…...
别再手动移植了!用STM32CubeIDE一键导入旧版CubeMX (.ioc)配置,省时避坑
STM32CubeIDE高效复用旧版配置:从.ioc文件一键重建工程的终极指南 面对那些躺在硬盘角落里的旧版STM32CubeMX工程文件,你是否经历过这样的困境:当需要基于已验证的稳定配置进行二次开发时,不得不手动重建所有时钟树、引脚分配和外…...
