jsx底层渲染机制,函数组件的底层渲染机制

news2024/11/27 22:42:00

jsx底层渲染机制!!

1.第一大步创建virtualDom

首先把我们编写的JSX语法,编译为虚拟DOM对象「virtualDOM」,这一步也分为两小步

虚拟DON对象∶框架自己内部构建的一套对象体系(对象的相关成员都是React内部规定的),基于这些属性描述出,我们所构建视图中的,DOM节点的相关特征!!

第一小步基于babel-preset-react-app 把JSX编译为React.createElement(…)这种格式!!

只要是元素节点,必然会基于createElement进行处理!
React.createElement(ele,props , . …children)
ele:元素标签名「或组件」
props:元素的属性集合(对象)「如果没有设置过任何的属性,则此值是null
children:第三个及以后的参数,都是当前元素的子节点

第二小步再把createElement方法执行,创建出virtua1DCN虚拟DOM对象「也有称之为:JSX元素、JSX对象、ReactChild对象…」!

virtualDOM= {
    $ $typeof : Symbol( react.element),
    ref: null,
    key: null,
    type:标签名「或组件」,
    //存储了元素的相关属性&&子节点信息
    props: {
    元素的相关属性,
    children:子节点信息「没有子节点则没有这个属性、属性值可能是一个值、也可能是一个数组」
   }
}

因为胡子语法({})无法直接创建对象,下面这样做是错误的:
在这里插入图片描述

所以我们可以通过React.createElement()来创建元素

在这里插入图片描述

总结:胡子语法中,不能之前嵌入除数组外的其他对象,但是有一个对象是可以直接嵌入的:JSX元素对象「虚拟DOM对象」

问题:胡子语法中不能直接渲染对象对不对??
不对,1.数组对象可以渲染,2.style的行内样式属性可以渲染,3.可以直接通过createElement来渲染!!


第二大步:渲染真实dom

真实DOM:浏览器页面中,最后渲染出来,让用户看见的DOM元素! !

v16

ReactDOM. render(
<>...</>,
document.getELementById( 'root')
);

v18

const root = ReactDOM.createRoot(document.getElementById('root')); 
root.render(
<>...</>
);

render方法实现!!!

首先封装一个对象迭代的方法,基于传统的for/in循环,会存在一些弊端 1.性能较差(既可以迭代私有的,也可以迭代公有的;2.只能迭代“可枚举、非Symbol类型的“属
性…

解决思路,获取对象的所有私有属性(无论是否枚举,无论是否可以枚举)

let keys = Object.getOwnPropertyNames(arr).concat(Object.getOwnPropertySymbols(arr));
console. log(keys);

或者使用es6的:
Reflect.ownKeys(arr);

封装的方法:each
在这里插入图片描述

说说往标签上加值:
在这里插入图片描述

export function render(virtualDOM, container) {
  let { type, props } = virtualDOM;
  if (typeof type === "string") {
    //存储的是标签名:动态创建这样一个标签
    let ele = document.createElement(type);
    //为标签设置相关的属性&子节点
    each(props, (value, key) => {
      // className的处理: value存储的是样式类名
      if(key === 'className') {
        ele.className = value;
        return;
      }
      // style的处理: va lue存储的是样式对象
      if (key === 'style') {
        each(value, (val, attr) => {
          ele.style[attr] = val;
        });
        return;
      }
      if (key === 'children') {
        let children =value;
        if(children.length===1) children =[children];
        children.forEach(child => {
          //子节点是文本节点:直接插入即可
          if(typeof child === "string") {
            ele.appendChild(document.createTextNode(child));
            return;
          }
          //子节点又是一个virtuaLDOM: 递归处理
          render(child, ele);
        });
        return;
      }
      ele.setAttribute(key, value);
    });
    container.appendChild(ele);
  }
};

//子节点的处理: value存储的children属性值

这段代码的作用是将一个虚拟 DOM 渲染到真实的 DOM 中。它首先会根据虚拟 DOM 中的 type 属性创建一个对应的 HTML 元素,然后根据虚拟 DOM 中的 props 属性设置元素的属性和子元素,最后将该元素插入到指定的 container 容器中。该代码也只考虑了样式类名和样式对象,而没有考虑其他可能出现的属性,例如 ID 属性、事件属性等。

补充说明:第1次渲染页面是直接从virtua LDOM- ->真实DOM;但是后期视图更新的时候,需要经过1个DOM-DIFF的对比,计算出补丁包PATCH(两次视图差异的部分),把PATCH补丁包进行渲染! !


函数组件的底层渲染机制!!

一.函数组件
1.创建:在SRC目录中,创建一个 xxx.jsx 的文件,就是要创建一个组件;我们在此文件中,创建一个函数,让函数返回JSX视图「或者JSX元素、virtualDOM虚拟DOM对象」;这就是创建了一个“函数组件”!!

2.调用:基于ES6Module规范,导入创建的组件「可以忽略.jsx后缀名」,然后像写标签一样调用这个组件即可!!
<Component/> 单闭合调用
<Component> ... </Component> 双闭合调用

命名:组件的名字,我们一般都采用PascalCase「大驼峰命名法」这种方式命名


二.调用组件的时候,我们可以给调用的组件设置(传递)各种各样的属性

<DemoOne title="我是标题" x={10} data={[100, 200]} className="box" style={{ fontSize: '20px' }} />
 1.如果设置的属性值不是字符串格式,需要基于“{}胡子语法”进行嵌套
 2.调用组件的时候,我们可以把一些数据/信息基于属性props的方式,传递给组件!!

这里是组件里面的代码:
在这里插入图片描述

这里是我们入口文件的代码:

在这里插入图片描述
那么这里的span是什么????

在这里插入图片描述
在第一张图的那个props里有一个children属性能够接收到这些东西!!!!!

单闭合调用和多闭合调用区别?
多闭合调用可以传入其他标签!!!!!!!!!单闭合不可以

渲染的机制:

渲染机制

1 基于babel-preset-react-app把调用的组件转换为createElement格式

React.createElement(DemoOne, {
            title: "\u6211\u662F\u6807\u9898",
            x: 10,
            data: [100, 200],
            className: "box",
            style: {
                fontSize: '20px'
            }
        })

2 把createElement方法执行,创建出一个virtualDOM对象!!

{
            $$typeof: Symbol(react.element),
            key: null,
            props: {title: '我是标题', x: 10, data: 数组, className: 'box', style:{fontSize:'20px'}},//如果有子节点「双闭合调用」,则也包含children!!
            ref: null,
            type: DemoOne
}

3 基于root.render把virtualDOM变为真实的DOM,type值不再是一个字符串,而是一个函数了,此时:

    1.把函数执行 -> DemoOne()
    2.把virtualDOM中的props,作为实参传递给函数 -> DemoOne(props)
    3.接收函数执行的返回结果「也就是当前组件的virtualDOM对象」
    4.最后基于render把组件返回的虚拟DOM变为真实DOM,插入到#root容器中!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解深度学习——注意力机制(Attention Mechanism):多头注意力(Multihead Attention)

分类目录&#xff1a;《深入理解深度学习》总目录 在实践中&#xff0c;当给定相同的查询、键和值的集合时&#xff0c;我们希望模型可以基于相同的注意力机制学习到不同的行为&#xff0c; 然后将不同的行为作为知识组合起来&#xff0c; 捕获序列内各种范围的依赖关系 &#…

论文解读:GBPNet:蛋白质结构的通用几何表示学习

GBPNet: Universal Geometric Representation Learning on Protein Structures DOI:https://doi.org/10.1145/3534678.3539441 Github:GBPNet/gbpnet/datamodules at main sarpaykent/GBPNet GitHub 摘要&#xff1a; 蛋白质3D结构的表示学习对于例如计算蛋白质设计或蛋白…

单链表OJ题:LeetCode--160.相交链表

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中第160道单链表OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人…

Lecture 19 Question Answering

目录 introductionIR-based QA (dominant approach)Knowledge-based QAHybrid QAConclusion introduction Definition: question answering (“QA”) is the task of automatically determining the answer for a natural language questionMostly focus on “factoid” quest…

牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万

原文地址&#xff1a;牛客网论坛最具争议的Linux内核成神笔记&#xff0c;GitHub已下载量已过百万 1、前言 Linux内核是一个操作系统&#xff08;OS&#xff09;内核&#xff0c;本质上定义为类Unix。它用于不同的操作系统&#xff0c;主要是以不同的Linux发行版的形式。Linu…

网红如何创建百度百科词条?

随着互联网的发展&#xff0c;越来越多的人开始从事网红行业。对于网红来说&#xff0c;提升自己的个人形象至关重要&#xff0c;一个提升品牌形象的快速方式就是创建百度百科词条。网红如何创建百度百科词条&#xff1f;如何创建一个高质量的百度百科词条&#xff1f;下面伯乐…

万维网服务器

一、域名解析gethostbyname函数 struct hostent {char *h_name; /* 官方域名 */char **h_aliases; /* 别名*/int h_addrtype; /* 地址族&#xff08;地址类型&#xff09; */int h_length; /* 地址长度 */char **h_addr_list; …

Qt扫盲-Qt事件系统概述

Qt事件系统概述 一、概述二、事件类型 - Event Types三、事件处理程序 - Event Handlers四、事件过滤器 - Event Filters五、发送事件 - Sending Events1. sendEvent()2. postEvent() 一、概述 在Qt中&#xff0c;事件是由抽象的QEvent类派生而来的对象&#xff0c;表示发生在…

凌恩全新育种分析流程!助力种质资源高分文章发表!

种质资源又称遗传资源。种质是指生物体亲代传递给子代的遗传物质&#xff0c;它往往存在于特定品种之中。如古老的地方品种、新培育的推广品种、重要的遗传材料&#xff0c;野生近缘植物以及利用上述繁殖材料创造的各种遗传材料&#xff0c;都属于种质资源的范围&#xff0c;是…

为什么要使用微软的 Application Framework?

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来看一下我们为什么要使用微软的 Application Framework&#xff1f; 虽然Application Framework 并不是新观念&#xff0c;它们却在最近数年才成为 PC 平台上软件开发的主流工具。面向对象语言是具体实…

【Spring Boot 初识丨三】starter

Soring Boot 初识 【Spring Boot 初识丨一】入门实战 【Spring Boot 初识丨二】maven 本篇来讲一讲 starter 依赖项 Starter 一、定义二、启动器2.1 应用启动器2.2 生产启动器2.3 技术启动器 一、定义 启动器是一组方便的依赖关系描述符&#xff0c;它包含了一系列可以集成到应…

并行事务会引发的三个问题

并行事务是指同时运行多个事务&#xff0c;每个事务独立地执行&#xff0c;并且不会相互影响。在数据库管理系统中&#xff0c;当多个用户同时对同一个数据集进行读取或者写入的时候&#xff0c;使用并行事务可以提高系统的吞吐量和响应时间。同时&#xff0c;由于并行事务可以…

c++学习之继承

目录 一&#xff0c;为什么需要继承 二&#xff0c;继承的基本概念 三&#xff0c;派生类的定义 四&#xff0c;继承中的析构预构造 1&#xff0c;子类中的构造与析构的顺序 2&#xff0c;子类调用成员对象&#xff0c;父类的有参构造 五&#xff0c;子类与父类的同名处理…

防雪崩利器之Hystrix

Hystrix作为一个容错组件&#xff0c;本文从它的作用、熔断设计、工作流程和应用方面一一道来&#xff0c;帮助大家了解如何使用。 1、什么是灾难性雪崩效应 要讲Hystrix&#xff0c;我们就要讲一种场景&#xff0c;在微服务架构中&#xff0c;如果底层服务出现故障&#xff0…

Ubuntu搭建APM固件编译环境

文章目录 前言一、下载源码二、配置编译环境三、编译固件 前言 Ubuntu20.04 APM 4.2.3 参考链接&#xff1a; https://ardupilot.org/dev/docs/building-setup-linux.html 一、下载源码 git clone https://github.com/ArduPilot/ardupilot.git下载完之后 cd ardupilotgit s…

Lecture 18 Information Extraction

目录 Named Entity RecognitionRelation ExtractionOther IE TasksConclusion information extraction Given this: “Brasilia, the Brazilian capital, was founded in 1960.”Obtain this: capital(Brazil, Brasilia)founded(Brasilia, 1960) Main goal: turn text into str…

Linux基本指令详细介绍 【Linux】

文章目录 ls 指令( list directory contents)ls -als -alls -dlls -l (ll)ls -alF文件的类型 &#xff1a; pwd命令(Print Working Directory)cd 命令 &#xff08;change directory&#xff09;cd ..cd ~cd - touch指令mkdir指令mkdir -p ( parents) treermdir指令&#xff08…

【数据结构】哈希应用

目录 一、位图 1、位图概念 2、位图实现 2.1、位图结构 2.2、比特位置1 2.3、比特位置0 2.4、检测位图中比特位 3、位图例题 3.1、找到只出现一次的整数 3.2、找到两个文件交集 3.3、找到出现次数不超过2次的所有整数 二、布隆过滤器 1、布隆过滤器提出 2、布隆过…

javaScript蓝桥杯----商城管理系统

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 在商城管理系统中&#xff0c;超级管理员和普通管理员因为权限不同&#xff0c;登录进入后看到的菜单也会是不同的。 本题需要你完成商城管理系统中权限数据的处理。 二、准备 开始答题前&#xff0c;需要先打开本…

2023年,千万不要裸辞....

作为IT行业的大热岗位——软件测试&#xff0c;只要你付出了&#xff0c;就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的&#xff0c;但放眼望去&#xff0c;哪个工作不是这样的呢&#xff1f;会有哪家公司愿意养一些闲人呢&#xff1f;…