首页 > 其他分享 >React - 03 JSX语法示例及JSX渲染机制

React - 03 JSX语法示例及JSX渲染机制

时间:2023-06-09 23:32:01浏览次数:73  
标签:03 DOM 元素 示例 ... 渲染 createElement JSX

1.根据变量控制元素显示/隐藏

2种方式,方式1会渲染但不显示,方式2不会渲染元素

React - 03 JSX语法示例及JSX渲染机制_react

2.循环列表渲染

用数组的map方法,直接将要循环的元素返回

React - 03 JSX语法示例及JSX渲染机制_react_02

React - 03 JSX语法示例及JSX渲染机制_react_03

如果数组的每个元素都是empty,则为稀疏数组,否则为密集数组,即使每个元素都是null也是密集数组

React - 03 JSX语法示例及JSX渲染机制_react_04

3.JSX渲染机制

第一步:把我们编写的JSX语法,编译为虚拟DOM对象「virtualDOM」

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

@1 基于 babel-preset-react-app 把JSX编译为 React.createElement(...) 这种格式!!

只要是元素节点,必然会基于createElement进行处理!

React.createElement(ele,props,...children)

+ ele:元素标签名「或组件」

+ props:元素的属性集合(对象)「如果没有设置过任何的属性,则此值是null」

  • children:第三个及以后的参数,都是当前元素的子节点


React - 03 JSX语法示例及JSX渲染机制_react_05

React - 03 JSX语法示例及JSX渲染机制_react_06

@2 再把 createElement 方法执行,创建出virtualDOM虚拟DOM对象「也有称之为:JSX元素、JSX对象、ReactChild对象...」!!

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

React - 03 JSX语法示例及JSX渲染机制_react_07

模拟createElement方法

React - 03 JSX语法示例及JSX渲染机制_react_08

React - 03 JSX语法示例及JSX渲染机制_react_09

第二步:把构建的virtualDOM渲染为真实DOM

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

基于ReactDOM中的render方法处理的!!

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

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

封装each方法(for in)

(Object.getOwnPropertyNames,Object.getOwnProertySymbols)

React - 03 JSX语法示例及JSX渲染机制_react_10

模拟render函数

React - 03 JSX语法示例及JSX渲染机制_react_11

React - 03 JSX语法示例及JSX渲染机制_react_12

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

标签:03,DOM,元素,示例,...,渲染,createElement,JSX
From: https://blog.51cto.com/u_12207234/6452229

相关文章

  • 代码随想录算法训练营第三天| 203.移除链表元素 、 707.设计链表 、206.反转链表
    链表的构造:link.h:1#ifndefLINK_H2#defineLINK_H3#include<vector>45structListNode{6intval;7ListNode*next;8ListNode():val(0),next(nullptr){}9ListNode(intx):val(x),next(nullptr){}10ListNode(in......
  • 代码随想录day03
     第二章 链表part01链表理论基础,203.移除链表元素,707.设计链表,206.反转链表 203.移除链表元素虚拟头结点/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(int......
  • loj6039. 「雅礼集训 2017 Day5」珠宝
    题目大意有\(n\)个物品,第\(i\)个费用为\(w_i\),价值为\(v_i\),对于\(k\in[1,m]\)求费用为\(m\)时能获得的最大价值。\(1\leqn\leq10^6,1\leqm\leq5\times10^4,1\leqw_i\leq300,1\leqv_i\leq10^9\)思路\(n\)很大,但\(w_i\)很小,于是我们考虑以其为突破口......
  • 003Arch安装docker
    链接:ArchLinux安装Docker并简单配置_archlinuxdocker_陌年微凉II的博客-CSDN博客安装dockerpacman-Sdocker开启docker服务#开启Docker服务systemctlstartdocker#允许Docker服务开机自启动systemctlenabledocker#验证Docker服务运行状态systemctlsta......
  • 记一次ms15_034漏洞
    Fofa搜索后台登录的时候发现的一个网站,放进AWVS里扫一下但没搞懂漏洞具体怎么利用,一顿搜索后得知是ms15_034漏洞,并且在msf里有利用模块 so,msf启动! 搜索到两个模块,第一个是dos攻击的,百度了一下好像是能够直接让有此漏洞的机器蓝屏死机....dos攻击事儿咱可不干第二个模块......
  • 拥抱jsx,开启vue3用法的另一种选择
    ......
  • WebRTC回声消除示例(Android版)
    AndroidApp下载地址:https://gitcode.net/techinged/share/-/raw/master/android/echo_cancel/webrtc_echo_cancel(Android).zip或者https://kdocs.cn/l/ctpgZy0zRHbM1、将AndroidApp文件echo_cancel.apk安装到你的Android手机,Android版本要求在Android4.0(API14)或以上。安......
  • JGTM'2004 [MVP] 对MarshalByRefObject的讲解 (zz.is2120)
    //z2012-09-1109:30:29IS2120@csdn.T2872699816[T30,L404,R7,V203] AnyonecanexplainthemajoruseofMarshalByRefObjectWhat'sthepurposeforMarshalByRefObject?1.Remoting;itmeansthatbetweenAppDomainsormachines,ratherthanserializea......
  • 「杂题乱写」AGC 003
    「杂题乱写」AGC003点击查看目录目录「杂题乱写」AGC003A|WannagobackhomeB|SimplifiedmahjongC|BBuBBBlesort!D|AnticubeE|SequentialoperationsonSequenceF|FractionofFractal今日推歌是星尘唱的《光》,是尘2021年的官方生贺曲。马上又要到8.1......
  • PAT A1030 Travel Plan
    PATA1030TravelPlan dijkstra 优先队列实现 + dfs #include<iostream>#include<queue>#include<vector>#include<cstdio>#include<cstring>usingnamespacestd;constintMAXN=10000;constintINF=0x3f3f3f3f;structnode{ in......