电子商务类网站有哪些,咨询app开发制作公司,库尔勒市建设路街道办网站,网站的技术建设JSX底层渲染机制
一,.步骤
1.把我们写的jsx语法编译为虚拟DOM【virtualDOM】 虚拟DOM对象#xff1a;框架自己内部构建的一套对象体系#xff08;对象的相关成员都是React内部绑定的#xff09;#xff0c;基于这些属性描述出我们所构建视图中的DOM接的相关特征
1基于ba…JSX底层渲染机制
一,.步骤
1.把我们写的jsx语法编译为虚拟DOM【virtualDOM】 虚拟DOM对象框架自己内部构建的一套对象体系对象的相关成员都是React内部绑定的基于这些属性描述出我们所构建视图中的DOM接的相关特征
1基于babel-preset-react-app 把jsx编译为React.createElement(…)的格式。
只要是元素节点必然会基于createElement进行处理 React.createElement(ele,props,…children) ele 元素标签名【或组件】 props 元素的属性集合对象如果没有任何的属性则此值为null children 第三个及其以后得参数都是当前元素的子节点
如下图jsx
root.render{h2 classNametitle style{styleObj}XXXX/h2div classNameboxspanx/spanspany/span/div/
}编译为 再把CreateElement的方法执行创建出VirtualDom对象【也有称为JSX元素、JSX对象、ReactChild对象…】
//虚拟DOM对象
virtualDOM{$$typeOf:Symbol(react.element),ref:null,key:null,type:标签名【或组件】,//存储了元素相关属性子节点信息props:{元素的相关节点children:子节点信息【没有子节点就没有则个属性、属性可能是一个值也可能是一个数组】}
}/*createElement:创建虚拟DOM对象*/
export fucnction createElement(ele,props,...children){let virtualDOM{$$typeOf:Symbol(react.element),key:null,key:null,ref:null,type:null. props:{}};let lenchildren,lengthvirtualDOM.typeele;if(props){virtualDOM.props{...props}}if(len1){virtualDOM.props.childrenchildren[0]}else if(len1){virtualDOM.props.childrenchildren}return virtualDOM
}2.构建的virtualDOM渲染为真实的DOM元素 真实DOM浏览器页面中最后渲染出来让用户看见的DOM元素 基于ReactDOM中的render方法处理 v16
ReactDOM.render(.../domcument.getElementById(root)
)v18
const root React.createRoot(dociment.getElementById(root))
root,render(.../
)补充第一次渲染页面是直接从虚拟DOM — 真实ODM但是后续视图更新的时候会经过一个DOM-DIFF的对比计算出补丁包PATCH两次视图差异部分把PATCH补丁包进行渲染
/*render把虚拟DOM变为真实DOM*/
export function render(virtualDOM,container){let {type,props}virtualDOM;if(typeof typestring){//存储的是标签名动态创建这样一个标签let eledomcument.createElement(type);//为标签设置相关属性节点each(props,(value,key){//classNmae的处理if(keyclassName){ele.classNamevaluereturn}//style的处理value存储的是样式对象if(keystyle){each(value,(val,attr){ele.style[attr]val})return}//子节点的处理value存储的children属性值if(keychildren){let children valueif(children.length1){children[children]}children.forEach(child{//子节点是文本节点直接插入if(typeof childstring){ele.appendChild(domcument.createTextNode(child))return; }//子节点又是一个虚拟ODM:递归处理render(child,ele)})return}ele.setAttribute(key,value);})container.appendChild(ele)}
}