React 基础知识:从入门到实践

React 是一个用于构建用户界面的热门 JavaScript 库。它通过其独特的组件化思想,帮助开发者将复杂的 UI 分解为易于管理和复用的小块。本文将带你回顾 React 的核心概念,并探讨如何将它们应用于实际开发中。


1. 库与框架:React 的定位

JavaScript (Libraries)和框架(Frameworks)都旨在通过提供预构建的代码来加速开发。不过,它们的侧重点不同。

  • 通常专注于解决特定任务,比如操作 DOM、处理事件或管理 AJAX 请求。jQueryReact 都是库的典型例子。你可以像调用工具一样,在需要时使用库的功能。
  • 框架则为构建整个应用程序提供了更完整的结构和一套规则。Angular 就是一个框架,而 Next.js 则是一个基于 React 的元框架(meta-framework),它为 React 项目提供了更全面的解决方案。

2. 单页应用 (SPA)

单页应用(Single Page Applications)是一种网页应用,它只加载一个 HTML 页面,然后通过 JavaScript 动态更新页面内容,而无需重新加载整个页面。

SPA 使用框架来管理应用状态和渲染内容,提供了更流畅的用户体验。但它也有一些挑战:

  • 可访问性:屏幕阅读器可能难以处理动态更新的内容。
  • 书签和分享:用户在应用内导航时,URL 不会改变,这使得书签、回退或分享特定页面变得困难。
  • 初始加载时间:如果应用很大,所有资源都需要在开始时加载,可能导致初始加载较慢。

3. React 组件:应用的基石

组件是 React 应用的基石。它们是可重用的 UI 模块,可以独立地更新和渲染。React 组件本质上是 JavaScript 函数或类,它们返回一个 UI 片段,通常使用 JSX 语法来描述。

JSX 是 JavaScript 的语法扩展,允许你在 JavaScript 代码中编写类似 HTML 的代码,从而更直观地描述 UI 结构。

一个简单的 React 组件示例如下:

function Greeting() {
  const name = 'Anna';
  return <h1>Welcome, {name}!</h1>;}

使用时,你只需将组件当作 HTML 标签调用:<Greeting />


4. 组件的导入与导出

为了提高代码的可维护性,React 组件通常会被拆分到不同的文件中。

  • 导出:使用 export 关键字将组件从一个文件中导出。
    • 例如,在 City.js 文件中:
    function City() {
      return <p>New York</p>;}
    export default City; // 默认导出
    
    你也可以在同一行进行默认导出:
    export default function City() {
      return <p>New York</p>;}
    
  • 导入:使用 import 关键字将组件导入到另一个文件中。
    • 例如,在 App.js 文件中:
    import City from './City';function App() {
      return (
        <div>
          <h1>My favorite city is:</h1>
          <City />
        </div>
      );}
    

5. 项目搭建:使用 Vite

现代前端开发通常使用工具来快速搭建项目。Vite 就是一个流行的项目搭建工具,它可以与 React 很好地配合使用。

要在终端中使用 Vite 创建一个 React 项目,只需运行以下命令:

npm create vite@latest my-react-app -- --template react

项目创建后,进入项目目录并安装依赖:

cd my-react-app
npm install

npm install 命令会在你的项目中创建一个 node_modules 文件夹,其中包含了项目所需的所有库。

最后,运行 npm run dev 即可启动开发服务器,并在浏览器中访问 http://localhost:5173 查看你的应用。


6. Props:组件间的沟通桥梁

在 React 中,props(属性)是父组件向子组件传递数据的唯一方式。这使得组件高度可重用和动态化。

  • 传递 props:在父组件中,将 props 作为 HTML 属性添加到子组件标签上。
    // 父组件
    function Parent() {
      const name = 'Anna';
      return <Child name={name} />;}
    // 子组件
    function Child(props) {
      return <h1>Hello, {props.name}!</h1>;}
    
  • 展开运算符:如果你有许多 props 要传递,可以将它们放入一个对象中,然后使用展开运算符 (...) 一次性传递。
    // 父组件
    function Parent() {
      const person = {
        name: 'Anna',
        age: 25,
        city: 'New York'};
      return <Child {...person} />;}
    

7. 条件渲染:动态 UI 的魔法

条件渲染允许你根据应用状态或条件来显示不同的内容,从而创建动态 UI。

  • 三元运算符:适用于简单的 if/else 条件。
    function Greeting({ isLoggedIn }) {
      return (
        <div>
          {isLoggedIn ? <h1>Welcome back!</h1> : <h1>Please log in</h1>}
        </div>
      );}
    
  • 逻辑与 (&&):当你只想在条件为真时渲染内容,否则渲染空内容时非常有用。
    function Greeting({ user }) {
      return (
        <div>
          {user && <h1>Welcome, {user.name}!</h1>}
        </div>
      );}
    
  • if 语句:最直接的方式,特别适合更复杂的条件逻辑。
    function Greeting({ isLoggedIn }) {
      if (isLoggedIn) {
        return <h1>Welcome back!</h1>;
      }
      return <h1>Please sign in</h1>;}
    

8. 列表渲染:展示数据集合

渲染列表是 React 开发中的常见任务。你可以使用 JavaScript 数组的 map() 方法来迭代一个数组,并为每个项返回一个 JSX 元素。

重要的是,在渲染列表时,要为每个列表项提供一个唯一key prop,这有助于 React 高效地管理和更新列表。

function NameList({ names }) {
  return (
    <ul>
      {names.map((name, index) => (
        <li key={`${name}-${index}`}>{name}</li>
      ))}
    </ul>
  );}

9. 行内样式:直接控制外观

在 React 中,你可以使用行内样式直接在 JSX 元素上应用 CSS,这对于动态样式特别有用。

行内样式不是简单的字符串,而是一个 JavaScript 对象,其键是 CSS 属性的驼峰式命名

  • 直接应用

    function Greeting() {
      return (
        <h1
          style={{ color: 'blue', fontSize: '24px', backgroundColor: 'lightgray' }}
        >
          Hello, world!
        </h1>
      );}
    
  • 动态样式:你可以根据 props 或 state 的值来改变样式。

    function Greeting({ isImportant }) {
      const styles = {
        color: isImportant ? 'red' : 'black',
        fontSize: isImportant ? '24px' : '16px'
      };
    
      return <h1 style={styles}>Hello, world!</h1>;}
    

通过掌握这些基本概念,你就已经踏上了 React 开发之旅。这些构建模块和模式将帮助你创建出功能强大、可维护性高且用户友好的现代 Web 应用。

更多推荐