Vue源码解析+关于组件的data属性+为什么组件内data可以直接this等等(摸索)

2023-11-22 16:48

本文主要是介绍Vue源码解析+关于组件的data属性+为什么组件内data可以直接this等等(摸索),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

疑问1:为什么组件内data为方法而不是一个对象?
疑问2:为什么data就挂在了Vue实例上,用this直接取?

源码

//初始化
function initData(vm: Component) {let data = vm.$options.data    //组件数据data = vm._data = typeof data === 'function'      //放在实例的_data属性上,? getData(data, vm): data || {}.........略过最后...// 通过proxy把data里的值代理到vm对象上proxy(vm, `_data`, key);
}// proxy函数相关的代码
// 定义访问器属性
const sharedPropertyDefinition = {    //.defineProperty的配置enumerable: true,configurable: true,get: noop,set: noop
}function proxy (target: Object, sourceKey: string, key: string) {sharedPropertyDefinition.get = function proxyGetter() {return this[sourceKey][key]; // 即访问 this['_data'][key]}sharedPropertyDefinition.set = function proxySetter(val) {this[sourceKey][key] = val;}	Object.defineProperty(target, key, sharedPropertyDefinition)
}
export function getData (data: Function, vm: Component): any {// #7573 disable dep collection when invoking data getterspushTarget()try {return data.call(vm, vm)    } catch (e) {handleError(e, vm, `data()`)return {}} finally {popTarget()}
}

1:为什么组件内data为方法而不是一个对象?

组件data有一个三元判断为:判断为方法时调用getData,是对象时返回原值,或者判空。
getData:该方法主要执行就是调用data,即data.call(vm, vm),至于为什么传进去vm,不知道!希望有大神告知!

data = vm._data = typeof data === 'function'  ? getData(data, vm): data || {}

组件的数据放在实例的_data属性上。
如果组件的data是一个对象,对象是引用类型。则该组件复用时,注意是该组件复用时会造成混乱。如果采用从方法return出来的方式那就是每次复用都有自己一块独立的内存。

2:为什么data就挂在了Vue实例上,用this直接取?
他是通过proxy(代理)把data里的值代理到vm对象上也就是vue实例上,采用了劫持Object.defineProperty,当获取vue实例上的某个属性时,就代理到_data上。

第一次看到这,有不对的希望指正!!

这篇关于Vue源码解析+关于组件的data属性+为什么组件内data可以直接this等等(摸索)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/411525

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown