JSX 详解
一 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 详解的更多相关文章
- JSX设置CSS样式详解
JSX设置CSS样式详解 1. 使用className设置样式(CSS的其他选择器也是同理) (1)定义一个CSS文件style.css,和普通CSS一样定义class选择器 .sty1{//和普通C ...
- webpack4配置详解之新手上路初探
前言 经常会有群友问起webpack.react.redux.甚至create-react-app配置等等方面的问题,有些是我也不懂的,慢慢从大家的相互交流中,也学到了不少. 今天就尝试着一起来聊 ...
- vue-cli脚手架中webpack配置基础文件详解
一.前言 原文:https://segmentfault.com/a/1190000014804826 vue-cli是构建vue单页应用的脚手架,输入一串指定的命令行从而自动生成vue.js+wep ...
- vue和react全面对比(详解)
vue和react对比(详解) 放两张图镇压小妖怪 本文先讲共同之处, 再分析区别 大纲在此: 共同点: a.都使用虚拟dom b.提供了响应式和组件化的视图组件 c.注意力集中保持在核心库,而将其他 ...
- webpack入门详解
webpack入门详解(基于webpack 3.5.4 2017-8-22) webpack常用命令: webpack --display-error-details //执行打包 webpa ...
- 4-13 Webpacker-React.js; 用React做一个下拉表格的功能: <详解>
Rails5.1增加了Webpacker: Webpacker essentially is the decisions made by the Rails team and bundled up i ...
- webpack详解
webpack是现代前端开发中最火的模块打包工具,只需要通过简单的配置,便可以完成模块的加载和打包.那它是怎么做到通过对一些插件的配置,便可以轻松实现对代码的构建呢? webpack的配置 const ...
- dva框架使用详解及Demo教程
dva框架的使用详解及Demo教程 在前段时间,我们也学习讲解过Redux框架的基本使用,但是有很多同学在交流群里给我的反馈信息说,redux框架理解上有难度,看了之后还是一脸懵逼不知道如何下手,很多 ...
- babel 用法及其 .babelrc 的配置详解,想做前端架构,拒绝一知半解...
Babel 官方介绍:将 ECMAScript 2015 及其版本以后的 javascript 代码转为旧版本浏览器或者是环境中向后兼容版本的 javascript 代码. 简而言之,就是把不兼容的 ...
随机推荐
- [java]将多个文件压缩成一个zip文件
此文进阶请见:https://www.cnblogs.com/xiandedanteng/p/12155957.html 方法: package zip; import java.io.Buffere ...
- IMX6ULL开发板Linux_WIFI驱动实验
1.在迅为i.MX6ULL开发板上使用的是 usb 接口的 RTL8723 wifi 模块,原理图如下所示:可以看到 RTL8723 模块的接口非常简单,只有 DP1 和 DM1 连接到 usb HU ...
- linux下部署python项目到jenkins
环境:linux+jenkins+tomcat+git+python3.7 1.安装jdk 上传安装包到usr/local 解压 配置环境变量 vim /etc/profile export JAVA ...
- python基础:多进程、多线程
一.定义和区别 1.一个任务就是一个进程,进程就是资源的集合.比如打开浏览器,启动一个进程.当一个进程需要干很多事的时候,就需要执行多个子任务,这些子任务就是线程. 2.线程是包含在进程中的,每个进程 ...
- Azure技术系列之Redis篇---第一章数据缓存
嘈杂和忙碌的生活占据占据了生活的每一天,好久没有静下心来对自己喜欢的技术进行归纳总结了.痛定思痛,今天开始开荒,把之前研究的技术进行归纳总结,先从Azure的Redis的开发技术开始. Azure 的 ...
- wireshark在ubuntu系统中的正确安装方法
以前一直在使用wireshark这个网络工具,最近在用来抓包学习MQTT协议的时候,发现wireshark暂时还未加入对MQTT协议分析的原生支持,网上搜了一下,可以自己用插件的形式扩展wiresha ...
- 使用phoenix连接hbase
hbase本身不支持SQL查询,为了实现这个功能,引入了phoenix,通过它可以实现hbase的sql查询.这里记录下如何配置并使用phoenix来操作hbase. 1. 下载地址 phoenix下 ...
- openstack共享组件——Memcache 缓存系统(4)
云计算openstack共享组件——Memcache 缓存系统(4) 一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Netw ...
- Mac新手必看教程——轻松玩转Mac OS
背景: 大部分用户接触的第一个操作系统大多是windows,本人记得曾经小学的微机课也是以win98为基础学习了一众office软件.随着工作的多样化,单一的windows系统已经无法满足部分需求,而 ...
- Java基础一篇过(一)反射
一.反射是个啥 定义 : 在运行状态中动态获取的类的信息以及动态调用对象的方法,这种功能称为java语言的反射机制. 对于任意一个类,都能够知道这个类的所有属性和方法. 对于任意一个对象,都能够调用它 ...