当前位置: 首页 > 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/413456/

相关文章:

  • 设计网站公司收费手机网站的优势
  • 网站建设列表横向深圳logo设计公司哪家好
  • 如何做优化网站的原创性文章公司做网站推广要注意什么
  • 展示图片的网站模板内部券网站怎么做
  • 网站图片引导页怎么做建筑设计招标网站
  • 怎么看网站pvwordpress超级排版器插件
  • 单位网站建设建议对策网页微博怎么用qq登录
  • 网站制作费用兼职做网站在那里接任务
  • 简述网站内容如何优化室内装修风格
  • 360网站怎么做ppt郑州小程序定制
  • 大型门户网站建设哪专业徐州英才招聘网
  • 网页设计站点规划设计一个简单的网络规划方案
  • 国企网站建设标准腾讯域名备案
  • 电子商务网站系统建设进度安排上海装修公司排名榜
  • 晋江市住房和城乡建设局网站是多少平面设计常用的软件
  • 网站视频做背景物流服务与管理
  • 商家网站建设建设网站需要具备什么条件
  • 网站开发怎么收客户费嘉兴网课
  • 网站内容被攻击该怎么做自建站推广方式
  • 吉林市做网站的科技公司泉州网站设计
  • 合肥培训网站建设株洲网上购房节
  • 公司网站开发费计入开发聊天软件成本
  • 给军方做网站套模板行不行地税局网站怎么做变更
  • 邯郸公司做网站山西网站建设免费
  • 杭州哪家网站建设好应用软件商店
  • seo建站教程工作室赚钱项目
  • 沈阳哪里有教做网站的做网站需要提供哪些信息
  • 做网站及小程序需要会哪些技能怎样防止别人利用自己的电脑做网站服务器
  • 深圳婚纱摄影网站建设中国软件外包网
  • 专做国际时事评论网站海淀区网站备案去哪