React源码解析18(1)------ React.createElement 和 jsx

这篇具有很好参考价值的文章主要介绍了React源码解析18(1)------ React.createElement 和 jsx。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.React.createElement

我们知道在React17版本之前,我们在项目中是一定需要引入react的。

import React from “react”

即便我们有时候没有使用到React,也需要引入。原因是什么呢?

在React项目中,如果我们使用了模板语法JSX,我们知道它要先经过babel的转译。那babel会将JSX转换成什么样子的格式呢?

React源码解析18(1)------ React.createElement 和 jsx,react.js,javascript,前端
可以看到,现在的babel会将JSX模板转换成带有jsx方法的内容。但是在17之前,babel是将JSX转换为带有React.createElement方法的内容。

而这也是为什么在17之前我们要引入React才能让项目正常使用。

2.ReactElement元素

如果我们在项目代码中,打印一个react元素:

const jsx = <div><span>123</span></div>
console.log(jsx)

可以在控制台看到:
React源码解析18(1)------ React.createElement 和 jsx,react.js,javascript,前端
所以我们通过babel转译后的内容,执行完应该生成这样的一个ReactElement对象。
所以在实现jsx方法前,我们可以定义一个ReactElement类(实际的React源码中是一个方法,但是这里为了好看一些,使用类的结构)。

class ReactElement {
  constructor(key, props, ref, type) {
    this.$$typeof = Symbol.for('react.element')
    this.key = key;
    this.props = props;
    this.ref = ref;
    this.type = type;
  }
}

3.实现JSX方法

在上面的转译内容我们可以看到,jsx方法接受两个参数,第一个参数是类型:例如div,span或者自定一类型。
第二个参数是配置参数:例如class,ref等参数。

我们只需要将ref,type,key这三个属性,直接赋值给ReactElement元素。而其他的属性全部放在props里面就可以了:

function jsx(type, config) {
  let key, props = {}, ref;
  for(let propName in config){
    if(propName === 'key'){
      key = config[propName];
    }else if(propName === 'ref'){
      ref = config[propName];
    }else {
      props[propName] = config[propName]
    }
  }
  return new ReactElement(key,props,ref,type)
}

由于递归的过程已经被babel处理了,所以其实在jsx方法中只需要遍历即可,并不需要太过复杂的处理。

4.测试

现在我们使用babel转译过的内容,对jsx方法进行测试:

const reactElement = jsx("div", {
  ref: "123",
  style: {
    color: 'red'
  },
  children: ["123", jsx("span", {
    children: "456"
  })]
});

console.log(reactElement)

可以在控制台看到jsx方法执行的结果:
React源码解析18(1)------ React.createElement 和 jsx,react.js,javascript,前端

以上就是通过babel处理后,react对处理的内容做的初步处理。文章来源地址https://www.toymoban.com/news/detail-637961.html

到了这里,关于React源码解析18(1)------ React.createElement 和 jsx的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • React源码解析18(10)------ 实现多节点的Diff算法

    在上一篇中,实现了多节点的渲染。但是之前写得diff算法,只能适用于单节点的情况,例如这种情况: 如果对于多节点的情况: 之前实现的diff算法就不会有效果了,所以在这一篇中,我们主要实现针对于多节点的diff算法。 实现之前,我们先将index.js修改一下: 在reconcile

    2024年02月12日
    浏览(36)
  • React源码解析18(4)------ completeWork的工作流程【mount】

    经过上一章,我们得到的FilberNode已经具有了child和return属性。一颗Filber树的结构已经展现出来了。 那我们最终是想在页面渲染真实的DOM。所以我们现在要在completeWork里,构建出一颗离屏的DOM树。 之前在说FilberNode的属性时,我们提到过一个属性stateNode。它就是用来保存每个

    2024年02月13日
    浏览(38)
  • React源码解析18(3)------ beginWork的工作流程【mount】

    OK,经过上一篇文章。我们调用了: 生成了FilberRootNode和HostRootFilber。 并且二者之间的对应关系也已经确定。 而下一步我们就需要调用render方法来讲react元素挂载在root上: 所以我们现在要实现ReactDOM.createRoot中返回的render方法。 首先我们思考一下,在React中,除了通过上面的

    2024年02月13日
    浏览(48)
  • React源码解析18(11)------ 实现多次setState的批处理

    在React中,如果涉及到了多次setState,组件render几次。setState是同步的还是异步的。这是一个很常见的面试题。 而本篇文章,就是主要实现React中,对于这部分的性能优化,我们称之为批处理。例如当我有下面的JSX。 对于当前的点击事件来说,只有最后的setNum(num + 3)是有效的。

    2024年02月11日
    浏览(45)
  • React jsx 语法解析 & 转换原理

    jsx是一种JavaScript的语法扩展(eXtension),也在很多地方称之为JavaScript XML,因为看起就是一段XML语法,用于描述UI界面,并且可以和JavaScript代码结合使用。 比起vue中的模板语法,更加灵活,且不需要学习模板语法中的特定标签,比如: v-if 、 v-for 、 v-bind 等,而是直接使用

    2024年02月03日
    浏览(44)
  • React源码解析18(5)------ 实现函数组件【修改beginWork和completeWork】

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

    2024年02月13日
    浏览(38)
  • 面试题-React(五):Babel解析JSX的过程?

    在React开发中,JSX已成为构建用户界面的重要语法。然而,浏览器无法直接理解JSX,需要通过Babel等工具将其转换为浏览器可执行的JavaScript代码。 一、Babel和AST简介 Babel是一个广泛应用的JavaScript编译工具,用于将新版本的JavaScript代码转换为旧版本的代码,以确保在不同浏览器

    2024年02月11日
    浏览(36)
  • React 学习之 createElement

    在 React 中,元素是 React 应用的最小构建块。 一个 React 元素是 React 对象的一个轻量级、静态的表示。 它们被 React 用于知道屏幕上什么应该被渲染,并在数据改变时保持 UI 的更新。 React 元素是不可变的:一旦创建,就不能更改它的子元素或属性。 一个元素就像电影的单帧:

    2024年04月08日
    浏览(28)
  • 【React】‘React‘ must be in scope when using JSX react/react-in-jsx-scope

    React 报错: 意思是在使用 JSX 时,没有引入 React ,比如像这样: 在使用 import 引入时,没有引入 React 。所以在被 Eslint 的 \\\"plugin:react/recommended\\\" 检查时,就会报错。 于是很多人就选择引入的时候加上 React ,这样 这样确实不报错了,但是他们忽略了一个版本事实: 在 React@17

    2024年02月15日
    浏览(43)
  • 【react从入门到精通】React JSX详解

    ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区 📙 专栏地址:react从入门到精通 【分享几个国内免费可用的ChatGPT镜像】 【10几个类ChatGPT国内AI大模型】 【用《文心一言》1分钟写一篇博客简直yyds】 【用

    2024年02月05日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包