react框架设计原理及生命周期

1、ReactJS的背景
1、react是Facebook为实现其内部广告系统项目设计的一种前端界面构建方式
2、前端工程师的职责就是把逻辑数据实时反应到view层,既然涉及到vie层,  
   那就涉及到dom树。而大家都知道,复杂或者频繁的操作dom通常是造成性能  
   不好的地方。
3、所以设计react的地方就是其虚拟dom

2、ReactJS的设计原理
react的设计原理就是其引入的虚拟dom机制:
    1、react用javascript在浏览器端实现了一套虚拟dom api。
    2、基于react开发的时候所有的dom构造都是基于虚拟dom进行的  
    3、每当有state更改的时候,react就重新render一整套虚拟dom树,  
        react机制会将当前的整个dom树和上一次的dom树进行对比  
        取到diff,进行真实的dom更改。
    4、其实state也有一部分实现的是数据、html片段绑定,  
        直接更新的数据是包含的

    其实说到这里,往深一点考虑就是react的虚拟dom的diff算法
从大层面上来讲

react数据驱动更新dom树


深层次一点就是react的diff算法是怎么理解的。
    错误的见解:我曾经以为diff算法,就是深层次的diff,算法运算时只比较  
            不同的。但其实当时浅显的想法,确实是diff运算的结果,但不是  
            diff运算的算法。
    1、tree diff  
        也叫层级diff,

这里写图片描述

针对上图
    React对Virtual DOM树进行层级控制,只会对相同层级的DOM节点进行比  
    较,即同一个父元素下的所有子节点,当发现节点已经不存在了,则会删除掉  
    该节点下所有的子节点,不会再进行比较。这样只需要对DOM树进行一次遍  
    历,就可以完成整个树的比较。
    即使说a节点以及他的子节点被移动,但是react只关注同级比较,在第二层  
    把a及其子节点删了,在第三层再重新创建,所以diff运算量大,影响性能  
    不建议setState直接更改树的结构。最好是state颗粒度小,只改变树中  
    的某一个小的节点,那么diff的时候只会深度比较这一个小节点。

    2、componnet diff

这里写图片描述

    假如说因为某个条件切换,所以要显示不同的组件。
    1、比较两个组件的类型(D和G)
    2、如果(D和G)不是同一类型,进行diff算法,分析会影响性能  
       直接删掉上一个虚拟dom组件。 重新创建新的组件。
       如果是同一类型的组件,会按照层级策略深层对比每个节点。

    3、element diff
        精确的对属于同一层级的节点diff时,提供了3种节点操作,分别为INSERT_MARKUP(插入),MOVE_EXISTING(移动),REMOVE_NODE(删除)。
    如果同一层级,没有这个新节点会新增插入
    如果同一层级,如果有新节点,但是属性不一样,会复用节点,赋值属性
    如果同一层次,旧dom有,新dom没有,会删除这个节点。

总结:setState()触发一次组件重绘,其实就是虚拟dom重新生成,除非在  
shouldComponentUpdate()中实现了一些条件渲染逻辑。来允许和阻止是否需要  
调用指定组件的 render 方法。其实这个深入逻辑就是他触发了render,只是是  
否触发了内部的diff算法,return false 的时候,不diff,render出来的新  
旧dom一样。diff算法的复杂度为0。

这里写图片描述

React的核心
     1、使用组件定义界面,是一个View层的前端库,界面可能由  
        一个或者多个组件构建而成

    react的虚拟DOM是如何反映到真实的DOM树上的?
        解答:首次渲染大量DOM时,由于多了一层虚拟DOM的计算,会比  
        innerHTML插入慢。虚拟DOM可以确保只对界面上真正变化的部分进行  
        实际的DOM操作。
             比如:
             替换节点就需要调原生JS对象的repaceChild()接口;  
             对于修改属性,则要调setAttribute()接口等等。
3、react 生命周期

这里写图片描述

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习 React 框架原理的一个好方法是从官方文档开始。React 官方网站提供了一些教程和文档,可以帮助您了解 React 的基础概念和用法。 首先,您可以阅读 React 的官方教程,了解 React 如何工作,包括它的基本概念、组件、状态和生命周期等。这将有助于您熟悉 React 的基础用法。 其次,您可以学习 React 的官方文档,深入了解 React 的各种功能和用法。React 官方文档中包含了大量的详细信息,可以帮助您了解 React 的详细原理。 此外,您还可以通过实践来加深对 React 的理解。您可以尝试使用 React 构建一些小型应用或者尝试在现有应用中使用 React。通过不断实践和探究,您可以进一步加深对 React 的理解。 另外,您还可以参加一些在线课程或者报名参加 React 相关的培训,从专业人士那里学习 React 的知识和技巧。这些方式可以帮助您更快地掌握 React,并且能够得到专业的指导和帮助。 ### 回答2: 学习React这门框架原理可以按照以下步骤进行: 1. 学习JavaScript基础:React是基于JavaScript语言的,因此首先需要熟悉JavaScript的基本语法、函数、对象等概念。了解JavaScript的基础知识会有助于理解React的工作原理。 2. 学习React的核心概念:React的核心概念包括组件、虚拟DOM、状态和属性等。通过阅读React官方文档或相关教程,在编写简单的React组件时要了解这些概念的作用和用法。 3. 掌握React生命周期React组件具有生命周期,包括组件的创建、更新和销毁等阶段。掌握React生命周期方法,比如`componentDidMount`、`componentDidUpdate`等,可以更好地理解组件是如何工作的。 4. 理解React的虚拟DOM:React通过虚拟DOM来实现高效的页面更新。了解虚拟DOM的概念和原理,以及与真实DOM的区别,对于优化性能和理解React工作原理很有帮助。 5. 阅读React源码:阅读React源码是学习其原理的最佳途径之一。通过查看React的源码,可以深入理解其内部实现机制,例如组件渲染、事件处理、状态更新等。 6. 实践项目:通过实践项目来应用和巩固学习的知识。可以尝试创建简单的React应用、组件库或其他前端项目,通过实践来加深对React原理的理解。 7. 参与社区:加入React社区,与其他开发者交流并学习。可以参与讨论、提问问题,获得更多关于React原理方面的经验和见解。 在学习React原理过程中,需要保持持续的学习和实践,并且不断关注最新的React版本和更新,以保持与时俱进。 ### 回答3: 学习React框架原理主要分为以下几个步骤: 1. 掌握基础知识:学习React的基础概念,包括组件、虚拟DOM、状态和属性等。理解React的思想和设计模式,学习React相关的JavaScript语法和ES6+特性。 2. 实践项目:选择一个小型的React项目,通过实际的编码过程来理解React的使用和原理。可以先从快速搭建React开发环境开始,然后逐步添加组件、处理事件和状态等。通过项目实践,深入理解React的工作原理。 3. 深入研究源码:阅读React的源代码是学习React原理的重要一环。可以从React的官方文档中找到源码地址,阅读和分析React的核心模块。重点关注虚拟DOM的实现以及组件的生命周期等。可以通过调试源码、查阅相关资料和参考优秀的开源实现等方式来加强理解。 4. 学习相关技术栈:React通常会和其他技术栈一起使用,如Webpack、Babel、Redux等。学习这些相关的技术可以更好地理解React原理及其与其他技术的结合。可以参考相关文档、教程和实践项目来学习这些技术。 5. 参与社区和交流:积极参与React的相关社区和交流平台,如官方论坛、GitHub等,与其他开发者交流、分享经验和学习资源。参与开源项目,审阅他人的代码,给出自己的建议和改进。通过与社区的互动,不断提升自己的技术水平。 总之,学习React原理需要结合理论和实践,通过实际的项目和阅读源码来加深对其原理的理解。同时,学习相关技术栈和积极参与社区交流也是提高React技术水平的重要途径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值