一 jsx 的本质是什么?

jsx是语法糖,需要被编译成js才能运行。

jsx 看似是html 结构,实质是js结构的语法糖,在代码编译阶段被编译成js结构。所以jsx的本质可描述为看似html结构的js结构。

jsx是独立的标准,可被其他项目使用(pReact)

//编译前的jsx
<div>
<ul className='list'>
list.map((item,index)=>{return(<li key={index}>{item}</li>)})
</ul>
</div> //编译后的 jsx代码
React.createElement('div',null,React.createElement('ul',,{className:'list'},
list.map((item,index)=>{return React.createElement('li',{key:index},item)})))

二 jsx 的语法

1.可以在jsx语法中进行注释

2.标签,js表达式,判断,循环,事件绑定

三 jsx 和 vdom的关系

jsx中运用了vdom,由于jsx的实质是js,js要转化为html再渲染到界面上,数据驱动视图的改变 正好是vdom擅长的事情

React.createElement 和 h函数都生成了虚拟dom,区别是 React.createElement可以对自定义的组件进行解析 ,解析的顺序为:初始化实例,然后再调用实例的render函数

React中的虚拟dom 何时渲染到界面上,何时进行虚拟dom的diff比较

初次渲染:ReactDOM.render(,document.getElementById('container')); // patch(vdom,#container);

更新渲染:setState时候,进行虚拟dom的比较并更新视图; // patch(vdom,newVdom);

setState 是异步还是同步?

既可以是异步也可以是同步,在React的合成函数 和 钩子函数中表现为异步,在原生函数或者setTimeout,setInterval的函数中表现为同步。(即在React可监测的函数中为异步,不能监测的函数中表现为同步)。

我认为 setState函数的本质是同步的,只是在合成函数 或 钩子函数中对setState进行了特殊的处理,让其表现为异步更新状态。

为什么要让setState表现为异步呢?

节约性能,用户同时调用多个setState时候,异步调用setState可进行多个setState的合并,防止多次进行视图的渲染浪费性能。

setState 修改完状态之后,会调用renderComponent函数(继承自React.Component)进行patch(vdom,newVdom)更新视图

// 模拟 React.Component 中的 renderComponent
class Component {
constructor(){}
renderComponent(){
const preVnode = this._vnode;
const newVnode = this.render();
patch(preVnode,newVnode);
this._vnode = newVnode;
}
}
// renderComponent 在setState更新状态之后调用来更新视图
this.setState({
list:[1,2,3]
},()=>{this.rednerComponent()})

注:setState的第二个参数可以传递进去一个回调函数,可获取改变之后的state值,并进行相关操作

JSX 详解的更多相关文章

  1. JSX设置CSS样式详解

    JSX设置CSS样式详解 1. 使用className设置样式(CSS的其他选择器也是同理) (1)定义一个CSS文件style.css,和普通CSS一样定义class选择器 .sty1{//和普通C ...

  2. webpack4配置详解之新手上路初探

    前言 经常会有群友问起webpack.react.redux.甚至create-react-app配置等等方面的问题,有些是我也不懂的,慢慢从大家的相互交流中,也学到了不少. ​ 今天就尝试着一起来聊 ...

  3. vue-cli脚手架中webpack配置基础文件详解

    一.前言 原文:https://segmentfault.com/a/1190000014804826 vue-cli是构建vue单页应用的脚手架,输入一串指定的命令行从而自动生成vue.js+wep ...

  4. vue和react全面对比(详解)

    vue和react对比(详解) 放两张图镇压小妖怪 本文先讲共同之处, 再分析区别 大纲在此: 共同点: a.都使用虚拟dom b.提供了响应式和组件化的视图组件 c.注意力集中保持在核心库,而将其他 ...

  5. webpack入门详解

    webpack入门详解(基于webpack 3.5.4  2017-8-22) webpack常用命令: webpack --display-error-details    //执行打包 webpa ...

  6. 4-13 Webpacker-React.js; 用React做一个下拉表格的功能: <详解>

    Rails5.1增加了Webpacker: Webpacker essentially is the decisions made by the Rails team and bundled up i ...

  7. webpack详解

    webpack是现代前端开发中最火的模块打包工具,只需要通过简单的配置,便可以完成模块的加载和打包.那它是怎么做到通过对一些插件的配置,便可以轻松实现对代码的构建呢? webpack的配置 const ...

  8. dva框架使用详解及Demo教程

    dva框架的使用详解及Demo教程 在前段时间,我们也学习讲解过Redux框架的基本使用,但是有很多同学在交流群里给我的反馈信息说,redux框架理解上有难度,看了之后还是一脸懵逼不知道如何下手,很多 ...

  9. babel 用法及其 .babelrc 的配置详解,想做前端架构,拒绝一知半解...

    Babel 官方介绍:将 ECMAScript 2015 及其版本以后的 javascript 代码转为旧版本浏览器或者是环境中向后兼容版本的  javascript 代码. 简而言之,就是把不兼容的 ...

随机推荐

  1. 两表连接各种Join图示,SQL及查询结果

    按:SQL术语Join在中文对应的翻译是“连接”还是“联结”说法不一,下文将统一采用“连接”的译法. 开局一张图: 前奏/准备工作: Emp表结构: create table emp( empid n ...

  2. python urllib.request

    一.简介 urllib.request 模块提供了访问 URL 的相关功能 二.常用函数 urllib.request.urlopen("http://httpbin.org", ...

  3. myeclipse操作hdfs

    myeclipse与hadoop集成我就不说了,还是简单说两句吧! 1.hadoop搭建完毕且可以正常访问(Linux搭建的集群环境 主机是windos) 2.在主机上将hadoop包解压 3.通过m ...

  4. 添加到web.config文件里的用户自定义翻页控件

    <pages> <controls> <add tagPrefix="ucl" tagName="Pager_Backstage" ...

  5. 2020重新出发,JAVA高级,JVM

    JVM的基本概念 JVM是可运行java代码的假想计算机,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收,堆和一个存储方法域.JVM是运行在操作系统之上的,它与硬件没有直接的交互. [外链图片 ...

  6. linux账户的锁定和解锁、禁用账号

    l——lock锁定 S——STATUS查看 u——unlock解锁 1.通过passwd命令锁定和解锁: [root@localhost ~]# passwd -S abc ——passwd -S  ...

  7. Dockerfile构建镜像实战

    目录 一.常见Dockerfile指令 二.编写Centos Dockerfile 2.1.编写Dockerfile 2.2.构建 2.3.查看Docker镜像 2.4.运行镜像 三.CMD和ENTR ...

  8. Flutter 使用image_gallery_saver保存图片

    Flutter  使用image_gallery_saver保存图片 其实我们开发项目app的时候, 你会发现有很多问题, 比如保存图片功能时 ,不仅导入包依赖包: image_gallery_sav ...

  9. DRF序列化、认证、跨域问题

    初级 #models.py from django.db import models class User(models.Model): user = models.CharField(max_len ...

  10. 常见消息中间件之RocketMQ

    前言 RocketMQ是一款分布式.队列模型的消息中间件,由阿里巴巴自主研发的一款适用于高并发.高可靠性.海量数据场景的消息中间件.早期开源2.X版本名为MetaQ:2015年迭代3.X版本,更名为R ...