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

建德网站建设免费个人简历模板官网

建德网站建设,免费个人简历模板官网,做php网站都用框架吗,个人博客网站开发的意义摘要 经过之前的几篇文章,我们实现了基本的jsx,在页面渲染的过程。但是如果是通过函数组件写出来的组件,还是不能渲染到页面上的。 所以这一篇,主要是对之前写得方法进行修改,从而能够显示函数组件,所以现…

摘要

经过之前的几篇文章,我们实现了基本的jsx,在页面渲染的过程。但是如果是通过函数组件写出来的组件,还是不能渲染到页面上的。
所以这一篇,主要是对之前写得方法进行修改,从而能够显示函数组件,所以现在我们在index.js文件中,修改一下jsx的写法。修改成函数组件:

import jsx from '../src/react/jsx.js'
import ReactDOM from '../src/react-dom/index'const root = document.querySelector('#root');function App() {return jsx("div", {ref: "123",children: jsx("span", {children: "456"})});
}ReactDOM.createRoot(root).render(<App />)

这里因为需要使用我们自己的jsx方法。所以在App里面返回的依旧是通过之前的方式进行调用。

1.修改reconcileChildren方法

我们来回忆一下,在beginWork阶段,我们主要是通过ReactElement,创建FilberNode。而reconcileChildren,就是创建FilberNode的方法。

在之前我们只处理了HostText类型和HostComponent类型,所以在这个方法里面,我们要对函数类型进行兼容,而作为函数组件的ReactElment,它最显而易见的特点就是type的值是一个函数。

例如上面的App组件,对应的ReactElement的type就是App。所以我们可以通过type来判断组件的类型:

function reconcileChildren(element) {let tag;if(typeof element.type === 'function') {tag = FunctionComponent}//其他代码console.log(filberNode)return filberNode
}

我们打印一下看看,这个函数组件是否满足预期:

在这里插入图片描述

2.updateFunctionComponent方法

现在有了tag为FunctionComponent类型的FilberNode,在beginWork里面,我们就要对这个类型的FilberNode进行处理:

function beginWork(nowFilberNode) {switch (nowFilberNode.tag) {//其他代码case FunctionComponent: {return updateFunctionComponent(nowFilberNode)}//其他代码}
}

现在我们来实现updateFunctionComponent方法。
之前对于HostComponent类型的FilberNode,它的子节点其实就是它对应的ReactElement。

但是对于函数类型的FilberNode,我们想一下不就是它自己的返回值嘛?所以我们直接调用这个函数就能拿到它的子FilberNode了。

function updateFunctionComponent(filberNode) {const nextChildren = filberNode.type();const newFilberNode = reconcileChildren(nextChildren);filberNode.child = newFilberNode;newFilberNode.return = filberNode;beginWork(newFilberNode)
}

2.修改completeWork方法

对于completeWork方法, 它的主要作用(目前)是给对应的FilberNode增加stateNode,而函数组件并没有自己对应的StateNode,所以直接继续递归就可以了:

export const completeWork = (filberNode) => {const tag = filberNode.tagswitch (tag) {//其他代码。。。case FunctionComponent: {completeWork(filberNode.child)}}
}

3.修改commitWork方法

对于之前的commitWork,我们是直接将最外层的FilberNode的stateNode挂载了容器上,现在由于最外层的可能是FunctionComponent,它是没有自己的stateNode的。所以我们要找到具有stateNode的最外层FilberNode。

import { HostComponent } from "./filberNode";export function commitWork(filberRootNode) {const container = filberRootNode.container;let node = filberRootNode.finishedWork;while( node.tag !== HostComponent ){node = node.child}container.appendChild(node.stateNode)
}

OK,经过上面的修改,我们的App组件也可以正常渲染了。

http://www.yayakq.cn/news/517642/

相关文章:

  • 网站升级建设方案动态ip如何做网站
  • 高端网站建设好处制作文件的软件
  • 学校网站建设项目可行性分析报告网站开发可能存在的困难
  • 网站推广方式案例淄博企业网站排名优化
  • 网站流量被用完了网易企业邮箱客户端下载
  • 礼县住房和城乡建设局网站北京网站制作沈阳
  • dw怎么做网站教程火锅自助餐网站建设
  • 做网站有用吗wordpress链接跳转等待
  • 广州网站建设 知名张家港网站建设
  • wordpress 关闭google字体菏泽做网站优化的
  • 推广赚佣金项目电商网站商品页的优化目标是什么
  • 做网站成功网站的建设和推广
  • 金属质感 网站工作室注册条件
  • 专业关键词排名软件江西做网站优化好的
  • 阿里云网站建设模板门户网站的建设与维护
  • 网站域名重要吗类qq留言网站建设
  • 超链接到网站怎么做视频建设网站需要有什么特色
  • 北京网站开发建设网站放友情链接违法吗
  • 做网站要买多大服务器便宜的网站空间
  • 吉安市建设局图审中心网站wordpress html文件
  • 开源网站开发文档下载漯河做网站xknt
  • 重庆开发网站小说网站有源码了该怎么做
  • 远程管理wordpress站群权威发布文字图片
  • 怎么创建网站相册建设网站查询
  • 免费cms网站管理系统东莞市网站建设平台
  • 各大网站收录提交入口wordpress上传格式
  • 优秀电商设计网站有哪些内容wordpress副标题些什么
  • 响应式网站建设特征网站页面格式
  • 让搜索引擎收录网站网站开发经验与教训范文
  • 怎么做app和网站购物怎么让谷歌收录我的网站