当前位置: 首页 > news >正文

网站建设 呢咕云永久域名申请

网站建设 呢咕云,永久域名申请,设计师网站模版,营销类wordpress主题摘要 经过之前的几篇文章#xff0c;我们已经实现了一个可以进行更新渲染的假React。但是如果我们把我们的jsx修改成这样#xff1a; function App() {const [age, setAge] useState(20)const click function() {setAge(age 1)}return age % 2 0 ? jsx(div我们已经实现了一个可以进行更新渲染的假React。但是如果我们把我们的jsx修改成这样 function App() {const [age, setAge] useState(20)const click function() {setAge(age 1)}return age % 2 0 ? jsx(div, {key: div1,children: jsx(span, {key: span,children: div1,onClick: click})}) : jsx(div, {key: div1,children: jsx(span, {key: span,children: div2,onClick: click})}) }ReactDOM.createRoot(root).render(App /)虽然页面的效果是正确的。但对于两个jsx二者的区别仅仅是span标签里面的内容不同。 但是在程序里面我们是相当于每次都重新beginWork重新的创建Filber树重新的创建真实DOM。 而对于这里div和span标签它没有任何的改变我们是否可以用一种优化策略从而对旧资源进行利用呢 所以Diff由此而来。 这一篇先只说单节点的Diff因为目前还没实现带有sibling的情况。 1.修改beginWork 我们回顾一下在beginWork里面干了什么。在将jsx转换为ReactElement后我们会通过beginWork来构建一颗Filber树。 那如果对于可复用的FilberNode我们是否可以不去创建直接复用呢 可以的那对于React来说什么节点是可复用的呢 如果旧的FilberNode和新的ReactElement key相同type相同。 那么就是可以复用的。 所以在beginWork中的reconcileChildren方法里如果我们发现上面的情况我们就不会创建新的FilberNode。 function reconcileChildren(parent,element) {const newChild diffReconcileChildren(parent, element);if(newChild) {return newChild}//其他代码。。。return filberNode }2.实现diffReconcileChildren方法 该方法接受两个参数第一个是父节点第二个是新的ReactElement。 1我们要先拿到父节点的child比较child和element的key和type。 2将element保存在child的memoizedState里面。 3然后其他逻辑和reconcileChildren里的一样即可。 4直接返回child。 function diffReconcileChildren(filberNode, element) {const child filberNode.child;if(child child.key child.type) {if(child.key element.key child.type child.type) {child.memoizedProps element;child.pendingProps element.props;if(child.tag HostText) {child.pendingProps element}return child;}} }这里为什么要将element保存在memoizedState里面是因为虽然节点没有改变但是子节点可能有改变或者属性会有改变。所以要在后面的completeWork里进行处理。 3.修改completeWork 经过上面的处理后FilberNode不会无脑的重复创建而是复用了。而completeWork的工作主要是创建真实DOM挂载在FilberNode的stateNode上。 所以在completeWork中也不能无脑的创建真实DOM而是也要判断是否是可复用的。 export const completeWork (filberNode) {const tag filberNode.tagswitch (tag) {case HostComponent: {if(filberNode.stateNode ! null){//更新updateCompleteHostComponent(filberNode)}else{completeHostComponent(filberNode)}break;}//其他代码。。。。} }所以在对HostComponent的处理上如果发现不是mount阶段就要判断是否需要复用旧的。 4.实现updateCompleteHostComponent方法 在该方法中我们接受filberNode。同时我们可以拿到它的memoizedState在beginWork中传过来的。 再判断一下key和type如果依旧相同那么说明是可复用的。我们直接不创建新的DOM即可。 function updateCompleteHostComponent(filberNode) {const element filberNode.memoizedProps;if(element.key filberNode.key element.type filberNode.type) {addPropsToDOM(filberNode.stateNode, filberNode.pendingProps)}else{const type filberNode.type;const element document.createElement(type);addPropsToDOM(element, filberNode.pendingProps)filberNode.stateNode element;const parent filberNode.return;if(parent parent.stateNode parent.tag HostComponent) {parent.stateNode.appendChild(element)}}completeWork(filberNode.child) }addPropsToDOM方法是我们在实现事件机制的时候需要调用的方法。 OK这样我们就实现了单节点的Diff算法。
http://www.hkea.cn/news/14534681/

相关文章:

  • wordpress创意博客主题seo一般包括哪些内容
  • 淄博网站制作定制优化百度应用商店app下载安装
  • 百度竞价做网站如何创建属于自己的网站
  • 网站建设最重要的环节网站数据库是谁提供
  • 工业设计案例网站品牌营销策划服务
  • 上海电子通科技网站建设怎么做网站流量
  • 公司的网站建设费用算什么费用设计公司网站源码下载
  • 查看网站的外链t字型布局的网站在dw怎么做
  • 怎么建设百度网站民宿平台搜索量上涨
  • 静态网站制作流程上海工商查询系统官网
  • 网站开发资源上线了做网站价格贵
  • 泰安招聘网站有哪些0505网页制作与网站建设
  • 建设一个网站的具体流程vs2010网站开发 调试 打不开页面 浏览器错误
  • 3d网站开发安卓手机编程软件
  • 如何辨别官方网站营销策略包括哪些方面
  • 广西住房与城乡建设部网站学校网站的建设需求
  • lamp网站开发项目文档关于友谊的连接
  • 沂源做网站wordpress多用途主题排行
  • 合肥seo报价工具站seo
  • 网站设计与wap网站开发技术做球形全景的网站
  • 做石材外贸用什么网站瑞安市住房和城乡规划建设局网站
  • 绵阳网站搜索排名wordpress需要的系统
  • 怎么做网站切图美篇相册制作免费下载
  • 2万元建设网站贵吗谷歌搜索引擎镜像入口
  • 做网站需要几个服务器网站英文域名
  • 学建站wordpress取大气聚财的公司名字
  • 好网站建设立网站系
  • 商城网站模板库招生页面设计模板
  • 网站前台开发教程织梦网站转移
  • 能源科技网站建设房地产市场