为了账号安全,请及时绑定邮箱和手机立即绑定

React18教程:从零开始的React 18全面入门

概述

本文介绍了如何从零开始构建React应用,涵盖安装和配置开发环境、理解JSX语法和组件概念、管理组件生命周期、使用React Router进行路由和导航、利用Context API和Redux进行状态管理以及部署应用的最佳实践。

React 18简介

React 是一个用于构建用户界面的开源 JavaScript 库,由 Facebook 开发并维护。它最初在 2011 年由 Jordan Walke 发布,最初是作为 Facebook 内部的一个实验项目,后来在 2013 年开源并逐渐成为前端开发中最受欢迎的库之一。

React的发展历程

React 的发展可以分为几个主要阶段:

  • 2011 年:React 最初在 Facebook 内部使用,作为 UI 组件的实验性项目。
  • 2013 年:React 正式开源,被更多开发者关注和使用。
  • 2015 年:React 发布了 0.13 版本,引入了 JSX 语法,使得组件编写更加直观。
  • 2016 年:React 15 版本引入了 Context API,可以管理组件之间的状态传递。
  • 2017 年:React 16 版本引入了错误边界和更高效的 DOM 更新机制。
  • 2018 年:React 16.8 版本引入了 Hooks API,使得函数组件具备状态管理能力。
  • 2022 年:React 18 发布,引入了更多的优化和新特性,如并发模式、成批更新等。

React 18的新特性

React 18 引入了一些重要的新特性,包括并发模式、成批更新等,这些特性大大提升了 React 应用的性能和用户体验。

  • 并发模式(Concurrent Mode):允许 React 应用在不打断用户体验的情况下进行更新,支持更快的页面加载和动态内容加载。
  • 成批更新(Batched Updates):将多个更新操作合并成一个批量操作,减少不必要的重新渲染,提高应用性能,减少不必要的计算和渲染。
  • useDeferredValue:一个新的 Hook,可以延迟计算某些状态的值,直到 DOM 更新完成后再计算,从而避免不必要的重新渲染,特别适用于大型状态计算的场景。
  • 自定义 Hooks:提供了更多的 Hook,如 useIduseTransition,使组件开发更加灵活和高效。

安装和配置React开发环境

要开始使用 React,首先需要安装 Node.js,因为 React 使用了 JavaScript 生态系统中的许多工具。以下是安装和配置 React 开发环境的步骤:

  1. 安装 Node.js

    • 访问 Node.js 官方网站 并下载最新版本的 Node.js。
    • 安装完成后,可以通过命令行检查 Node.js 和 npm(Node.js 的包管理器)是否安装成功:
      node -v
      npm -v
  2. 创建 React 项目

    • 使用 create-react-app 创建一个新的 React 项目。
    • 安装 create-react-app
      npm install -g create-react-app
    • 创建一个新的 React 项目:
      npx create-react-app my-app
      cd my-app
      npm start
    • 上述命令会在本地创建一个名为 my-app 的 React 项目,并启动开发服务器。开发服务器会在 http://localhost:3000 上运行。
  3. 安装和配置其他工具
    • 为了方便开发和调试,可以安装一些额外的工具,如 eslintprettier
    • 安装 eslintprettier
      npm install --save-dev eslint prettier
    • 配置 eslintprettier,可以参考官方文档和配置文件来完成。

通过以上步骤,你已经成功创建了一个 React 开发环境,可以开始编写和测试 React 组件了。

React基础概念

React 是一个用于构建用户界面的库,它的核心概念包括 JSX 语法、组件的定义与使用、状态(State)和属性(Props)。这些概念是学习 React 的基础,通过理解这些概念,可以更好地利用 React 开发复杂的用户界面。

JSX语法

JSX 是 JavaScript 的一个扩展语法,主要用于编写 React 组件中的 HTML 样式代码。JSX 使得组件的结构更加直观,可以更方便地在 JavaScript 代码中嵌入 HTML 标签。

  1. 基本语法

    • JSX 类似于 HTML,但可以在其中使用 JavaScript 表达式:
      const element = <h1>Hello, world!</h1>;
    • 也可以使用大括号 {} 来插入 JavaScript 表达式:
      const name = 'React';
      const element = <h1>Hello, {name}!</h1>;
  2. 属性和事件

    • 可以像 HTML 一样设置属性,如 classid 等:
      const element = <h1 id="title">Hello, world!</h1>;
    • 可以绑定事件处理器,如 onClick
      const element = <button onClick={handleClick}>Click me</button>;
  3. 条件渲染和循环
    • 可以使用条件渲染来在组件中动态生成内容:
      const isLogged = true;
      const element = isLogged ? <h1>Welcome!</h1> : <h1>Please log in.</h1>;
    • 可以使用数组和循环来生成可变数量的元素:
      const listItems = ['Apple', 'Banana', 'Orange'].map((fruit) => (
      <li>{fruit}</li>
      ));
      const element = <ul>{listItems}</ul>;

通过 JSX 语法,可以更方便地在 React 组件中定义和操作 HTML 元素。

组件的定义与使用

React 组件是可重用的用户界面构建块,可以封装不同的 UI 逻辑。React 组件分为两类:函数组件和类组件。函数组件是最推荐的方式,而类组件则提供更丰富的功能,如生命周期方法。

  1. 函数组件

    • 函数组件是最简单的组件类型,它接受一个 props 参数并返回一个元素:
      function Welcome(props) {
      return <h1>Hello, {props.name}</h1>;
      }
    • 函数组件可以嵌套和组合,形成复杂的组件结构:
      function WelcomeMessage(props) {
      return (
       <div>
         <Welcome name="Sara" />
         <Welcome name="Cahal" />
         <Welcome name="Edite" />
       </div>
      );
      }
  2. 类组件
    • 类组件通过继承 React.Component 类来定义,可以拥有更复杂的逻辑:
      class WelcomeMessage extends React.Component {
      render() {
       return <h1>Hello, {this.props.name}</h1>;
      }
      }
    • 类组件可以通过 this.props 访问属性,并通过 this.state 管理状态。

状态(State)和属性(Props)

状态和属性是组件之间传递数据的两种方式,状态是组件内部的数据,而属性是组件之间的数据传递。

  1. 状态(State)

    • 组件可以通过 this.state 来管理内部状态:

      class Counter extends React.Component {
      constructor(props) {
       super(props);
       this.state = { count: 0 };
      }
      
      componentDidMount() {
       this.timer = setInterval(() => {
         this.setState((prevState) => ({ count: prevState.count + 1 }));
       }, 1000);
      }
      
      componentWillUnmount() {
       clearInterval(this.timer);
      }
      
      render() {
       return <h1>{this.state.count}</h1>;
      }
      }
    • 使用 Hooks 时,可以通过 useState Hook 来管理状态:

      import { useState, useEffect } from 'react';
      
      function Counter() {
      const [count, setCount] = useState(0);
      
      useEffect(() => {
       const tick = setInterval(() => {
         setCount((prevCount) => prevCount + 1);
       }, 1000);
      
       return () => clearInterval(tick);
      }, []);
      
      return <h1>{count}</h1>;
      }
  2. 属性(Props)

    • 组件可以通过 props 接收外部传递的数据:

      function Welcome(props) {
      return <h1>Hello, {props.name}</h1>;
      }
      
      function App() {
      return <Welcome name="World" />;
      }
    • 可以通过 this.props 访问类组件的属性:
      class WelcomeMessage extends React.Component {
      render() {
       return <h1>Hello, {this.props.name}</h1>;
      }
      }

通过状态和属性,可以实现组件之间的数据传递和状态管理。

React生命周期方法

React 组件的生命周期分为三个阶段:挂载(Mounting)、更新(Updating)、卸载(Unmounting)。每个阶段都有特定的方法可以控制组件的行为。在 React 18 中,生命周期方法有一些变化。

组件的生命周期介绍

React 组件的生命周期分为几个关键阶段:

  • 挂载(Mounting)

    • 组件从创建到首次渲染的过程。
    • constructor 方法:在组件实例化时调用,用于初始化组件的状态。
    • componentDidMount 方法:在组件挂载完成后调用,通常用于执行异步操作或设置事件监听器。
  • 更新(Updating)

    • 组件状态或属性发生变化时,重新渲染的过程。
    • componentWillReceiveProps 方法:在组件接收到新的属性时调用(在 React 16.3 之后被废弃)。
    • shouldComponentUpdate 方法:决定组件是否需要更新的时机。
    • componentWillUpdate 方法:在组件更新前调用(在 React 16.3 之后被废弃)。
    • componentDidUpdate 方法:在组件更新完成后调用,用于执行更新后的操作。
  • 卸载(Unmounting)
    • 组件从 DOM 中删除的过程。
    • componentWillUnmount 方法:在组件卸载前调用,通常用于清理资源或事件监听器。

React 18中的生命周期方法变化

React 18 中引入了一些新的生命周期方法和优化,简化了组件的生命周期管理。

  • 新的生命周期方法

    • getDerivedStateFromProps:在 React 16.3 中引入,用于在组件接收到新属性时更新状态。
    • getSnapshotBeforeUpdate:在组件更新前获取 DOM 状态,返回值可以传递给 componentDidUpdate 方法。
  • 废弃的方法
    • componentWillMountcomponentWillReceivePropscomponentWillUpdate:这些方法在 React 16.3 后被废弃,取而代之的是 getDerivedStateFromPropsgetSnapshotBeforeUpdate
    • componentWillUnmount:虽然没有被废弃,但在大多数情况下,通过在 useEffect Hook 中清理资源即可。

如何管理组件的生命周期

管理组件的生命周期通常涉及以下几个步骤:

  1. 初始化组件状态

    • constructor 方法中初始化组件状态。
    • 使用 useState Hook 初始化状态。
      class MyComponent extends React.Component {
      constructor(props) {
       super(props);
       this.state = { count: 0 };
      }
      }
  2. 执行挂载操作

    • componentDidMount 方法中执行异步操作,如设置定时器或请求数据。
      componentDidMount() {
      this.timer = setInterval(() => {
       this.setState((prevState) => ({ count: prevState.count + 1 }));
      }, 1000);
      }
  3. 决定是否更新组件

    • shouldComponentUpdate 方法中决定组件是否需要更新。
    • 使用 useEffect Hook 监听状态变化。
      shouldComponentUpdate(nextProps, nextState) {
      return nextState.count > 10;
      }
  4. 执行更新操作

    • componentDidUpdate 方法中执行更新后的操作,如修改 DOM 状态。
      componentDidUpdate(prevProps, prevState) {
      if (prevState.count !== this.state.count) {
       console.log(`Count updated: ${this.state.count}`);
      }
      }
  5. 清理组件资源
    • componentWillUnmount 方法中清理资源,如清除定时器或关闭事件监听器。
    • 使用 useEffect Hook 清理副作用。
      componentWillUnmount() {
      clearInterval(this.timer);
      }

通过合理管理组件的生命周期,可以确保组件在不同阶段执行正确的操作,保持应用的性能和稳定性。

路由和导航

在大型的 React 应用中,路由和导航是必不可少的功能,它们使得应用的各个部分可以按需加载和导航。React Router 是最流行的 React 路由库之一,提供了强大的路由和导航功能。

React Router简介

React Router 是一个 React 的路由库,用于处理 Web 应用中的 URL 路由。它允许你通过 URL 地址来动态地加载不同的页面或组件。React Router 由 React 社区维护,是构建单页面应用(SPA)的首选库。

  1. 安装 React Router

    • 使用 npm 或 yarn 安装 React Router:
      npm install react-router-dom
    • 导入 React Router 中需要的模块:
      import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
  2. 基础路由配置

    • 使用 <Routes><Route> 组件来定义应用的路由:

      import React from 'react';
      import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
      import Home from './Home';
      import About from './About';
      
      function App() {
      return (
       <Router>
         <Routes>
           <Route path="/" element={<Home />} />
           <Route path="/about" element={<About />} />
         </Routes>
       </Router>
      );
      }
      
      export default App;
  3. 动态路由
    • 使用 :id 参数来定义动态路由:
      <Route path="/user/:userId" element={<User />} />

路由配置和使用

在 React Router 中,可以通过配置不同的路由来实现页面的导航和动态加载。

  1. 静态路由

    • 使用 <Route> 组件来定义静态路由:
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
  2. 动态路由

    • 使用参数化路径来定义动态路由:
      <Route path="/user/:userId" element={<User />} />
    • 在组件中访问路径参数:
      function User({ match }) {
      const { userId } = match.params;
      return <div>User ID: {userId}</div>;
      }
  3. 嵌套路由
    • 使用嵌套路由来定义复杂的路由层次结构:
      <Route path="/admin" element={<Admin />}>
      <Route path="dashboard" element={<Dashboard />} />
      <Route path="settings" element={<Settings />} />
      </Route>

页面导航和链接的实现

在 React Router 中,可以通过 <NavLink> 组件来实现页面导航和链接。

  1. 简单导航链接

    • 使用 <NavLink> 组件来实现简单的导航链接:

      import { NavLink } from 'react-router-dom';
      
      <NavLink to="/">Home</NavLink>
      <NavLink to="/about">About</NavLink>
  2. 带属性的导航链接
    • 可以添加属性来控制导航链接的样式和行为:
      <NavLink to="/about" activeStyle={{ color: 'red' }}>
      About
      </NavLink>

通过使用 React Router,可以轻松实现复杂的路由和导航逻辑,使得应用的结构更加清晰和灵活。

状态管理和数据流

在大型的 React 应用中,状态管理和数据流是至关重要的。React 提供了多种方式来管理状态和数据流,包括 Context API、Redux 等。这些工具可以帮助你更好地管理和传递应用中的状态。

状态管理的几种方式

  1. 简单的状态管理

    • 使用 useState Hook 来管理函数组件的状态:

      import { useState } from 'react';
      
      function Counter() {
      const [count, setCount] = useState(0);
      
      return (
       <div>
         <p>Count: {count}</p>
         <button onClick={() => setCount(count + 1)}>Increment</button>
       </div>
      );
      }
  2. Context API

    • 使用 Context API 来管理全局状态:

      import React, { createContext, useContext } from 'react';
      
      const ThemeContext = createContext('light');
      
      function App() {
      const theme = useContext(ThemeContext);
      return (
       <ThemeContext.Provider value="dark">
         <Toolbar />
       </ThemeContext.Provider>
      );
      }
      
      function Toolbar() {
      const theme = useContext(ThemeContext);
      return <h1>Theme is {theme}</h1>;
      }
  3. Redux

    • 使用 Redux 来实现全局状态管理:

      import React from 'react';
      import { Provider } from 'react-redux';
      import { createStore } from 'redux';
      
      // 简单的 Redux reducer
      const initialState = { count: 0 };
      const reducer = (state = initialState, action) => {
      switch (action.type) {
       case 'INCREMENT':
         return { ...state, count: state.count + 1 };
       default:
         return state;
      }
      };
      
      const store = createStore(reducer);
      
      function Counter() {
      const count = store.getState().count;
      return (
       <div>
         <p>Count: {count}</p>
         <button onClick={() => store.dispatch({ type: 'INCREMENT' })}>
           Increment
         </button>
       </div>
      );
      }
      
      function App() {
      return (
       <Provider store={store}>
         <Counter />
       </Provider>
      );
      }

使用Context API管理全局状态

React Context API 是 React 中用来管理全局状态的一种方式。通过 Context API,可以在组件树的任意深度传递数据,而不需要手动让每个组件都传递 props。

  1. 定义 Context

    • 使用 createContext 创建一个 Context:

      import React, { createContext } from 'react';
      
      const ThemeContext = createContext('light');
    • 在组件中使用 Provider 提供 Context 值:
      function App() {
      return (
       <ThemeContext.Provider value="dark">
         <Toolbar />
       </ThemeContext.Provider>
      );
      }
  2. 消费 Context

    • 使用 useContext Hook 消费 Context 值:

      import React, { useContext } from 'react';
      import { ThemeContext } from './App';
      
      function Toolbar() {
      const theme = useContext(ThemeContext);
      return <h1>Theme is {theme}</h1>;
      }

通过 Context API,可以实现全局状态的传递和管理,使得状态传递变得更加灵活和简单。

Redux简介及其基本使用

Redux 是一个用于管理应用状态的库,它提供了一个单一的数据源来管理应用的状态。Redux 的核心概念包括 store、reducer、action 和 middleware。

  1. 安装 Redux

    • 使用 npm 或 yarn 安装 Redux:
      npm install redux react-redux
  2. 创建 Store

    • 使用 createStore 方法创建一个 store:

      import { createStore } from 'redux';
      import rootReducer from './reducers';
      
      const store = createStore(rootReducer);
  3. 定义 Reducer

    • 定义一个 reducer 来处理 action 并更新状态:

      const initialState = { count: 0 };
      
      const counterReducer = (state = initialState, action) => {
      switch (action.type) {
       case 'INCREMENT':
         return { ...state, count: state.count + 1 };
       default:
         return state;
      }
      };
  4. 定义 Action

    • 定义一个 action,用于触发状态更新:
      const incrementAction = () => ({ type: 'INCREMENT' });
  5. 使用 Store

    • 使用 Provider 来提供 store:

      import React from 'react';
      import { Provider } from 'react-redux';
      import store from './store';
      import App from './App';
      
      function ReduxApp() {
      return (
       <Provider store={store}>
         <App />
       </Provider>
      );
      }
      
      export default ReduxApp;
  6. 在组件中使用 Redux

    • 使用 useSelectoruseDispatch 来访问和更新状态:

      import React from 'react';
      import { useSelector, useDispatch } from 'react-redux';
      import { incrementAction } from './actions';
      
      function Counter() {
      const count = useSelector(state => state.count);
      const dispatch = useDispatch();
      
      return (
       <div>
         <p>Count: {count}</p>
         <button onClick={() => dispatch(incrementAction())}>
           Increment
         </button>
       </div>
      );
      }
      
      export default Counter;

通过使用 Redux,可以实现更复杂的状态管理,确保状态的统一性和可维护性。

部署与最佳实践

在开发完 React 应用后,下一步是将其部署到生产环境。部署过程涉及项目构建、代码规范、性能优化和调试技巧等多个方面。通过遵循最佳实践,可以确保应用的稳定性和性能。

项目构建与部署

在部署 React 应用之前,需要先将应用构建为生产版本。构建过程通常包括压缩代码、优化资源和生成静态文件。

  1. 构建应用

    • 使用 npm run build 命令构建生产版本:
      npm run build
    • 构建后的应用会被保存在 build 目录下,包括所有静态文件和优化后的代码。
  2. 部署到服务器
    • 可以将 build 目录下的文件部署到服务器或云服务。
    • 例如,使用 AWS S3 或 Netlify 等服务来托管静态网站。

代码规范与最佳实践

为了保证代码质量和可维护性,遵循一些代码规范和最佳实践是非常重要的。

  1. 代码规范

    • 使用 eslintprettier 等工具来格式化和检查代码。
    • 遵循 React 的官方代码风格指南。
    • 编写清晰、简洁且有注释的代码。
  2. 模块化和可重用性

    • 将代码拆分成多个可重用的组件。
    • 使用 importexport 来组织代码结构。
    • 避免在组件中使用全局变量和全局状态。
  3. 测试
    • 编写单元测试和集成测试来确保代码的正确性。
    • 使用 jestreact-testing-library 等工具进行测试。
    • 编写测试覆盖率报告,确保代码质量。

性能优化和调试技巧

为了提升应用的性能和用户体验,可以采取一些性能优化和调试技巧。

  1. 性能优化

    • 使用 useMemouseCallback Hook 来优化组件的渲染。
    • 使用 React.memoPureComponent 来防止不必要的重新渲染。
    • 避免在组件中进行复杂的计算和逻辑处理。
  2. 调试技巧
    • 使用 console.logconsole.error 来记录调试信息。
    • 使用 Chrome DevTools 的 React 选项来检查组件的渲染情况。
    • 在开发环境中使用 process.env.NODE_ENV 来控制调试信息的输出。

通过遵循这些最佳实践,可以确保 React 应用在部署后具有良好的性能和用户体验。

总结

通过本教程的学习,你已经掌握了从零开始构建一个完整的 React 18 应用的所有必要知识,包括安装和配置 React 开发环境、理解 JSX 语法和组件的基本概念、管理组件的生命周期、使用 React Router 进行路由和导航、利用 Context API 和 Redux 进行状态管理、以及部署应用的最佳实践。希望这些内容能够帮助你更好地理解和使用 React,构建出高效、优雅的前端应用。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消