Jorgen's blog Jorgen's blog
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

jorgen

Love it, make mistakes, learn, keep grinding.
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 微信小程序学习记录
  • WebAssembly
  • Vue.js 从入门到实践:构建现代前端应用
  • React.js-从入门到精通-构建现代用户界面
  • React-从入门到精通-构建现代Web应用
    • 前言
    • React简介
      • 为什么选择React?
    • React基础概念
      • JSX语法
      • 组件与Props
      • State与生命周期
    • React Hooks
      • useState Hook
      • useEffect Hook
      • 自定义Hook
    • React状态管理
      • Context API
      • Redux
    • React Router
    • React性能优化
      • 使用React.memo
      • 使用useMemo和useCallback
      • 代码分割与懒加载
    • React生态系统的其他重要工具
      • Next.js
      • Gatsby
      • React Testing Library
    • 结语
    • 个人建议
  • React-从入门到精通-构建现代前端应用
  • React 开发指南:从入门到精通
  • React框架入门:构建现代用户界面
  • TypeScript:为JavaScript添加类型安全
  • TypeScript在前端开发中的应用:从入门到实践
  • Vue.js 集成 TypeScript:构建类型安全的前端应用
  • Webpack从入门到实践:构建现代前端应用
  • 前端工程化:构建现代化开发流程
  • 前端工程化:构建高效、可维护的现代Web应用
  • 前端工程化:构建高效现代Web应用的艺术
  • 响应式设计:构建适配所有设备的现代Web应用
  • 前端状态管理:从Flux到现代解决方案
  • 前端性能优化-打造极速流畅的用户体验
  • 前端测试-构建可靠且高质量的用户界面
  • 前端安全防护-构建安全可靠的Web应用
  • 前端微前端架构-构建可扩展的大型前端应用
  • 前端数据可视化-打造直观易懂的数据呈现
  • 前端国际化-构建面向全球用户的多语言Web应用
  • 前端无障碍访问-构建包容性的Web体验
  • 前端组件化与组件库设计-构建可复用的高质量组件
  • 前端AI与机器学习集成:构建智能化用户界面
  • 前端架构设计模式-构建可扩展的现代Web应用
  • frontend
Jorgen
2023-10-15
目录

React-从入门到精通-构建现代Web应用

# 前言

作为一名前端开发者,我们经常听到各种框架的名字:Vue、Angular、Svelte...而其中,React无疑是当今最流行、最广泛使用的前端框架之一。在我之前的博客中,我已经详细介绍了Vue.js框架的使用,但作为前端开发者,怎么能不懂React呢 😂

今天,我想和大家一起深入探讨React,从基础概念到高级实践,帮助你全面掌握这个强大的前端框架。

# React简介

提示

React是由Facebook(现Meta)开发并维护的一个用于构建用户界面的JavaScript库。它采用组件化开发模式,通过虚拟DOM提高渲染性能,是目前前端开发领域最受欢迎的框架之一。

# 为什么选择React?

  1. 组件化开发:将UI拆分成独立、可复用的组件,提高代码复用性和可维护性。
  2. 虚拟DOM:通过内存中的DOM表示,减少实际DOM操作,提高性能。
  3. 单向数据流:数据流向清晰,便于理解和调试。
  4. 丰富的生态系统:拥有庞大的社区和丰富的第三方库支持。
  5. 跨平台能力:通过React Native可以开发移动应用,通过React Desktop可以开发桌面应用。

# React基础概念

# JSX语法

React使用JSX(JavaScript XML)来描述UI界面。JSX是JavaScript的语法扩展,它允许我们在JavaScript代码中编写类似HTML的代码。

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

// 使用组件
const element = <Welcome name="Jorgen" />;
1
2
3
4
5
6

JSX最终会被编译成普通的JavaScript代码,通过React.createElement()函数创建React元素。

# 组件与Props

React应用由组件构成。组件是独立的、可复用的UI片段,可以接收输入(称为props)并返回React元素。

// 函数组件
function Greeting(props) {
  return <h1>Hello, {props.name}</h1>;
}

// 类组件
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}
1
2
3
4
5
6
7
8
9
10
11

# State与生命周期

组件可以维护自己的状态(state),状态变化会触发重新渲染。

class Timer extends React.Component {
  constructor(props) {
    super(props);
    this.state = { seconds: 0 };
  }

  componentDidMount() {
    this.interval = setInterval(() => {
      this.setState(prevState => ({
        seconds: prevState.seconds + 1
      }));
    }, 1000);
  }

  componentWillUnmount() {
    clearInterval(this.interval);
  }

  render() {
    return (
      <div>
        <p>已运行: {this.state.seconds} 秒</p>
      </div>
    );
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# React Hooks

React Hooks是React 16.8引入的新特性,它允许你在函数组件中使用状态和其他React特性,而不必编写类组件。

# useState Hook

import React, { useState } from 'react';

function Counter() {
  // 声明一个新的叫做 "count" 的 state 变量
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>你点击了 {count} 次</p>
      <button onClick={() => setCount(count + 1)}>
        点击我
      </button>
    </div>
  );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# useEffect Hook

import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  // 相当于 componentDidMount 和 componentDidUpdate:
  useEffect(() => {
    // 更新文档的标题
    document.title = `你点击了 ${count} 次`;
  });

  return (
    <div>
      <p>你点击了 {count} 次</p>
      <button onClick={() => setCount(count + 1)}>
        点击我
      </button>
    </div>
  );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 自定义Hook

import { useState, useEffect } from 'react';

function useCounter(initialValue) {
  const [count, setCount] = useState(initialValue);

  const increment = () => setCount(count + 1);
  const decrement = () => setCount(count - 1);
  const reset = () => setCount(initialValue);

  return { count, increment, decrement, reset };
}

function CounterComponent() {
  const { count, increment, decrement, reset } = useCounter(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>+</button>
      <button onClick={decrement}>-</button>
      <button onClick={reset}>Reset</button>
    </div>
  );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# React状态管理

随着应用规模的增长,状态管理变得越来越重要。React生态系统中有多种状态管理解决方案:

# Context API

import React, { createContext, useContext, useReducer } from 'react';

// 创建Context
const AppContext = createContext();

// 定义初始状态
const initialState = {
  user: null,
  theme: 'light',
  language: 'zh-CN'
};

// 使用useReducer管理复杂状态
function reducer(state, action) {
  switch (action.type) {
    case 'SET_USER':
      return { ...state, user: action.payload };
    case 'TOGGLE_THEME':
      return { ...state, theme: state.theme === 'light' ? 'dark' : 'light' };
    case 'SET_LANGUAGE':
      return { ...state, language: action.payload };
    default:
      return state;
  }
}

// 创建Provider组件
function AppProvider({ children }) {
  const [state, dispatch] = useReducer(reducer, initialState);
  
  return (
    <AppContext.Provider value={{ state, dispatch }}>
      {children}
    </AppContext.Provider>
  );
}

// 创建自定义Hook以便在组件中使用Context
function useAppContext() {
  return useContext(AppContext);
}

// 在组件中使用
function UserProfile() {
  const { state, dispatch } = useAppContext();
  
  return (
    <div>
      <h2>User Profile</h2>
      <p>Theme: {state.theme}</p>
      <button onClick={() => dispatch({ type: 'TOGGLE_THEME' })}>
        Toggle Theme
      </button>
    </div>
  );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

# Redux

Redux是一个可预测的状态容器,适用于复杂的应用程序。

// store.js
import { createStore } from 'redux';

// 定义action类型
const INCREMENT = 'INCREMENT';
const DECREMENT = 'DECREMENT';

// 定义action creators
function increment() {
  return { type: INCREMENT };
}

function decrement() {
  return { type: DECREMENT };
}

// 定义reducer
function counterReducer(state = 0, action) {
  switch (action.type) {
    case INCREMENT:
      return state + 1;
    case DECREMENT:
      return state - 1;
    default:
      return state;
  }
}

// 创建store
const store = createStore(counterReducer);

export { increment, decrement, store };
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// CounterComponent.js
import React, { useState, useEffect } from 'react';
import { increment, decrement, store } from './store';

function CounterComponent() {
  const [count, setCount] = useState(store.getState());

  useEffect(() => {
    const unsubscribe = store.subscribe(() => {
      setCount(store.getState());
    });

    return () => unsubscribe();
  }, []);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => store.dispatch(increment())}>+</button>
      <button onClick={() => store.dispatch(decrement())}>-</button>
    </div>
  );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# React Router

React Router是React应用中最常用的路由库,用于处理客户端路由。

import React from 'react';
import { BrowserRouter as Router, Route, Link, Switch } from 'react-router-dom';

function Home() {
  return (
    <div>
      <h2>首页</h2>
    </div>
  );
}

function About() {
  return (
    <div>
      <h2>关于我们</h2>
    </div>
  );
}

function Contact() {
  return (
    <div>
      <h2>联系我们</h2>
    </div>
  );
}

function NotFound() {
  return (
    <div>
      <h2>404 - 页面未找到</h2>
    </div>
  );
}

function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li><Link to="/">首页</Link></li>
            <li><Link to="/about">关于我们</Link></li>
            <li><Link to="/contact">联系我们</Link></li>
          </ul>
        </nav>

        <Switch>
          <Route exact path="/" component={Home} />
          <Route path="/about" component={About} />
          <Route path="/contact" component={Contact} />
          <Route component={NotFound} />
        </Switch>
      </div>
    </Router>
  );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

# React性能优化

随着应用规模的增长,性能优化变得越来越重要。以下是React应用中常用的性能优化技巧:

# 使用React.memo

import React, { memo } from 'react';

const ExpensiveComponent = memo(function ExpensiveComponent({ data }) {
  // 复杂的计算或渲染逻辑
  const processedData = data.map(item => {
    // 复杂处理...
  });

  return (
    <div>
      {processedData.map(item => (
        <div key={item.id}>{item.name}</div>
      ))}
    </div>
  );
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 使用useMemo和useCallback

import React, { useState, useMemo, useCallback } from 'react';

function ExpensiveComponent({ list, filter }) {
  const [count, setCount] = useState(0);

  // 使用useMemo缓存计算结果
  const filteredList = useMemo(() => {
    console.log('Filtering list...');
    return list.filter(item => item.includes(filter));
  }, [list, filter]);

  // 使用useCallback缓存函数
  const handleAdd = useCallback(() => {
    setCount(prevCount => prevCount + 1);
  }, []);

  return (
    <div>
      <button onClick={handleAdd}>Add</button>
      <p>Count: {count}</p>
      <ul>
        {filteredList.map(item => (
          <li key={item}>{item}</li>
        ))}
      </ul>
    </div>
  );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 代码分割与懒加载

import React, { Suspense, lazy } from 'react';

// 使用React.lazy进行懒加载
const Home = lazy(() => import('./Home'));
const About = lazy(() => import('./About'));
const Contact = lazy(() => import('./Contact'));

function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li><Link to="/">首页</Link></li>
            <li><Link to="/about">关于我们</Link></li>
            <li><Link to="/contact">联系我们</Link></li>
          </ul>
        </nav>

        <Suspense fallback={<div>Loading...</div>}>
          <Switch>
            <Route exact path="/" component={Home} />
            <Route path="/about" component={About} />
            <Route path="/contact" component={Contact} />
          </Switch>
        </Suspense>
      </div>
    </Router>
  );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# React生态系统的其他重要工具

# Next.js

Next.js是一个基于React的框架,提供了服务端渲染、静态站点生成、路由系统等功能。

// pages/index.js
import React from 'react';

export default function Home() {
  return (
    <div>
      <h1>欢迎来到我的网站</h1>
      <p>这是使用Next.js构建的页面</p>
    </div>
  );
}
1
2
3
4
5
6
7
8
9
10
11

# Gatsby

Gatsby是一个基于React的静态站点生成器,特别适合构建内容驱动的网站。

// src/pages/index.js
import React from 'react';

export default function Home() {
  return (
    <div>
      <h1>我的博客</h1>
      <p>这是使用Gatsby构建的博客首页</p>
    </div>
  );
}
1
2
3
4
5
6
7
8
9
10
11

# React Testing Library

React Testing Library是一个用于测试React组件的库,它鼓励良好的测试实践。

// Button.test.js
import React from 'react';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import Button from './Button';

test('button renders correctly', () => {
  render(<Button>Click me</Button>);
  const buttonElement = screen.getByText(/click me/i);
  expect(buttonElement).toBeInTheDocument();
});

test('button calls onClick handler when clicked', async () => {
  const handleClick = jest.fn();
  render(<Button onClick={handleClick}>Click me</Button>);
  
  const user = userEvent.setup();
  const buttonElement = screen.getByText(/click me/i);
  
  await user.click(buttonElement);
  
  expect(handleClick).toHaveBeenCalledTimes(1);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 结语

React是一个强大而灵活的前端框架,它通过组件化、虚拟DOM和丰富的生态系统,极大地简化了现代Web应用的开发过程。从基础概念到高级技巧,React提供了构建复杂用户界面所需的一切工具。

"学习React不仅仅是学习一个框架,更是学习一种构建用户界面的思维方式。"

作为前端开发者,掌握React不仅能提高你的工作效率,也能让你更好地理解现代前端开发的最佳实践。希望这篇文章能帮助你开启React学习之旅,并在实际项目中应用这些知识。

如果你有任何问题或建议,欢迎在评论区留言交流!👋

# 个人建议

  1. 循序渐进:从React基础开始,逐步学习高级概念,不要急于求成。
  2. 实践驱动:理论学习后,一定要动手实践,构建自己的项目。
  3. 关注生态:React生态系统非常丰富,了解相关工具(如Redux、React Router等)能让你更高效地开发。
  4. 保持更新:React发展迅速,关注官方文档和社区动态,了解最新特性和最佳实践。

"代码是写给人看的,顺便能在机器上运行。"

  • 唐纳德·克努特
#React#JavaScript#前端框架#Web开发
上次更新: 2026/01/28, 10:42:53
React.js-从入门到精通-构建现代用户界面
React-从入门到精通-构建现代前端应用

← React.js-从入门到精通-构建现代用户界面 React-从入门到精通-构建现代前端应用→

最近更新
01
LLM
01-30
02
intro
01-30
03
intro
01-30
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jorgen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式