由于没有React经验,所以我决定从官方教程学习React的第二部分(使用JSX编写标记)
首先
or
一开始
前次的文章可以从以下地方学习React的官方教程,因为我没有经验 Part1.
我会继续总结我学到的内容。
上次我们大致了解了React的相关部分。
这次我们会更深入地讨论JSX并进行确认。
学习REACT-基于JSX编写标记的内容。
JSX即JavaScript XML。它是一种用于在React中构建UI组件的语法扩展。
JSX的概述:
首先要明白的是,React 和 JSX 是两个不同的东西。
JSX是JavaScript的擴充,可以使用類似XML的語法來編寫標記。而React則是一個用於顯示界面的JavaScript庫,兩者是不同的。
再下一个是JSX是JavaScript对象的一部分。
它看起来像HTML,但其实里面是一个对象。
我们将依次对这两个问题进行讨论。
理解JSX
在开头,我提到了JSX是JavaScript的扩展,不同于React,但是扩展又是什么意思呢?让我们从JSX的内容来思考。
不使用JSX的写法
React和JSX是两种不同的东西,因此可以在React中不使用JSX进行编码。
我們試著做一下吧。讓我們開始編輯App.js。
(關於App.js的詳細內容,請參考初次文章)
从React中导入createElement函数,并且修改App函数的内容。
在createElement函数中,第一个参数是HTML标签,第二个参数不使用所以设为null,第三个参数用于设置标签的内容。
import logo from './logo.svg';
import './App.css';
import { createElement } from 'react';
function App() {
return createElement('h1', null, 'Helllo World!');
}
export default App;
不过,虽然这次只是
标签,但是随着HTML元素的增加,使用这个函数来表示会有些麻烦。
JSX的写法更简洁,而且与HTML的记法几乎相同,所以直观上也更容易理解。
要在JSX中实现与之前相同的行为,可以按照以下方式进行。
function App() {
return (
<h1>Hello World!</h1>
);
}
export default App;
为什么在JSX的声明方式下,即使只是普通的HTML,也无法看到函数等处理,却能正确显示结果呢?
我們接下來將確認其內容。
将JSX转换
前面的问题的答案很简单,因为JSX的编写被转换为JavaScript语法在背后进行。这个转换过程使用的是一个叫做Babel的工具。
请查看以下网站了解有关Babel转换的信息。
Babel-试用一下
您可以在这个网站上查看使用Babel进行转换的结果。
让我们来转换这个JSX代码吧:
你好,世界!
换句话说,实际上,JSX 在内部也被转换成调用 React 提供的类似 createElement 函数的形式。换句话说,JSX 只是一种方便的写法,它是对 JavaScript 的扩展。
根据参考资料,从React 17开始似乎不再使用上述的转换方法。如果在Babel网站上以新的转换方式尝试,将”React Runtime”设置为”Automatic”,您可以确认其具体形式如何。
JSX作为一个对象
接下来,让我们确认一下JSX是一个对象。
我们按照刚才的方式编辑App.js。
将JSX存储在变量中,并将该变量返回。
同时,我们还将变量的类型和变量本身输出到控制台。
import logo from './logo.svg';
import './App.css';
function App() {
const obj = (<h1>Hello World!</h1>);
console.log(typeof(obj));
console.log(obj);
return obj;
}
export default App;
需要关注的是props和type。
type属性设置为”h1″,
props属性设置为”children: ‘你好,世界!'”。
可以看出,传递的
Hello World!
作为JSX,实际上在内部处理中被转换成了上述的对象。
补充一下,没有任何说明
const obj = (
Hello World!
);
但是,由于JSX是对象,所以可以轻松地将其存储在变量中。
通过返回这个变量obj,可以实现与在return语句中编写JSX相同的行为。
使用JSX
我认为你已经理解了JSX是什么。那么,现在让我们开始学习如何使用JSX来编写标记。
为此,必须牢记三个规则。
1. 路由标签只需要一个
假设有以下的HTML标签(仅摘录body标签内部)。
在正常的HTML情况下,可以正常地显示在屏幕上。
※可以从以下网站确认其正确运行。 liveweave
<h1>title1</h1>
<h2>title3</h2>
<h3>title3</h3>
让我们用JSX来编写这个。
我将把它转录到App.js中。
import logo from './logo.svg';
import './App.css';
function App() {
return (
<h1>title1</h1>
<h2>title3</h2>
<h3>title3</h3>
);
}
export default App;
如果要修改之前的App.js文件,
function App() {
return (
<div>
<h1>title1</h1>
<h2>title3</h2>
<h3>title3</h3>
</div>
);
}
这里是一个选项:我们约定根标签只能是
标签,并且可以设置其他标签作为它的子元素。
在此,也可以这样写。
function App() {
return (
<>
<h1>title1</h1>
<h2>title3</h2>
<h3>title3</h3>
</>
);
}
这被称为片段。
你也可以写作…,但一般来说,更常见的是用空标签来代替。
使用片段,您可以将多个元素组合在一起,而不会对HTML的内容产生影响。
2. 一定要闭合标签
有些情况下,在HTML标签中可以省略结束标签。
<ul>
<li>apple
<li>banana
<li>cherry
</ul>
<input type='text'>
可以省略标签的闭合标签。
此外,标签本身就没有闭合标签。
让我们将它们写成JSX。
function App() {
return (
<ul>
<li>apple
<li>banana
<li>cherry
</ul>
);
}
function App() {
return (
<input type='text'>
);
}
这些结果最终都会变成错误。
function App() {
return (
<>
<ul>
<li>apple</li>
<li>banana</li>
<li>cherry</li>
</ul>
<input type='text' />
</>
);
}
关于像``标签这样本来没有闭合标签的情况,可以通过在末尾加上斜杠来表示已经闭合了。
※在HTML中,也可以在末尾加上斜杠,它可以正确显示。
3. 属性名称要使用驼峰命名法
HTML标签具有常见的属性,如id和class,以及事件处理程序属性,例如onclick。
<input id="input_form" class="required">
<button onclick="(()=>alert('clicked'))();">click me!</button>
我会先把它作为JSX原样写下来,进行试验。
function App() {
return (
<>
<input id="input_form" class="required" />
<button onclick="(()=>alert('clicked'))();">click me!</button>
</>
);
}
首先,在JavaScript中,class是一个保留词,无法使用class关键字。
JSX是一个JavaScript对象,在转换成对象的过程中,属性被设定为键。
由于保留词无法作为键使用,所以会报错。
如果您想要设置class属性,可以使用className作为替代。
另外,onclick属性也出现了错误。
这是因为在React中,许多属性都是以驼峰命名法准备的。
因此,请确保在属性中使用驼峰命名法,包括刚才确认过的className。
正确记录如下所示。
function App() {
return (
<>
<input id="input_form" className="required" />
<button onClick={() => alert('clicked')}>click me!</button>
</>
);
}
※在中括号中的部分与上一个例子稍有不同。关于这种写法,我们会在下次或以后进行解释。
总结
我确认了JSX中的细节以及编写标记的规则。现在,我们应该能够创建一个简单的网页。
以上是一种可能的翻译,也可根据具体语境进行微调。
不过,单凭这些还远远不能完全理解React的功能。
下一篇文章将介绍如何在JSX中使用JavaScript变量。
点击这里查看第三部分
(下一篇文章正在努力创作中。)
请提供您参考的网站。
-
- REACTを学ぶ-JSX でマークアップを記述する
-
- kinsta – Reactで使用するJSXの基本をわかりやすく解説
-
- Zen – React17におけるJSXの新しい変換を理解する
- 【2023年最新】React(v18)完全入門ガイド|Hooks、Next.js、Redux、TypeScript