【React】《React 学习手册 (第2版) 》笔记-Chapter4-React 运行机制

四、React 运行机制
  1. 使用 React 构建应用几乎离不开 JSX。这是一种基于标签的 JavaScript 句法,看起来很像 HTML。

  2. 为了在浏览器中使用 React,我们要引入两个库:React 和 ReactDOM。前者用于创建视图,后者则具体负责在浏览器中渲染 UI。这两个库都可以通过 unpkg CDN 引用(链接见下述代码片段)。

    <!DOCTYPE html>
    <html>
      <head>
    	<meta charset="utf-8" />
    	<title>React Samples</title>
      </head>
      <body>
    	<!-- 目标容器 -->
    	<div id="root"></div>
    
    	<!-- React 和 ReactDOM 库(开发版本)-->
    	<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    	<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    	<script>
    	  // 纯 React 和 JavaScript 代码
    	</script>
      </body>
    </html>
    
    • 这是在浏览器中使用 React 需要做的最少工作。
    • 你可以把 JavaScript 代码放在单独的文件中,不过在页面中加载时必须放到 React 后面。
    • 为了在浏览器控制台中看到所有错误消息和警告,我们使用的是 React 的开发版本。你也可以使用 react.production.min.js 和 react-dom.production.min.js,换成供生产环境使用的简化版本,只是看不到警告消息了。
  3. 简单来说,HTML 是一系列指令,让浏览器构建 DOM。浏览器加载 HTML 并渲染用户页面时,构成 HTML 文档的元素变成 DOM 元素。

    • 在 HTML 中,元素之间呈现一种层次结构。
    • 过去,网站由相互独立的 HTML 界面组成。用户访问这些页面时,浏览器请求并加载各 HTML 文档。AJAX 的发明引入了单页应用的概念。由于浏览器可以通过 AJAX 请求并加载少量数据之后,整个 Web 应该便可以精简成一个页面,依靠 JavaScript 更新用户界面。
    • 在单页应用中,浏览器只在开始时加载一个 HTML 文档。在用户浏览网站的过程中,始终待在同一个页面。用户不断与应用产生交互,JavaScript 则不断销毁和创建新的用户页面。这给人的感觉像是从一个页面跳转到另一个页面,但其实你仍然在相同的 HTML 页面上,背后繁重的工作都交给 JavaScript 了。
  4. DOM API 是一系列对象,供 JavaScript 与浏览器交互,修改 DOM。如果你曾用过 document.createElement 或 document.appendChild,那你就用过 DOM API。

    • React 是代我们更新浏览器 DOM 的一个库。
  5. 浏览器 DOM 由 DOM 元素组成,类似地,React DOM 由 React 元素组成。DOM 元素和 React 元素看着类似,其实区别很大。React 元素是对真正的 DOM 元素的描述。换句话说,React 元素是如何创建浏览器 DOM 的命令。

  6. 我们可以使用 React.createElement 创建一个表示 h1 的 React 元素:

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>React Elements</title>
    </head>
    <body>
    
    <!-- Target Container -->
    <div id="react-container"></div>
    
    <!-- React Library & React DOM-->
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    
    <script>
    
    	const dish = React.createElement(
    	  "h1",
    	  {id: "recipe-0", 'data-type': "title"},
    	  "Baked Salmon"
    	)
    
    	ReactDOM.render(
    	  dish,
    	  document.getElementById('react-container')
    	)
    
    	console.log('dish', dish)
    
    </script>
    
    </body>
    </html>
    
    • 第一个参数指定想创建的元素的类型。
    • 第二个参数设定元素的属性。
    • 第三个参数指定元素的子节点,即插入起始和结束标签之间的节点(这里只插入了一些文本)。
    • 渲染时,React 将把这个元素转换成真正的 DOM 元素。
    • React 组件其实就是 JavaScript 字面量,告知 React 如何构建 DOM 元素。
    • 在控制台中输出这个元素,你会看到如下内容:
      { 
      	$$typeof: Symbol(React.element), 
      	type: "h1", 
      	key: null, 
      	ref: null, 
      	props: {id: 'recipe-0', data-type: 'title', children: 'Baked Salmon'}, 
      	_owner: null, 
      	_store: {}, 
      }
      
      • 这是一个 React 元素的结构,其中一些字段是供 React 使用的,包括 _owner、_store 和 $$typeof。key 和 ref 字段对 React 元素很重要。
      • React 元素的 type 属性告诉 React 要创建的是什么类型的 HTML 或 SVG 元素。props 属性表示构建一个 DOM 元素所需的数据和子元素。children 属性则表示嵌套显示在元素内的文本。
      • 这里给出的是 React.createElement 返回的对象。我们其实不会自己动手创建 React 元素,而是使用 React.createElement 函数。
    • ReactDOM 提供了在浏览器中渲染 React 元素所需的工具。渲染所需的 reader 方法在 ReactDOM 中。
    • React 元素,包括它的子元素,使用 ReactDOM.reader 在 DOM 中渲染。我们想渲染的元素通过第一个参数传入,第二参数是目标节点,即指明在哪里渲染元素。
  7. 在 DOM 中与渲染元素有关的一切功能都在 ReactDOM 包中。

  8. 在 React 16 之前的版本中,只能在 DOM 中渲染一个元素。而现在,还可以渲染数组。

    const dish = React.createElement("h1", null, "Baked Salmon"};
    const dessert = React.createElement("h2", null, "Coconut Cream Pie"};
    ReactDOM.render([dish, dessert], document.getElementById('root'));
    
    • 上述代码在 root 容器中把两个元素渲染为同辈元素。
  9. React 使用 props.children 渲染子元素。可以把其他 React 元素渲染为子元素,创建一个元素树。

    const dish = React.createElement("section", {id: "baked-salmon"},
        React.createElement("h1", null, "Baked Salmon"),
        React.createElement("ul", {"className": "ingredients"},
            React.createElement("li", null, "1 lb Salmon"),
            React.createElement("li", null, "1 cup Pine Nuts"),
            React.createElement("li", null, "2 cups Butter Lettuce"),
            React.createElement("li", null, "1 Yellow Squash"),
            React.createElement("li", null, "1/2 cup Olive Oil"),
            React.createElement("li", null, "3 cloves of Garlic")
        ),
        React.createElement("section", {"className": "instructions"},
            React.createElement("h2", null, "Cooking Instructions"),
            React.createElement("p", null, "Preheat the oven to 350 degrees."),
            React.createElement("p", null, "Spread the olive oil around a glass baking dish."),
            React.createElement("p", null, "Add the salmon, Garlic, and pine..."),
            React.createElement("p", null, "Bake for 15 minutes."),
            React.createElement("p", null, "Add the Butternut Squash and put..."),
            React.createElement("p", null, "Remove from oven and let cool for 15 ....")
        )
    )
    
    ReactDOM.render(dish, document.getElementById('react-container'))
    
    console.log('dish element', dish)
    
    • 传给 createElement 函数的各个额外参数就是一个子元素。React 将创建一个由子元素构成的数组,把 props.children 的值设为这个数组。
    • 审查得到的 React 元素,你会看到每个列表项目 li 都是一个 React 元素,出现在 props.children 名下的数组里。
    • 有 class 属性的 HTML 元素,在 React 中使用的是 className,而不是 class。这是因为 class 是 JavaScript 的保留字,所以不得不使用 class Name 定义 HTML 元素的 class 属性。
  10. React 应用是由一系列 React 元素构成的树状结构,一切都发端于一个根元素。

  11. React 的主要优势是能把数据与 UI 元素分开。由于 React 本身是 JavaScript,我们可以借助 JavaScript 逻辑构建 React 组件树。

    const items = [
        "1 lb Salmon",
        "1 cup Pine Nuts",
        "2 cups Butter Lettuce",
        "1 Yellow Squash",
        "1/2 cup Olive Oil",
        "3 cloves of Garlic"
    ]
    
    const ingredients = React.createElement(
        "ul",
        { className: "ingredients" },
    	// items.map((ingredient, i) => React.createElement("li", null, ingredient))
        items.map((ingredient, i) => React.createElement("li", { key: i }, ingredient))
    )
    
    ReactDOM.render(
        ingredients,
        document.getElementById('react-container')
    )
    
    console.log('ingredients', ingredients)
    
    • "React.createElement(“li”, null, ingredient))"时,控制台会发出一个警告。通过迭代数组构建一组子元素时,React 预期每个元素都有 key 属性。由了 key 属性,React 才能高效率地更新 DOM。为每个列表项目元素添加一个独一无二的 key 属性后,这个警告便会消失。
  12. 在 React 中,组件(component)方便重用相同的结构,只需在结构中填充不同的数据即可。

    • 使用 React 构建用户界面时,应该尽量考虑把元素分解成可重用的片段。
    • 例子:
      function IngredientsList({ items }) {
      	return React.createElement("ul", {className: "ingredients"},
      		items.map((ingredient, i) =>
      			React.createElement("li", { key: i }, ingredient)
      		)
      	);
      }
      
  13. 在出现函数组件之前,创建组件有几种其他方式。

    • createClass:2013年,React 刚开源时,创建组件使用 createClass。
      const IngredientsList = React.createClass({
      	displayName: "IngredientsList",
      	render() {
      		return React.createElement("ul", {className: "ingredients"},
      		  this.props.items.map((ingredient, i) =>
      			  React.createElement("li", { key: i }, ingredient)
      		  )
      		);
      	}
      });
      
      • 使用 createClass 创建的组件需要一个 render() 方法,指明返回及渲染什么 React 元素。组件背后的思想还是一样的,即描述一些可重用的 UI 供渲染。
      • 在 React 15.5(2017年4月)中,React 开始在使用 createClass 的地方发出警告。在 React 16(2017年9月)中,React.createClass 正式被弃用,移到了单独的包 create-react-class 中。
    • 类组件:ES2015 为 JavaScript 添加类句法后,React 引入了一种创建 React 组件的新方法。React.Component API 支持使用类句法创建组件实列:
      class IngredientsList extends React.Component {
      	render() {
      	  return React.createElement("ul", {className: "ingredients"},
      		  this.props.items.map((ingredient, i) =>
      			  React.createElement("li", { key: i }, ingredient)
      		  )
      	  )
      	}
      }
      
      const items = [
        "1 lb Salmon",
        "1 cup Pine Nuts",
        "2 cups Butter Lettuce",
        "1 Yellow Squash",
        "1/2 cup Olive Oil",
        "3 cloves of Garlic"
      ]
      
      ReactDOM.render(
      	React.createElement(IngredientsList, {items}, null),
      	document.getElementById('react-container')
      )
      
      • 现在依然可以使用类句法创建 React 组件,但是笔者要提前告诉你,React.Component 即将被弃用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/713873.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React写一个 Modal组件

吐槽一波 最近公司的项目终于度过了混乱的前期开发&#xff0c;现在开始有了喘息时间可以进行"规范"的处理了。 组件的处理&#xff0c;永远是前端的第一大任务&#xff0c;尤其是在我们的ui库并不怎么可靠的情况下&#xff0c;各个组件的封装都很重要&#xff0c;而…

minium小程序自动化

一、安装minium pip install minium二、新建config.json {"dev_tool_path": "D:\\Program Files (x86)\\Tencent\\微信web开发者工具\\cli.bat","project_path": "小程序项目路径" }三、编写脚本 import miniumclass FirstTest(min…

【Echarts系列】平滑折线面积图

【Echarts系列】平滑折线面积图 序示例数据格式代码 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 示例 平滑折线面积图如图所示&#xff1a; 数据格式 data [{name: 2020年,value: 150},{name: 2021年,value: 168},{name: 2…

设计模式-装饰器模式Decorator(结构型)

装饰器模式(Decorator) 装饰器模式是一种结构模式&#xff0c;通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能&#xff0c;是现有类的包装。 图解 角色 抽象组件&#xff1a;定义组件的抽象方法具体组件&#xff1a;实现组件的抽象方法抽象装饰器&…

git的ssh安装,windows通过rsa生成密钥认证问题解决

1 windows下载 官网下载可能出现下载太慢的情况&#xff0c;Git官网下载地址为&#xff1a;官网&#xff0c;推荐官网下载&#xff0c;如无法下载&#xff0c;可移步至CSDN&#xff0c;csdn下载地址&#xff1a;https://download.csdn.net/download/m0_46309087/12428308 2 Gi…

【Linux】程序地址空间之动态库的加载

我们先进行一个整体轮廓的了解&#xff0c;随后在深入理解细节。 在动态库加载之前还要说一下程序的加载&#xff0c;因为理解了程序的加载对动态库会有更深的理解。 轮廓&#xff1a; 首先&#xff0c;不管是程序还是动态库刚开始都是在磁盘中的&#xff0c;想要执行对应的可…

PHP在线生成查询产品防伪证书系统源码

源码介绍 PHP在线生成查询产品防伪证书系统源码&#xff0c;源码自带90套授权证书模板&#xff0c;带PSD公章模板&#xff0c;证书PSD源文件。 环境要求&#xff1a;PHPMYSQL&#xff0c;PHP 版本请使用PHP5.1 ~5.3。 图片截图 源码安装说明 1.上传所有文件至你的空间服务器…

学会python——显示进度条(python实例五)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、进度条显示 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读…

从零到爆款:用ChatGPT写出让人停不下来的短视频文案

一、前言 在自媒体的浪潮中&#xff0c;精彩的短视频文案对内容传播至关重要。众多辅助工具之中&#xff0c;凭借强大的语言处理能力和广泛的应用场景&#xff0c;ChatGPT成为了内容创作者的重要助力。接下来&#xff0c;我将介绍如何借助ChatGPT编写引人入胜的短视频文案&…

积木搭建游戏-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第83讲。 积木搭建游戏&…

Windows10 利用QT搭建SOEM开发环境

文章目录 一. SOEM库简介二. 安装WinPcap三. SOEM(1.4)库安装(1) 编译32位库(2) 编译64位库 四. 运行SOEM示例代码五. WIN10下利用QT构建SOEM开发环境 一. SOEM库简介 SOEM&#xff08;Scalable Open EtherCAT Master 或 Simple Open EtherCAT Master&#xff09;是一个开源的…

【OrangePiKunPengPro】 linux下编译、安装Boa服务器

OrangePiKunPengPro | linux下编译、安装Boa服务器 时间&#xff1a;2024年6月7日21:41:01 1.参考 1.boa- CSDN搜索 2.Boa服务器 | Ubuntu下编译、安装Boa_ubuntu安装boa-CSDN博客 3.i.MX6ULL—ElfBoard Elf1板卡 移植boa服务器的方法 (qq.com) 2.实践 2-1下载代码 [fly752fa…

python将数据保存到文件的多种实现方式

&#x1f308;所属专栏&#xff1a;【python】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的…

EasyRecovery2024数据恢复神器#电脑必备良品

EasyRecovery数据恢复软件&#xff0c;让你的数据重见天日&#xff01; 大家好&#xff01;今天我要给大家种草一个非常实用的软件——EasyRecovery数据恢复软件&#xff01;你是不是也曾经遇到过不小心删除了重要的文件&#xff0c;或者电脑突然崩溃导致数据丢失的尴尬情况呢&…

手机照片免费数据恢复软件EasyRecovery2024免费版下载

大家好&#xff01;今天我要给大家推荐一款非常棒的软件——EasyRecovery。相信大家都知道&#xff0c;电脑中的重要文件一旦丢失&#xff0c;对我们的工作和学习都会产生很大的影响。 而EasyRecovery软件就是专门解决这个问题的利器&#xff01;它能够帮助我们快速、有效地恢…

第三篇—基于黑白样本的webshell检测

本篇为webshell检测的第三篇&#xff0c;主要讲的是基于黑白样本的webshell预测&#xff0c;从样本收集、特征提取、模型训练&#xff0c;最后模型评估这四步&#xff0c;实现一个简单的黑白样本预测模型。   若有误之处&#xff0c;望大佬们指出 Ⅰ 基本实现步骤 样本收集&…

Unity中的伽马(Gamma)空间和线性(Linear)空间

伽马空间定义&#xff1a;通常用于描述图像在存储和显示时的颜色空间。在伽马空间中&#xff0c;图像的保存通常经过伽马转换&#xff0c;使图片看起来更亮。 gamma并不是色彩空间&#xff0c;它其实只是如何对色彩进行采样的一种方式 为什么需要Gamma&#xff1a; 在游戏业…

53. QT插件开发--插件(动态库so)的调用与加载

1. 说明 在使用QT进行插件库的开发之后,还需要将这个插件库程序生成的so动态链接库加载到主程序框架中进行使用,才能达到主程序的模块化开发的效果。在前一篇文章插件创建中介绍了如何在QT中开发插件库,并提供外部接口调用。本篇博客的主要作用是模拟在主程序框架中加载动态…

诊断丢帧:发送端连续帧发送过快,导致接收端丢帧

项目场景: 在项目开发过程中,对于报文的接收/发送,一般来说,通信量大,选择Polling(轮询)处理模式;通信量小,选择Interrupt(中断)处理模式。具体选择没有优劣之分。结合项目的实际情况,选择适合项目的方式就好。小编将分享一个Polling模式下出现的丢帧现象。 1576…

Docker镜像技术剖析

目录 1、概述1.1 什么是镜像&#xff1f;1.2 联合文件系统UnionFS1.3 bootfs和rootfs1.4 镜像结构1.5 镜像的主要技术特点1.5.1 镜像分层技术1.5.2 写时复制(copy-on-write)策略1.5.3 内容寻址存储(content-addressable storage)机制1.5.4 联合挂载(union mount)技术 2.机制原理…