| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> 【vue设计与实现】组件的实现原理 3 - props与组件的被动更新 -> 正文阅读 |
|
[JavaScript知识库]【vue设计与实现】组件的实现原理 3 - props与组件的被动更新 |
在虚拟DOM层面,组件的props与普通HTML标签的属性差别不大。假设我们有如下模板:
这段模板对应的虚拟DOM是:
可以看到,模板与虚拟DOM几乎是“同构”的。另外,在编写组件时,需要显式地指定组件会接收那些props数据,如下面代码所示:
所以,对于一个组件,有两部分关于props的内容需要关心的是:
结合两个选项来解析出组件在渲染时需要用到的props数据,具体实现如下:
我们将组件选项中定义的MyComponent.props对象和为组件传递的vnode.props对象想结合,最终解析出组件在渲染时需要使用的props和attrs数据。
处理完props数据后,再来看关于props数据变化的问题。props本质上是父组件的数据,当props发生变化时,会触发父组件重新渲染,假设父组件的模板如下:
其中,响应式数据title的初始值为字符串"A big title",因此首次渲染时,父组件的虚拟DOM为:
当响应式数据title发生变化时,父组件的渲染函数会重新执行,产生的新虚拟DOM如下:
接着,父组件会进行自更新。在更新过程中,渲染器发现父组件的subTree包含组件类型的虚拟节点,所以会调用patchComponent函数完成子组件的更新,如下patch函数的代码所示:
我们由父组件自更新所引起的子组件更新叫做子组件的被动更新。
patchComponent函数的具体实现如下:
要注意的是
上面的实现中,没有处理attrs与slots的更新,attrs的更新本质上与更新props的原理相似。本质上,原理都是根据组件的props选项定义以及为组件传递的props数据来处理。 由于props数据与组件自身的状态数据都需要暴露到渲染函数中,并使得渲染函数能够通过this访问它们,因此需要封装一个渲染上下文对象,如下面代码所示:
上面这段代码,为组件实例创建了一个代理对象,该对象即渲染上下文对象。其作用是拦截数据状态的读取和设置操作,每当在渲染函数或生命周期钩子中通过this读取数据时,都会优先从组件的自身状态中读取,如果组件本身并没有对应的数据,则再从props数据中读取。最后将渲染上下文作为渲染函数以及生命周期钩子的this值即可。 补充知识
|
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 17:49:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |