React框架的基本运行原理
React的本质是内部维护了一套虚拟DOM树,这个虚拟DOM树就是一棵js对象树,它和真实DOM树是一致的,一一对应的。
当某一个组件的state发生修改时,就会生成一个新的虚拟DOM,让它和旧的虚拟DOM通过Diff算法进行对比,生成一组差异对象。
然后变量差异对象,将修改更新到真实的DOM树上。
React的三大特性:JSX语法糖,虚拟DOM, Diff算法
它们之间的关系可以简单理解为:
1.JSX语法糖转换:在webpack进行编译时,JSX语法糖 被转换成 React.createElement的React的API调用,React.createElement的React的API调用会得到一个js对象。
2.生成抽象语法树:通过将这棵JSX树中的每个元素 转换成相应的 React.createElement 的API调用,最终得到一棵js对象树, 这棵js对象树就是虚拟DOM树。
3.使用Diff算法对这棵树进行比较运算,得出要更新的虚拟DOM差异对象,然后遍历这些差异对象,将修改更新到真实的DOM中去。
Diff算法对这棵js对象树的diff分三层:
tree diff :树层级的对比
component diff :组件层级的对比
element diff: 元素层级的对比
key: key属性,把页面上的DOM节点与虚拟DOM节点做一层关联关系。

DOM与虚拟DOM的概念
原来的DOM是浏览器中的JS提供的功能,所以我们只能使用浏览器提供的API,如:getElementById进行操作DOM对象。
虚拟DOM是程序员手动模拟的,类似与浏览器中的DOM。
虚拟DOM出现的原因
是为了提升浏览器的渲染性能,避免因为某一部分DOM元素的更新,刷新整棵DOM树。所以使用js创建一个js对象来模拟一个DOM对象。
一个js对象中包含多个子对象,就构成了一棵虚拟的DOM树。
通过前后比较2棵虚拟DOM树的差异,将得到的差异对象进行遍历批量更新,从而真实的DOM得到了页面更新。
React内部已经实现了虚拟DOM, 所以通过React框架开发的web页面,默认就有了这个能力。
JSX语法糖
在React中,不能像Vue中那样直接写html元素,要通过react的API创建元素React.createElelement()
React.createElement有三个参数,并返回一个dom对象,也就是js对象
参数一:标签名字符串
参数二:属性对象
参数三及其更多:子元素
JSX的原理是什么?
JSX是符合XML规范的JS语法
JSX只是一个语法糖,它内部运行的时候是把类似于HTML这样的标签代码转换为React.createElement的形式。
 
需要安装:npm i babel-preset-react -D
webpack没法编译jsx代码,它会找到babel进行编译这个代码,babel发现它是react内的语法,就会调用babel-preset-react插件进行解析
babel碰到<>按照html的语义, 使用React.createElement进行解析
碰到{}会按照js进行解析, {}中只能存放一个带返回值的js语句
/*
React: 创建,修改React组件,管理组件的生命周期
ReactDOM: 操作真实Dom, 将虚拟Dom渲染到真实的Dom之上。
*/
import React from "react";
import ReactDOM from "react-dom"; /*
在React中,不能像Vue中那样直接写html元素,要通过react的API创建元素React.createElelement()
React.createElement有三个参数,并返回一个dom对象,也就是js对象
参数一:标签名字符串
参数二:属性对象
参数三及其更多:子元素
*/ /*
JSX的原理是什么?
JSX是符合XML规范的JS语法
JSX只是一个语法糖,它内部运行的时候是把类似于HTML这样的标签代码转换为React.createElement的形式。 需要安装:npm i babel-preset-react -D
webpack没法编译jsx代码,它会找到babel进行编译这个代码,babel发现它是react内的语法,就会调用babel-preset-react插件进行解析
*/ /*
babel碰到<>按照html的语义, 使用React.createElement进行解析
碰到{}会按照js进行解析, {}中只能存放一个带返回值的js语句
*/ var list = []
for (let i = 0; i < 10; i++) {
var p = <p key={i} >这是for循环生成的p标签</p>
list.push(p)
} var myTitle = "这是标题的title"
var h2D = <div>
这是一个jsx的h2标题
<h1 title={ myTitle }>JSX真好用</h1>
{ list }
{/* 这是jsx中的注释 */}
</div> var divD = React.createElement("div", {title:"这是一个div", id:"rootSub"},"这是一个React创建的div", h2D) /*
将react元素渲染到页面对应的位置上。
*/
ReactDOM.render(divD, document.getElementById("root"))

React组件定义方式

JS中定义对象的方式有2种:
1.使用构造函数
2.使用类
构造函数组件
js文件内部的构造函数组件
/*
React中,构造函数就是一个最基本的组件, 使用时把构造函数的名称当做html标签名使用。
React自定义的组件必须是大写字母开头,小写字母编译器默认是浏览器提供的组件。会从浏览器中去查找。
*/
function Hello() {
return <div>
这是使用Hello构造函数 创建的基本组件Hello
</div>
}
jsx文件内的构造函数组件
import React from "react"

function World(props) {
return <div>
接收到的参数:{props.name}
<hr></hr>
</div>
}
export default World
可以通过对象参数扩散的方式进行批量传参
{/* 如果传递的参数是个对象,可以进行对对象进行属性扩散进行批量传参 */}
<World {...person}></World>
 
类组件
在类中定义的方法和利用构造函数创建对象时将方法放在构造函数protoType中,在内存中的位置是一样的。
// 1.构造函数, 创建对象
function Person(name, age) {
this.name = name;
this.age = age;
}
//Person.prototype中定义的方法和属性是是定义在当前对象的protoType中的(A区域)
Person.prototype.say = function () {
console.log('hello')
}
Person.prototype.myId = 220 var p1 = new Person('jack', 12);
console.log(p1); // 2.类,创建对象, 类的本质也是一个构造方法实现的
class Per {
//构造器, 调用new方法创建对象时,会调用个constructor
constructor(name, age){
this.name = name
this.age = age
}
//es6 定义的方法定义方式,类中的方法也是定义在当前对象的protoType中的(A区域)
say() {
console.log('这是Person中的hello方法')
} //class中的static方法和变量,是放在了constructor方法内部的原型对象中(B区域)
static myId = 230;
static myIdGet = function () {
console.log('myIdGet')
}
} var p2 = new Per('jack22', 122);
console.log(p2);
类的重要特性:封装,继承,多态, // 3.类的重要特性:封装,继承,多态,
//继承:实现功能的复用
class Chinese extends Per {
constructor(address, sex, name, age){
super(name, age)
this.address = address
this.sex = sex
}
} var c1 = new Chinese('北京', '男', 'jack', 12)
console.log(c1);
Chinese.myIdGet(); //多态:父类中定义一个抽象空方法,不同的子类进行不同的重写实现
class Animal {
say() { }
}
class Dog extends Animal {
say(){
console.log("wang wang");
}
}
class Cat extends Animal {
say(){
console.log("miao miao");
}
}
 

React框架的基本运行原理与组件定义方式的更多相关文章

  1. vue组件定义方式,vue父子组件间的传值

    vue组件定义方式,vue父子组件间的传值 <!DOCTYPE html> <html lang="zh-cn"> <head> <met ...

  2. Serverless 的运行原理与组件架构

    本文重点探讨下开发者使用 Serverless 时经常遇到的一些问题,以及如何解决 过去一年,我们和大量 Serverless 用户进行了线上和线下的交流,了解大家的业务场景.对 Serverless ...

  3. 测试框架Unitest的运行原理,以及多个测试类中的执行顺序以及简化方法

    单元测试单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一 ...

  4. vue组件定义方式

    一.全局组件 <div id="box"> {{msg}} <my-aaa></my-aaa> </div> var Home = ...

  5. Asp.net WebPages框架运行原理浅析(转)

    在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用 WebFo ...

  6. Asp.net WebPages框架运行原理浅析

    [来源] 达内    [编辑] 达内   [时间]2012-09-14 在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和 ...

  7. ASP.NET的运行原理与运行机制

    在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用WebFor ...

  8. Dora.Interception, 一个为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式

    相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...

  9. Dora.Interception, 为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式

    相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...

  10. React Native运行原理解析

    Facebook 于2015年9月15日推出react native for Android 版本, 加上2014年底已经开源的IOS版本,至此RN (react-native)真正成为跨平台的客户端 ...

随机推荐

  1. PostgreSQL 12 文档: 部分 I. 教程

    部分 I. 教程 欢迎来到PostgreSQL教程.下面的几章将为那些新接触PostgreSQL.关系数据库概念和 SQL 语言的读者给出一个简单介绍.我们只假定读者拥有关于如何使用计算机的一般知识. ...

  2. 解读XML - Foreach循环

    <foreach item="item" index="index" collection="supplyIdAry" open=&q ...

  3. 使用 OpenAPI 构建 RESTful API 文档

    作为一名开发者,往往需要编写程序的 API 文档,尤其是 Web 后端开发者,在跟前端对接 HTTP 接口的时候,一个好的 API 文档能够大大提高协作效率,降低沟通成本,本文就来聊聊如何使用 Ope ...

  4. Hello-FPGA CoaXPress 2.0 FPGA HOST IP Core Demo User Manual

    目录 Hello-FPGA CoaXPress 2.0 Host FPGA IP Core Demo 4 1 说明 4 2 设备连接 5 3 VIVADO FPGA工程 6 4 SDK工程 9 图 1 ...

  5. 可不要忽视了TypeScript中函数和类的重要性

    上一篇文章总结了 TypeScript的类型注解,这一篇来聊聊同样重要的函数和类 函数 以下声明了一个函数类型,通过type来定义类型别名,void 表示没有返回值 type fnType = () ...

  6. 基于weave实现docker跨主机网络通信

    前言 IP: 192.168.0.10 192.168.0.11 系统版本:centos 7 weave版本:2.8.1,下载地址:https://git.io/weave docker版本:18.0 ...

  7. 痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间. 最近痞子衡写了篇文章 <i.MXRT从Serial N ...

  8. 记一次MySql灾难性事件

    2023年8月8日,本来系一个风和日丽的夏天中的平凡一天,但这种平凡,注定住佢一定唔平凡,唉...现在回忆起都阵阵咁痛!!! 重要嘅事情讲三次,唔好手贱,唔好手贱,唔好手贱 事日,如常上班,本人系一名 ...

  9. SpringBoot项目统一处理返回值和异常

    目录 简介 前期准备 统一封装报文 统一异常处理 自定义异常信息 简介 当使用SpringBoot开发Web项目的API时,为了与前端更好地通信,通常会约定好接口的响应格式.例如,以下是一个JSON格 ...

  10. 关于 Llama 2 的一切资源,我们都帮你整理好了

    Llama 2 是一个由 Meta 开发的大型语言模型,是 LLaMA 1 的继任者.Llama 2 可通过 AWS.Hugging Face 获取,并可以自由用于研究和商业用途.Llama 2 预训 ...