React简单了解

server/2024/12/18 12:31:40/

原理简化了解 

javascript">import React from "react"
import { createRoot } form "react-dom/client"const element = React.createElement('p',{id: 'hello'},'Hello World!'
)const container = document.querySelector('#root')
const root = createRoot(container)
root.render()

编写一个自定义的render函数,该函数接受“React元素”和对container的引用:

javascript">function render(reactElement, containerDOMElement) {// 创建一个DOM对象const domElement = document.createElement(reactElement.type)// 更新属性domElement.innerHTML = reactElement.children;for (const key in reactElement.props) {const value = reactElement.props[key];domElement.setAttribute(key, value);}// 添加为子节点containerDOMElement.appenChild(domElement)}const reactElement = {type: 'a',props: {href: 'https://wikipedia.org/',id: 'some-links','data-num': 20,},children: 'Read more on Wikipedia',
};const containerDOMElement =document.querySelector('#root');render(reactElement, containerDOMElement);

 expression slots

我们可以使用大括号 ( {} ) 创建expression slots,任何放在大括号之间的内容都将被视为纯 JavaScript,而不是字符串。

JSX 在编译时并不会检查expression solts是否有效!它只是将内容转发到纯 JS 输出,并不会做任何额外的事情。

javascript">import React from "react"
import { render } from “react-dom”const shopping_list = ["apple", "banana", "carrot"];const element = (<div>Purchase: {shopping_list.length}</div>
)const compliedElement = React.createElement("div",{},"Purchase: "shoppingList.length
)const root = document.querySelector("#root");// render(element, root)
render(compliedElement, root);

你会发现程序输出没有任何变化!

所以如果你在expression slot中做一些条件判断的语句,它会发生错误,但这错误并不是jsx不允许,而是javascript不允许。

javascript">import React from "react"
import { render } from “react-dom”const shopping_list = ["apple", "banana", "carrot"];const element = (<div>Purchase: {if ( shoppingList.length < 5) "Almost done!"}</div>
)const compliedElement = React.createElement("div",{},"Purchase: "if ( shoppingList.length < 5) "Almost done!"
)const root = document.querySelector("#root");// render(element, root)
render(compliedElement, root);

很显然,我们不能将这种条件判断语句这样放在函数的参数中。

HTML与JSX的区别

JSX 看起来像 HTML,但有一些根本的区别

 关键字的保留

JavaScript 有几十个“关键字”。关键字是具有内置功能的关键字。因为它们已经做了一些事情,所以我们不能在 JSX 中使用它们。

但有一个问题,就是 HTML 属性有时与 JavaScript 关键字重叠。

javascript">const element = (<div><label for="name">Name:</label><inputid="name"class="fun-input"/></div>
);

 如果我们将其编译成 JavaScript,我们会发现我们使用了两个保留字:for,class。

为了解决这个冲突,React 对这两个术语使用了细微的变化:

  • for改为 htmlFor
  • class更改为className
javascript">const element = (<div><label htmlFor="name">Name:</label><inputid="name"className="fun-input"/></div>
);

区分大小写的属性

在 JSX 中,我们的属性需要是“camelCase” ,这是有效的html:

javascript"><videosrc="/videos/cat-skateboarding.mp4"autoplay="true"
>

在 JSX 中,我们需要将“autoplay”中的“p”大写,因为“auto”和“play”是不同的词:

javascript">const element = (<videosrc="/videos/cat-skateboarding.mp4"autoPlay={true}//  ^ Capital “P”/>
);

style的应用 

html中我们可以这么写:

javascript"><article style="filter: var(--shadow-elevation-high)"></article>

但在jsx中肯定是不行的,需要如下所示:

javascript"><article style={ { filter: "var(--shadow-elevation-high)" } }></article>

我们需要往expression slots中传入一个对象。

还有jsx标签必须闭合、必须小写等等。 

空格陷阱 

javascript">import { createRoot } from 'react-dom/client';const daysUntilSantaReturns = 123;const element = (<div><strong>Days until Santa returns:</strong>{daysUntilSantaReturns}</div>
);const container = document.querySelector('#root');
const root = createRoot(container);
root.render(element);

如上代码显示的会是:returns:123,而不是returns: 123,粗体文本和数字之间没有空格。

为什么会这样呢?

让我们考虑一下这个 JSX 如何编译为 JavaScript

javascript">const element = React.createElement('div',{},React.createElement('strong',{},'Days until Santa returns:'),daysUntilSantaReturns
);

请记住, JSX 不会编译为 HTML,它会编译为 JavaScript。当执行该 JavaScript 时,它只会创建并附加两个 HTML 节点:

那么我们该如何解决呢?最常见的解决方案是在大括号中添加单个空白字符:

javascript"><div><strong>Days until Santa returns:</strong>{' '}{daysUntilSantaReturns}
</div>

然而在 HTML 中,每个空白字符(以及换行符!)都会产生一个可见的空格。例如,假设我们有 3 个并排的图像(请参见下面的代码游乐场)。默认情况下,HTML 将在它们之间使用单个空白字符来呈现它们。

当然,它还取决于布局方式。在 Flex布局 中,浏览器将忽略所有空格和缩进,就像 JSX 编译器一样。


 

ran


http://www.ppmy.cn/server/151171.html

相关文章

2024年全球安全光幕系统行业总体规模、主要企业国内外市场占有率及排名

根据QYResearch研究团队调研统计&#xff0c;2023年全球安全光幕系统市场销售额达到了 亿元&#xff0c;预计2030年将达到 亿元&#xff0c;年复合增长率&#xff08;CAGR&#xff09;为 %&#xff08;2024-2030&#xff09;。中国市场在过去几年变化较快&#xff0c;2023年市场…

数据结构漫游记:初识vector

​ 嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的…

数据结构-栈与队列

栈&#xff1a;一对一的线性储存结构&#xff0c;先进后出&#xff0c;只允许从一端进行数据的插入与删除的线性数据结构。用于&#xff0c;判断成对出现的东西&#xff0c;如判断回文字符串或者回文数&#xff0c;四则混合运算求值等。 顺序栈&#xff08;数组&#xff09;&a…

【学习记录】Docker初探(1)

系统&#xff1a;windows11 使用管理员打开cmd窗口&#xff0c;使用PowerShell wsl WSL 全称为 Windows Subsystem for Linux&#xff0c;即 Windows 上的 Linux 子系统。它是微软提供的一项功能&#xff0c;允许用户在 Windows 10 和 Windows 11 上直接运行 Linux 二进制可执…

深度比较:OpenNI2 SDK与Orbbec SDK的功能、优势和选择指南

深度比较&#xff1a;OpenNI2 SDK与Orbbec SDK的功能、优势和选择指南 为了全面地了解OpenNI2 SDK与Orbbec SDK以及选择适合您需求的SDK&#xff0c;我们需要深入分析这两个SDK的设计理念、功能特点、优势和局限性。以下是对两个SDK的详细、专业和有逻辑的比较分析。 OpenNI2…

【论文通读】MMToM-QA: Multimodal Theory of Mind Question Answering

MMToM-QA: Multimodal Theory of Mind Question Answering 前言AbstractMotivationSolutionMMToM-QA Benchmark想法推断目标推断 The BIP-ALM ModelExperimentsConclusion 前言 来自ACL 2024 Outstanding Paper的工作&#xff0c;作者从人类认知的角度出发&#xff0c;加入很多…

Vscode打开后闪退问题

vscode 动不动就无法启动呀&#xff1f; 表现为启动在任务管理器中一闪而过 我这边过一个周末就不行了&#xff0c;昨天重新安装&#xff0c;今天又启动不了了 解决方案&#xff1a; 在cmd中启动code.exe 报错提示&#xff1a; FATAL:v8_initializer.cc(630)] Error loadi…