2020/02/13 01-虚拟DOM和JSX
react是13年facebook开源的东西,后台的分离有一个叫MVC,前台代码就是浏览器要跑的,比如JS代码,做了一个前端的MVC框架
facebook自己来写了js框架,用来架设instagram,然后开源出来了。
然后阿里蚂蚁金服提供了很多前端控件,react是解决的前端mvc框架是view视图层的问题
创新的提出了虚拟的DOM,DOM(文档对象模型document object model)浏览器最核心的,就是渲染引擎和js引擎,外壳不重要
渲染引擎除了要解决整个html要对应成相应的一些格式或者布局,要解决这个问题以外,还必须提供一种操作接口,为了显示网页,要想办法把网页结构解开,变成一种真正的结构,就得到一种树形结构
左边是一个很简单的html,p标签是做段落分段的,如何来解析,不解析无法做渲染,渲染引擎首先想办法解开了,这是一种树形结构
解析成以document为跟,html为相当于是整个网页的根节点,text文本结点是一个回车换行符\r\n,html和body之间实际上是有换行符的,这些空白字符其实就是文本节点。
再往下碰到的第一个结点就是body,往下到/body结束,body标签,有开始有结束标识一个范围,这里面有一些text文本标签空白字符,剩下的比如h1标签,p标签,内部还有文本
也就是说h1的兄弟可能是文本节点
这就形成了一个树形结构,标准的html可以解析成属性结构
document其实是操作的起始
这两个后面都有空白字符,因为html内部包了一个换行符
h1外面也有换行符
这样在内存中会形成一个树形结构,就可以来操作,给的操作接口其实就是DOM的操作接口,如何操作就用JS,提供一个document对象,找到这些节点进行操作
可以在树立面进行增加删除或者修改
浏览器必须对DOM进行支持,用户可以用js调用DOM接口来修改DOM树节点,从而修改整个网页
比如创建用户,输入的时候,还没提交网页,已经提示用户已经注册,其实就是js调用,写的内容用事件触发,到后台询问这个用户名是否存在,这个用户已经存在就会动态添加到网页节点里,如果ok,网页就会立马渲染,做部分调整,然后显示出来,只要是dom中出现了某个结点,某个结点下面发生了变化,这个节点所对应的部分就需要做渲染,要重绘
dom树重绘的代价太高,每个节点变了以后就要重新渲染一次,这个实际上是影响了前端的感受,facebook团队考虑到了这一点,所以在操作的时候并没有直接操作dom,用react的时候实际上并不直接操作dom,而是在内存中构建出了一个数据对象,这个对象叫virtual dom,虚拟dom来替代原有的dom,所有的操作都在虚拟的dom上操作,操作完,会把虚拟dom的变化放到dom上去,哪里差异就哪里渲染,减少了不避免的渲染。
在虚拟dom上,如果操作了很多次,发现操作还是回到了原始,虚拟dom发现两次比较一样,就没必要渲染了,发现一样,就不会通知dom了,现在的前端框架很多都采取了虚拟dom的方式,可以提高用户整体的感受
jsx是一种js和xml混写的方式,不需要再调用原始的create element创造这些节点,只需要把html标记按照一定的格式写进去就行,大大提高写的效率
这是要渲染的东西,是一个节点
通过document对象,在整个dom树中找元素,通过元素的ID去找,(元素ID是example)
dom树里面的东西一般称为节点,也称为element元素,也称为节点node
找到example元素后,找到dom树下把这些节点加进去
这个是通过webpack打包起来的,打包后从服务器端下载到浏览器端
而浏览器端右键显示源代码只会看到这个,也就是爬虫只会爬这些内容,需要其他方式来爬
要看bundle.js就要看入口文件指向的是src里的index
不加大括号说明是缺省导入
缺省导入的名字可以随意改
继承react父类,父类显示空空荡荡,你要显示就是很大差异的,就需要一个渲染函数,这种写法可以理解为是js和xml混合的写法
这就是JSX
借助react-dom来操作dom树无非是在dom树里进行渲染
这个网页有id叫newroot,既然叫id,那么在网页中就是唯一的,每个标签之上都可以定义id
可以把渲染的东西直接放下来,
放下来之后就可以注释掉,这里只不过用JSX语法
右键bash
启动一下
实际上写这个东西不是当做html理解的,当成jsx组件来理解,这个组件实际上继承react组件类的,这个类型必须在渲染函数中return一个对象出来,就可以交给这里进行渲染
渲染到哪里去,就需要网页中给它留个地方,如何找到,就可以使用getElementById
id在本网页内应该保证唯一的,不唯一只找第一个
记得封口
这样就可以了
这个地方要求一个元素,要求是JSX组件
就相当于把这个组件放进去,这个组件支持像html的写法<ROOT/ >
只要保存就会不端编译,因为HMR热模块替换,自动刷新
可以用create系列的方法来创建一个dom
用这种方法创建
如果嵌套很多,用这种方式创建非常麻烦,所以这种方法基本被人遗忘了,现在都用JSX
组件必须从react.component继承
行数多建议括起来
查看元素,newroot是插入点
div插入到newroot里去,下面subelemt,两边的嵌套关系是一致的,这种方式更加直观
必须封口,即使是单标签也需要封口,否则报错
可以直接斜杠,单标签就这么写
不加内容要封口就这么封
JSX语法要求关闭
有些错误会在这里提示,不会生成新的bundle.js,浏览器就不会刷新
这种网页就称为SPA,single,page,application,单页应用,普通爬虫爬没用
这地方看的是DOM树。这是实时的DOM,虚拟dom是react框架的事,在浏览器内存空间开辟构建了虚拟dom
框架操作虚拟dom来和dom比较,哪些是需要渲染的数据
JSX是一种规范,不按照这个来就会报错
凡是首字母小写都是标记,大写是组件
但凡return的跟不是一个,就会报错,而且是写在render函数中
看起来这里是html,实际上是xml,xml要求所有标签闭合,包括自己定义的组件标签,全部闭合,不闭合都不行
单行省略小括号,多行使用小括号
元素有嵌套,建议多行,注意缩进
JSX是可以写表达式的,要求在整个区域内使用大括号,里面可以写表达式,类似之前的插值${i*j}跟外面的无关
hr就是一条水平线,写一个三元表达式
一旦保存,就出来效果了
也可以这么写
没有是因为显示的不是字符串
加个引号变成字符串
不放在大括号里就直接是字符串
这样就是返回的字符串
现在操作src和index是没有任何关系,只要告诉id号即可
ajax前后端分离,可以让项目进一步分化,可以向微服务方式部署