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-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

css渐变色背景|<gradient示例详解

《css渐变色背景|<gradient示例详解》CSS渐变是一种从一种颜色平滑过渡到另一种颜色的效果,可以作为元素的背景,它包括线性渐变、径向渐变和锥形渐变,本文介绍css渐变色背景|<gradien... 使用渐变色作为背景可以直接将渐China编程变色用作元素的背景,可以看做是一种特殊的背景图片。(是作为背

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑