React入门- 为什么要使用React?
首先
我在接触React已经大约一年时间了,React本身也有了很大的变化。这次,我希望让大家了解React的优点,所以我决定写这篇文章。
另外,第二个目标是重新整理我自己对React的知识。我希望能够分几次将制作一个应用程序的过程总结成一篇文章。
我的状态如下所示
-
- React・Next.jsを使って簡単なアプリを作ったことがある
- アルバイトでSpringを使ったwebアプリの開発をしている(フロントはjQueryゴリゴリ)
在我遇到React并开始使用它的过程中
大致意思: 由于在使用 jQuery 时经历了困难,所以我转向了 React 寻求解救。
我之前主要使用jQuery,基本上没有什么问题,但随着页面项目的增多和动画效果变得更丰富,我开始感到实现的困难和维护性的局限。然后我偶然发现了React。然而,即使我进行了调查,也不明白它是什么东西,比如“作为MVC中的视图框架”、“虚拟DOM”等等,都让我感到摸不着头脑。但实际使用之后,我发现它是一个非常简单的框架/库,它解决了我的烦恼。由于我本来就喜欢JavaScript,所以它非常容易上手。
“React” 是什么?
公式文档中如下介绍。
一个用于构建用户界面的JavaScript库。
因为仅凭这些并无法理解,所以我打算通过介绍主要功能的说明和实例来进行介绍。
为什么使用React有哪些优点?
从官方文件的首页也可以找到摘录。
-
- 宣言式视图
- 基于组件的设计
还有一个选项是「一次学习,随处书写」,但我们可以暂时忽略这个。
声明性的视图
首先,“宣言性”是什么?我们在使用React进行实现时所实现的是“在某种状态下应该显示什么”。我们只需要简单地声明“在这个位置显示这个值”,“在这种情况下显示那个”,就可以了。
然后,需要按照该声明高效地更新UI(操作DOM)。
在这种情况下,虚拟DOM出现了。虚拟DOM采用与常规DOM相同的树状结构。
当虚拟DOM重新构建时,只有差异被应用于实际的DOM,类似这样。
用服务器端渲染(SSR)和模板引擎生成HTML的方式,构建虚拟DOM非常类似。在使用SSR进行渲染时,没有记忆到过出现界面数值不一致的情况,因此没有办法不使用虚拟DOM来采用接近这种方式。
此外,由于只对需要更新的DOM进行更新,所以性能比一些普通的纯JS要提升。
基于组件的 (Component-Based)
使用React时,我们通过将UI的状态、外观和动画分解为组件来进行处理。从简单的输入框到整个页面,我们将所有内容都视为组件。通过组合组件来构建UI。
通过分解,我们可以实现可重用性,并产生整体外观的一致性。
组件会管理自身的状态,并定义其外观和行为。因此,不再将状态放置在DOM中。DOM中的值可以从任何地方进行更改,但组件的状态具有有限的访问范围,因此状态转换更容易追踪。
我试着写一下React。
我们在思考一个显示九九乘法表的应用程序。
-
- 请输入您想要显示的九九乘法表的乘法段数。
- 显示已输入的乘法段的九九乘法表。
如果是使用jQuery的情况下
在使用React之前,我会先展示使用jQuery的实现作为比较。
查看CodePen上nabekou(@nabekou29)的kuku_jQuery笔记。
在data属性中存储值,并在输入值时,动态修改带有data属性的td标签的文本。
如果是React的情况
这是使用React实现的。为了更容易解释,我用了TypeScript来编写。
请到 CodePen 上查看 nabekou 的 kuku_React 代码。
说明
const App: React.FunctionComponent<{defaultValue: number}> = ({defaultValue}) => {...}
这个函数是一个组件。(也可以用Class来定义。)
可以接收属性作为参数。
const [num1, setNum1] = React.useState(defaultValue);
通过使用React.useState,可以在此组件中存储状态。
num1是状态,setNum1是用于更新num1的函数。通过使用setNum1来更新值,向React通知值已经发生变化。
return (
<div>
<input type="number" value={num1} onChange={handleNum1Change} />の段
<table>
<tbody>
<tr><th>1</th><td>{1 * num1}</td></tr>
{/* 省略... */}
</tbody>
</table>
</div>
);
在函数组件中,我们通过返回React元素来构建组件。可以使用JSX来创建React元素。编译后会将函数转换为创建React元素的代码(可以在CodePen的“View Compiled”按钮上查看)。
这种类似HTML的写法就是JSX。尽管它只是看起来像HTML,但实际上存在一些本来不存在的属性或部分属性名称发生了变化。在JSX中可以使用{}来包裹JavaScript代码。当然,在这个JavaScript代码中也可以写JSX。
const handleNum1Change = (event: React.ChangeEvent<HTMLInputElement>) => {
setNum1(Number(event.target.value));
}
当输入值时,将更新num1。通过使用setNum1进行更新,表中的值将被更新。
ReactDOM.render(
<App defaultValue={1}/>,
document.getElementById('app')
);
正在将React元素渲染到#app中。
顺便提一下
<table>
<tbody>
<tr><th>1</th><td>{1 * num1}</td></tr>
<tr><th>2</th><td>{2 * num1}</td></tr>
<tr><th>3</th><td>{3 * num1}</td></tr>
...
<tr><th>9</th><td>{9 * num1}</td></tr>
</tbody>
</table>
虽然我是以HTML的形式编写的,但可以使用数组以如下方式进行编写。
<table>
<tbody>
{
[1, 2, 3, 4, 5, 6, 7, 8, 9].map(num2 => (
<tr key={num2}><th>{num2}</th><td>{num1 * num2}</td></tr>
))
}
</tbody>
</table>
试一试比较
-
- 声明型视图
- 基于组件的
我打算意识到上述两点并开始比较。
在表明的角度来看?
我认为特别是
{num1 * num2}
这一部分变得非常易懂。这使得表格中所显示的内容更加明确。
此外,更新变得非常简便。在使用jQuery时,需要访问每个td元素进行计算和更新,而在React中,只需要更新num1,表格的值就会自动更新。
从组件角度来看?
通过外观和动作的统一,我们能够立即看出状态的变化是如何进行的,以及它们所产生的作用。不再需要在JS和HTML之间来回切换。此外,我们也不再需要写奇怪的选择器了。如果要进行紧密耦合,我认为这种方式更容易理解。
结束
我觉得React被认为是学习成本很高的,但实际上需要记住的东西非常少。只是对JavaScript的知识要求相对较高,可能这是困难所在。随着Hooks的出现,编写React也变得更加简单了,所以我希望继续在周围宣传它。接下来,我计划谈一些更多关于实现的内容。
请参阅
为什么使用React后不再需要jQuery?
选择React还是Vue?
应对前端组件设计问题。