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

网站建设的技术支持建筑人才网招聘官网登录

网站建设的技术支持,建筑人才网招聘官网登录,网站的模板,手机版网站系统摘要 经过之前的几篇文章,我们实现了基本的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/163164/

相关文章:

  • 网站设计模板素材福州仓前网站建设
  • wordpress网站文章形式齐装网装修平台官网
  • 金融网站建设公司排名太原网站优化哪家专业
  • 网站开发客户需求分析川畅联系 做网站多少钱
  • 私人兼职做网站开发给企业做网站推广好么
  • 企业建站划算吗网络赣州
  • 网页界面设计的用途谷歌seo怎么优化
  • 建设银行顺德分行网站网站投票系统怎么做
  • 代做土木毕业设计网站网上注册公司核名流程
  • php网站怎么缓存玉溪网络推广 网站建设
  • 深圳网站设计专家乐云seo百度手机助手app官方下载
  • 江西手机网站建设网站logo多大
  • 长春网站关键词排名口碑营销的主要手段有哪些
  • 档案网站建设思考软件搭建平台
  • 国内做任务得数字货币的网站免费网站地址申请
  • 网站模板安装教程外贸数据平台有哪些
  • 湖北网站建设电话湖北长城建设实业有限公司网站
  • 吉林省工伤保险网站中国航发网上商城首页
  • 网站建设选择什么模式最近高清中文在线国语字幕
  • 网站开发流程及详解去掉wordpress标题中竖线
  • 网站流量统计怎么做的东莞软件有限公司
  • 网站建设心得感想如何用python做一个网站
  • 成都网站排名优化开发seo神马网站推广器
  • 长沙企业官方网站建设地推项目平台
  • 湛江怎么做网站关键词优化怎样下载建设银行信用卡网站
  • 企业自建网站 备案微信微网站开发报价单
  • dw和vs做网站制作网页常用的软件有哪些
  • 湖州建设企业网站手机设计软件门窗
  • 长沙网站开发制作长沙楼市最新消息
  • h5响应式网站模板云主机建网站