【react】react的jsx 的本质?

JSX => createElement 函数 => ReactElement (对象树) => ReactDOM.render => 真实的DOM

1 JSX基本使用

实际上,JSX 仅仅只是 React.createElement(component,props,…children) 函数的语法糖

所有的 jsx 最终都会被转换成 React.createElement 的函数调用

React.createElement 需要传递的参数

  • 参数一:type
    • 当前 ReactElement 的类型
    • 如果是标签元素,那么就使用字符串 表示 “div”
    • 如果是组件元素,那么就直接使用组件的名称
  • 参数二:config
    • 所有 jsx 中的属性都在 config 中以对象的属性和值的形式存储
  • 参数三:chldren
    • 存放在 标签中的内容,以 children 数组的方式进行存储
  <script type="text/babel">

    const message1 = React.createElement("h2", { "class": "a" }, "你好")
    ReactDOM.render(message1, document.getElementById('app'))
  </script>

注意:如果 是 React.createElement(“div”,null,继续创建元素1,继续创建元素2,继续创建元素3)

在源码中,React.createElement() 函数,只有三个参数

那我们 传递了三个以上的参数,如何匹配?

他会根据 arguments.length - 2 进行 获取

2 虚拟DOM

我们通过 React.createElement 最终创建出来一个 ReactElement 对象

ReactElement 对象 是什么作用? React 为什么要创建它?

原因是 React 利用 ReactElement 对象 组成了一个 js 对象树

js 的对象树 就是大名鼎鼎的虚拟DOM

# 源码中 这样写道
return ReactElement(
	type,
  key,
  ref,
  self,
  source,
  ReactCurrentOwner.current,
  props,// 子元素 可能有一个 或者多个
)

最后, ReactDOM.render 函数,把 对象树,转换成真正的DOM

JSX => createElement 函数 => ReactElement (对象树) => ReactDOM.render => 真实的DOM

    class App extends React.Component {
      constructor() {
        super()

        this.state = {

        }
      }
      render() {
        // JSX => createElement 函数 => ReactElement (对象树) => ReactDOM.render => 真实的DOM

        // var elementObj = React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
        //   className: "header"
        // }, /*#__PURE__*/React.createElement("h1", {
        //   title: "\u6807\u9898"
        // }, "\u6211\u662F\u6807\u9898")), /*#__PURE__*/React.createElement("div", {
        //   className: "content"
        // }, /*#__PURE__*/React.createElement("h2", null, "\u6211\u662F\u9875\u9762\u7684\u5185\u5BB9"), /*#__PURE__*/React.createElement("button", null, "\u6309\u94AE"), /*#__PURE__*/React.createElement("button", null, "+1"), /*#__PURE__*/React.createElement("a", {
        //   href: "http://www.baidu.com"
        // }, "\u767E\u5EA6\u4E00\u4E0B")), /*#__PURE__*/React.createElement("div", {
        //   className: "footer"
        // }, /*#__PURE__*/React.createElement("p", null, "\u6211\u662F\u5C3E\u90E8\u5185\u5BB9")));


        // 这两种定义  其实结果都是一样的

        var elementObj = (
          <div>
            <div className="header">
              <h1 title="标题">我是标题</h1>
            </div>
            <div className="content">
              <h2>我是页面的内容</h2>
              <button>按钮</button>
              <button>+1</button>
              <a href="http://www.baidu.com">百度一下</a>
            </div>
            <div className="footer">
              <p>我是尾部内容</p>
            </div>
        </div>)

        console.log(elementObj);
        return elementObj
      }
    }

    ReactDOM.render(<App />, document.getElementById('app'))
3 为什么采用 虚拟DOM
  • 很难跟踪状态发生的改变:原有的开发模式,我们很难跟踪到状态发生的改变,不方便针对我们应用程序进行调试
  • 操作真实DOM性能较低:传统的开发模式会进行频繁的DOM操作,而这一的做法性能非常的低
    • document.createElement 本身创建出来的就是一个非常复杂的对象
    • DOM操作会引起浏览器的回流的重绘
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React是一个用于构建用户界面的JavaScript库。React通过构建组件化的UI来让前端开发更加高效和可维护。React的特点包括简单易学、高效、灵活、可重用和可组合等。 React的优势包括:虚拟DOM提高了性能、组件化开发更加高效、JSX使得代码易于阅读和理解、单向数据流使得应用更加可维护。 React的劣势包括:学习曲线较陡峭、需要依赖其他工具库或框架来构建完整的应用、一些开发者认为JSX语法不太直观。 JSX是一种将JavaScript和HTML结合的语法。它允许开发者在JavaScript代码中编写HTML标记,从而使得前端开发更加高效和灵活。浏览器无法读取JSX,因为它不是原生的HTML语法,需要使用编译器将其转化为浏览器可读的JavaScript代码。 虚拟DOM是React的核心概念之一,它是一个轻量级的JavaScript对象。React通过虚拟DOM来提高性能,因为它可以在修改DOM之前先修改虚拟DOM,然后再进行一次性的DOM操作,从而减少浏览器的重绘和回流。 组件是React的另一个核心概念,它是UI的构建块。组件可以是一个按钮、一个输入框、一个列表等等,它们都可以在组件层次结构中组合在一起,构成一个完整的UI。 state和props是React组件中两种重要的数据来源。state代表组件内部的状态数据,它可以通过setState方法来修改。props代表组件的属性,它可以从父组件传递给子组件。 React组件的生命周期包括:初始化阶段、挂载阶段、更新阶段和卸载阶段。在不同的阶段中,组件会触发不同的生命周期方法,比如componentDidMount、shouldComponentUpdate等。这些生命周期方法可以让开发者在不同的阶段中执行不同的操作,从而更好地控制组件的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值