您知道学习新语言或框架是什么感觉。有时会有很棒的文档来帮助您找到前进的方向。但即使是最完善的文档也无法涵盖所有内容。当您使用新事物时,您一定会遇到没有书面解决方案的问题。
我第一次创建 React 项目时就是这样——React 是拥有出色文档的框架之一,尤其是在现在有了 beta 文档之后。但我仍然艰难地完成了它。距离那个项目已经有一段时间了,但我从中吸取的教训仍然历历在目。尽管市面上有很多 React 的“入门”教程,但我还是想分享一下我第一次使用它时希望自己知道的知识。
因此,这篇文章就是——我早期犯的一些错误的列表。我希望它们能帮助您更轻松地学习 React。
使用 create-react-app 启动项目
TL;DR 使用 Vite 或 Parcel。
Create React App (CRA) 是一款帮助您设置新 React 项目的工具。它创建了一个开发环境,其中包含大多数 React 项目的最佳配置选项。这意味着您不必浪费时间自行配置任何内容。
作为初学者,这似乎是一个很棒的开始方式!无需配置!直接开始编码!
CRA 使用两个流行的包来实现这一点,webpack 和 Babel。webpack 是一个 Web 捆绑器,用于优化项目中的所有资产,例如 JavaScript、CSS 和图像。Babel 是一种工具,允许您使用较新的 JavaScript 功能,即使有些浏览器不支持这些功能。
两者都很好,但有一些更新的工具可以更好地完成这项工作,特别是 Vite 和 Speedy Web Compiler (SWC)。
这些全新改进的替代方案比 webpack 和 Babel 更快,配置也更简单。这使得调整配置变得更容易,而 create-react-app 在不弹出(eject)的情况下难以做到这一点。
要在这两种情况下设置新 React 项目时都使用它们,您必须确保已安装 Node 版本 12 或更高版本,然后运行以下命令。
npm create vite
您将被要求为项目选择一个名称。完成此操作后,从框架列表中选择 React。之后,您可以选择 Javascript + SWC
或 Typescript + SWC
然后您需要更改目录 cd
到您的项目并运行以下命令;
npm i && npm run dev
这将为您的站点运行一个开发服务器,URL 为 localhost:5173
就这么简单。
将 Vite 添加到现有 Web 应用程序
使用 VitePWA 插件使网站离线工作
Parcel CSS:一种新的 CSS 解析器、转换器和压缩器
使用 Parcel 作为 React 应用程序的捆绑器
defaultProps
设置默认值
使用 TL;DR 使用默认函数参数代替。
数据可以通过称为 props
的内容传递给 React 组件。这些就像 HTML 元素中的属性一样添加到组件中,并且可以通过从作为参数传入的 prop 对象中获取相关值,在组件的定义中使用。
// App.jsx
export default function App() {
return <Card title="Hello" description="world" />
}
// Card.jsx
function Card(props) {
return (
<div>
<h1>{props.title}</h1>
<p>{props.description}</p>
</div>
);
}
export default Card;
如果 prop
始终需要一个默认值,可以使用 defaultProp
属性
// Card.jsx
function Card(props) {
// ...
}
Card.defaultProps = {
title: 'Default title',
description: 'Desc',
};
export default Card;
使用现代 JavaScript,可以在函数参数中解构 props
对象并为其分配一个默认值。
// Card.jsx
function Card({title = "Default title", description= "Desc"}) {
return (
<div>
<h1>{title}</h1>
<p>{description}</p>
</div>
)
}
export default Card;
这是更可取的方法,因为现代浏览器可以读取该代码,而无需额外的转换。
不幸的是,defaultProps
需要一些转换才能被浏览器读取,因为 JSX(JavaScript XML)不是开箱即用的。这可能会影响使用大量 defaultProps
的应用程序的性能。
propTypes
不要使用TL;DR 使用 TypeScript。
在 React 中,propTypes
属性可以用来检查组件是否传递了正确的 props 数据类型。它们允许您指定每个 prop 应该使用的数据类型,例如字符串、数字、对象等。它们还允许您指定 prop 是否是必需的。
这样,如果组件传递了错误的数据类型,或者没有提供必需的 prop,React 就会抛出一个错误。
// Card.jsx
import { PropTypes } from "prop-types";
function Card(props) {
// ...
}
Card.propTypes = {
title: PropTypes.string.isRequired,
description: PropTypes.string,
};
export default Card;
TypeScript 为传递给组件的数据提供了一定程度的类型安全。所以,当然,propTypes
在我刚开始的时候是个好主意。但是,现在 TypeScript 已经成为类型安全的首选方案,我强烈建议您使用它而不是其他任何东西。
// Card.tsx
interface CardProps {
title: string,
description?: string,
}
export default function Card(props: CardProps) {
// ...
}
TypeScript 是一种编程语言,它建立在 JavaScript 之上,并添加了静态类型检查。TypeScript 提供了更强大的类型系统,可以捕获更多潜在的错误并改善开发体验。
使用类组件
TL;DR: 将组件编写为函数
React 中的类组件使用 JavaScript 类创建。它们具有更面向对象的结构,以及一些额外的特性,例如使用this
关键字和生命周期方法的能力。
// Card.jsx
class Card extends React.Component {
render() {
return (
<div>
<h1>{this.props.title}</h1>
<p>{this.props.description}</p>
</div>
)
}
}
export default Card;
我更喜欢用类而不是函数来编写组件,但是 JavaScript 类对于初学者来说更难理解,而且this
可能会非常令人困惑。相反,我建议将组件编写为函数
// Card.jsx
function Card(props) {
return (
<div>
<h1>{props.title}</h1>
<p>{props.description}</p>
</div>
)
}
export default Card;
函数组件只是返回 JSX 的 JavaScript 函数。它们更容易阅读,并且没有this
关键字和生命周期方法等额外特性,这使得它们比类组件更具性能优势。
函数组件还具有使用钩子的优势。 React 钩子 允许您使用状态和其他 React 特性,而无需编写类组件,从而使您的代码更易读、更易维护和更可重用。
不必要地导入 React
TL;DR: 除非您需要钩子,否则不需要这样做。
自从 React 17 于 2020 年发布以来,每次创建组件时,您都不需要在文件顶部导入 React。
import React from 'react'; // Not needed!
export default function Card() {}
但我们必须在 React 17 之前这样做,因为 JSX 转换器(将 JSX 转换为普通 JavaScript 的东西)使用了一种称为React.createElement
的方法,该方法只有在导入 React 时才能工作。从那时起,一个新的转换器已经发布,它可以在没有createElement
方法的情况下转换 JSX。
您仍然需要导入 React 来使用钩子、片段,以及您可能需要的库中的任何其他函数或组件
import { useState } from 'react';
export default function Card() {
const [count, setCount] = useState(0);
// ...
}
这些是我早期的错误!
也许“错误”这个词太严厉了,因为一些更好的做法是后来才出现的。尽管如此,我仍然看到了很多例子,其中“旧”的做事方式仍然在项目和其他教程中被积极使用。
说实话,我刚开始的时候可能犯的错误远远不止五种。无论何时您使用新工具,它都更像是一个学习过程,以便有效地使用它,而不是翻动开关。但这些是我多年后仍然铭记在心的事情!
如果您已经使用 React 一段时间了,您希望在开始之前就知道哪些东西?收集一些信息来帮助其他人避免同样的困扰将是一件很棒的事情。
非常感谢,我刚开始我的第一个小型 React 项目,我自己只解决了其中的两个问题,您为我节省了很多错误。
我不同意类优于函数。我使用类学习了 React,并使用它很多年,但是当函数钩子变得流行时,我测试了它并切换了,现在我不会建议任何人使用类。我更喜欢使用正确的文件组织的多个自定义函数和钩子。
精彩的文章,Richard!您关于开始使用 React 的见解非常宝贵,尤其是对于我们这些 React 新手来说。您关于选择 Vite 或 Parcel 而不是 create-react-app 的观点引起了我的共鸣。使用默认函数参数和 TypeScript 进行类型安全性的现代方法似乎也改变了游戏规则,可以生成更简洁、更高效的代码。我特别感谢您强调函数组件的简单性和性能优势。对于任何希望避免常见陷阱并简化 React 学习曲线的人来说,这篇文章都是一个很棒的资源。感谢您分享您的经验和教训!
当我刚开始的时候,我一直在为无限次重新渲染和 useEffect 挣扎。
我还在使用面向对象语言后开始学习 React,所以当 React 将其基于类的组件更改为函数时,我很难接受,并没有完全接受这种变化。
虽然我现在还不错,但我希望更多地了解将 props 传递给子组件,我认为我总是最终尝试将一些变量传递回其父组件,我很想了解如何处理这些事情。
非常感谢您分享您的文章。
作为一名 React 开发人员,这篇文章非常重要。当有人开始学习 React 时,他们通常会遵循相同的初始步骤。不幸的是,许多开发人员即使在使用过时的技术之后,也没有更新他们的知识。
最近,React 19 发布了许多改进和新钩子,作为 React 开发人员,您绝对应该探索这些内容。