百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

2020 动手写个 React (3)(手写react源码)

zzlvtu 2024-09-04 23:02 6 浏览

2020 动手写个 react (3)


coding

组件

组件可能是函数还可能是类,我们知道只要继承 Component 类就是 react 的组件。

function Box(){
    return (
        <div className='box' size="24">
            hello,<span>zidea</span>
        </div>
    )
}

创建一个函数,函数名为 Box 函数返回一个 jsx 对象

ReactDOM.render(<Box name={title}/>,document.querySelector("#root"));

传入一个名称为 title 的对象,

整理代码

function _render(vnode){
    //TODO
    if(vnode === undefined ) return;
    // vnode is equal string
    if(typeof vnode === 'string'){
        //create textNode
        return document.createTextNode(vnode)
    }

    // deconstruct vnode
    const {tag,attrs} = vnode;

    //create dom object
    const dom = document.createElement(tag)

    if(attrs){
        // property key: className box
        Object.keys(attrs).forEach(key=>{
            const val = attrs[key]
            setAttribute(dom,key,val)
        })
    }

    vnode.children.forEach(child=>render(child,dom))

    return dom;
    
}

在 javascript 中,如果函数名称以下划线开头通常是私有方法。这里把渲染设置为私有方法,也就是渲染逻辑放置在_render 方法中。然后 _render 方法主要就是讲虚拟节点处理 dom 节点返回出来。

  • return dom; 返回 dom 而不是将 dom 添加到容器节点中
  • return document.createTextNode(vnode) 通常
function render(vnode,container){
    container.appendChild(_render(vnode))
}

渲染方法(_render)

if(vnode === undefined || vnode === null || typeof vnode === 'boolean') vnode = '';

判断 tag 是函数,tag 可能是函数组件或类组件
if(typeof vnode.tag === 'function') 通过虚拟节点 tag 值来判断是否为组件,然后按组件进行处理

  1. 创建组件
    const comp = createComponent(vnode.tag,vnode.attrs);
  2. 设置组件的属性
    setComponentProps(comp,vnode.attrs);
  3. 组件渲染的节点返回对象
    return comp.base; 这里我们不能返回组件,而需要将节点对象挂接到 comp 的 base 属性上,然后返回comp.base的个节点对象。

创建组件

function createComponent(comp,props){
    //declare component instance
    let instance;
    // class component case
    if(comp.prototype && comp.prototype.render){
        instance = new comp(propos)
    }else{ // function component case 
        //conver function component to class component
        instance = new Component(props)
        //constructor prefer to function(component)

        instance.constructor = comp;
        //define render function
        instance.render = function(){
            //return jsx object
            return this.constructor(props)
        }
    }
    return instance;
}
  • 对于类组件,相对函数组件要好处理,只需要实例化(new)该类,然后将 props 做出参数传入即可。
  • 如果组件是函数组件,我们需要将函数组件转为类组件,这样做的好处是便于以后管理组件。这里我们在react文件夹下创建一个 component.js 类其中定义 Component 类
class Component{
    constructor(props = {}){
        this.props = props;
        this.state = {};
    }
}

export default Component;
- 在构造函数接收 props 参数,这是从外部传入的参数,然后内部维护一个状态对象 state
  • 接下来问题是如何获取 jsx 对象,其实在函数组价,jsx 对象作为返回值,我们构造函数依然已经指向了该函数,只要 render 函数返回该函数的返回值即可。
instance.render = function(){
    //return jsx object
    return this.constructor(props)
}

设置组件属性

function setComponentProps(comp,props){
    //设置组件的属性
    comp.propos = props;
    renderComponent(comp)
}

渲染组件

function renderComponent(comp){
    let base;
    //call render method to return jsx object
    const renderer = comp.render();
    //conver jsx to dom obj
    base = _render(renderer);
    
    console.log(base)

    comp.base = base
}

相关推荐

什么是DPDK?DPDK的原理及学习学习路线总结

一、什么是DPDK  对于用户来说,它可能是一个性能出色的包数据处理加速软件库;对于开发者来说,它可能是一个实践包处理新想法的创新工场;对于性能调优者来说,它可能又是一个绝佳的成果分享平台。 ...

每天进步一点:两分钟解决kvm下windows虚拟机鼠标不跟随

跟随昨天文章做测试的朋友们应该和我一样遇到了vnc连接windows鼠标不跟随的问题,经过一番查找有两种解决办法:1.编辑配置文件命令virshedittest或者直接vi/etc/libvir...

PC虚拟化主流:KVM、XEN、OpenVZ详解

目前,PC的虚拟化逐渐成为互联网发展的大趋势,我们知道,KVM、XEN、OpenVZ是虚拟化的三种方式,今天我们就来探讨这三种虚拟化的优势和劣势。1、pc虚拟化——KVMKVM是完整的硬件虚拟化,可在...

Windows上使用QEMU创建aarch64(ARM64)虚拟机

前言随着国产化的推进,现在采用ARM、MIPS的机器越来越多,作为开发、运维人员要调测软件总不能每种架构的机器都去买一台吧?主要像博主这样的穷B,实在也是承受不起。。需要的工具...

高度致敬Windows!开源优麒麟20.04 LTS发布:支持5年

优麒麟团队宣布,优麒麟(UbuntuKylin)开源操作系统20.04LTS正式版已经发布,代号FocalFossa,全球同步发布的还有Ubuntu20.04、Lubuntu20.04、Xub...

极空间虚拟机上线了,一学就会!小白保姆级使用教程

友情提示本文涉及内容较多,篇幅在4500字左右,为了对小白用户更加友好,图片示例多达60张。整个文章部分为三个阶段,准备-初探-实战。其中实战部分包含Windows系统,ikuai软路由系统,iSto...

Windows Subsystem for Linux现以应用形式上架Microsoft Store

微软今天宣布WindowsSubsystemforLinux(WSL)作为一款应用上架Windows11端的MicrosoftStore。也就是说,现在WSL以应用的方式通过...

Windows Server 2019 Core 虚拟机系统镜像制作

WindowsServer2019Core简介WindowsServer2019是微软于2018年11月13日发布的新一代WindowsServer服务器操作系统,基于Win10180...

微软商店中的WSL预览版现已可用!Windows 11用户狂喜

...

在NAS上安装Win10,24小时待命的云电脑达成√

#头条创作挑战赛#引子...

免费开源虚拟机VirtualBox 7.0.12发布:修复TPM和黑屏问题

IT之家10月18日消息,甲骨文近日发布了VirtualBox7.0.12维护版本更新,重点修复此前版本中用户反馈和官方发现的BUG,改善了对LinuxKernel6.4/6.5...

KVM Cloud 虚拟机管理系统安装部署

KVMCloud介绍KVMCloud是一款基于KVM实现的适用于小微企业的虚拟机管理系统,支持如下功能:基于KVM的VM基础功能(创建、启动、停止、重装、webVNC等功能)使用NFS作为磁盘...

个人KVM 虚拟化学习笔记(kvm虚拟化管理平台)

一、KVM原理二、KVM基础功能2.1CPU2.2内存2.3存储2.4网络三、KVM高级功能...

kvm虚拟化之ESXi到KVM之v2v迁移(esxi虚拟机迁移到另一个esxi)

1.ESXi到KVM之v2v情况说明(1).配置任务列表:1)VMwareESXi虚拟平台下linux系统迁移到KVM虚拟平台。2)VMwareESXi虚拟平台下windows系统迁移到KVM虚拟平台...

unraid下虚拟机安装Windows(vmware安装unraid)

unraid下虚拟机安装Windows使用unraid也有一段时间了,主要是做数据备份,以及docker容器的安装测试,今天有空测试一下VMS虚拟机的使用,用在unraid上安装windows7操作系...