码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • jsx代码如何变成dom


    jsx代码如何变成dom

    • 一、三个问题考察对jsx的理解
    • 二、jsx的本质以及它和js之间是什么关系?
      • 2.1 jsx是什么
      • 2.2 和js的关系
      • 2.3 jsx的本质
    • 三、为什么要用jsx?不用会有什么后果
    • 四、jsx背后的功能模块是什么?这个功能模块都做了哪些事情?
      • 4.1 createElement
        • 1.入参分析
        • 2.函数体拆解
      • 4.2 ReactElement
      • 4.3 虚拟dom和reactDom.render
      • 4.4 总结

    一、三个问题考察对jsx的理解

    1. jsx的本质是什么,它和js之间是什么关系?
    2. 为什么要用jsx?不用会有什么后果
    3. jsx背后的功能模块是什么?这个功能模块都做了哪些事情?

    二、jsx的本质以及它和js之间是什么关系?

    2.1 jsx是什么

    jsx是JavaScript的一种语法拓展,它和模板语言很接近,但是它充分具备JavaScript的能力。

    2.2 和js的关系

    因为jsx是JavaScript的拓展,所以直接决定了浏览器不会像天然支持JavaScript一样支持jsx。
    但是既然jsx充分具备JavaScript的能力,那么jsx是如何在js中生效的呢?
    其实在react官网中就给出了答案,jsx会被编译为React.createElement(),它将返回一个“React Element”的js对象。

    编译这个动作是由Babel来完成的。Babel是一个工具链,主要用于将es2015+版本的代码转换为向后兼容的js语法,以便能够运行在当前和旧版本的浏览器或其他环境。

    在babel官网中,可以看到编译前后的代码
    [图片]

    2.3 jsx的本质

    当我们在写jsx时,实际上编译后就是React.createElement。
    jsx的本质就是调用js中的React.createElement语法糖。

    三、为什么要用jsx?不用会有什么后果

    既然jsx等价于一次React.createElement调用,那么React官方为什么不直接引导我们用ReactElement来创建元素?

    因为当jsx内容更多时,编译之后的代码会变得很复杂,嵌套不清晰。

    所以jsx语法糖允许我们使用最为熟悉的类HTML标签语法来创建虚拟DOM,降低学习成本的同时,也提升了研发效率和体验。

    四、jsx背后的功能模块是什么?这个功能模块都做了哪些事情?

    4.1 createElement

    1.入参分析

    export function createElement(type,config,children)
    
    • 1

    type:标识节点类型
    config:以对象形式传入,组件所有的属性都会以键值对的形式存储在config中
    children:以对象形式传入,它记录的是组件标签之间嵌套的内容

    2.函数体拆解

    [图片]

    [图片]

    createElement的步骤其实是在格式化数据。将开发传入的数据根据ReactElement的预期做一层格式化,最终调用ReactElement实现元素的创建。

    4.2 ReactElement

    主要做的事情就是组装。ReactElement把传入的参数按照一定的规范,组装进Element对象里,然后返回给React.createElement,最后React.createElement交回给开发者手中。
    [图片]

    可以通过打印验证这一点。输出的确实是标准的ReactElement实例。本质是以js对象形式存在的对dom的描述,也就是虚拟dom。
    [图片]

    [图片]

    4.3 虚拟dom和reactDom.render

    既然是虚拟dom,那和渲染到页面上的真实dom一定是有差距的,它们之间的差距就是由reactDom.render方法来填补的。
    reactDOM.render经常出现在项目的入口文件中。

    reactDOM.render的入参分析[图片]

    4.4 总结

    jsx背后的功能模块的内容以及做了的事情:
    1.通过babel将jsx代码编译为React.createElement的调用。

    2.React.createElement将传入的参数包括type,config,children格式化为ReactElement预期的格式。

    3.调用ReactElement后组装成ReactElement对象,返回给React.createElement,最终生成虚拟dom。

    4.虚拟dom作为ReactDOM.render的入参,经过渲染处理生成真实DOM。
    [图片]

  • 相关阅读:
    【UVM基础】uvm_do 做了哪些事情?
    Python入门到放弃
    Lua脚本如何调用C/C++模块,Windows以及Linux版本演示
    指针笔试题详解
    渗透测试高级技巧(一):分析验签与前端加密
    双端 Diff 算法原理解析及 snabbdom 简单实现
    容器编排工具鉴赏- docker-compose 、Kubernetes、OpenShift、Docker Swarm
    [ vulhub漏洞复现篇 ] Struts2 远程命令执行漏洞(CVE-2020-17530)(S2-061)
    6.strchr函数和strrchr函数
    GO语言网络编程(并发编程)select
  • 原文地址:https://blog.csdn.net/qq_36337754/article/details/127910944
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号