【react】进阶教程02

目录

一、深度性能优化

[1. 列表渲染优化(虚拟列表)](#1. 列表渲染优化(虚拟列表))

[2. 使用 Web Workers 处理 CPU 密集型任务](#2. 使用 Web Workers 处理 CPU 密集型任务)

二、复杂状态管理场景

[1. 全局状态分层(Context + useReducer)](#1. 全局状态分层(Context + useReducer))

[2. 异步状态管理中间件(Redux Thunk)](#2. 异步状态管理中间件(Redux Thunk))

三、高级组件模式扩展

[1. 控制反转(Inversion of Control)](#1. 控制反转(Inversion of Control))

[2. Headless 组件模式](#2. Headless 组件模式)

[四、服务端渲染与静态生成(Next.js 集成)](#四、服务端渲染与静态生成(Next.js 集成))

[1. 基础 SSR 实现](#1. 基础 SSR 实现)

[2. 静态生成(SSG)](#2. 静态生成(SSG))

五、动画与交互增强

[1. 使用 Framer Motion 实现复杂动画](#1. 使用 Framer Motion 实现复杂动画)

六、工程化最佳实践

[1. 项目目录结构规范](#1. 项目目录结构规范)

七、调试与错误排查

[1. React DevTools 高级用法](#1. React DevTools 高级用法)

[2. 错误日志收集(Sentry 集成)](#2. 错误日志收集(Sentry 集成))

八、微前端架构实践

[1. 使用 Module Federation](#1. 使用 Module Federation)

九、推荐学习路径

十、扩展工具链


一、深度性能优化

1. 列表渲染优化(虚拟列表)

处理大数据量列表时,使用 react-window 实现虚拟滚动:

npm install react-window
javascript 复制代码
import { FixedSizeList as List } from 'react-window';

const BigList = ({ data }) => (
  <List
    height={400}
    itemCount={data.length}
    itemSize={50}
    width={300}
  >
    {({ index, style }) => (
      <div style={style}>Row {data[index]}</div>
    )}
  </List>
);

// 使用
<BigList data={Array(1000).fill().map((_, i) => i)} />
2. 使用 Web Workers 处理 CPU 密集型任务
javascript 复制代码
// worker.js
self.onmessage = (e) => {
  const result = heavyCalculation(e.data);
  self.postMessage(result);
};

// 主线程使用
function App() {
  const [result, setResult] = useState(null);
  const workerRef = useRef(null);

  useEffect(() => {
    workerRef.current = new Worker('worker.js');
    workerRef.current.onmessage = (e) => setResult(e.data);
    return () => workerRef.current.terminate();
  }, []);

  const handleCalculate = () => {
    workerRef.current.postMessage(inputData);
  };

  return (
    <div>
      <button onClick={handleCalculate}>Start Calculation</button>
      {result && <div>Result: {result}</div>}
    </div>
  );
}

二、复杂状态管理场景

1. 全局状态分层(Context + useReducer)
javascript 复制代码
// contexts/authContext.js
const AuthContext = React.createContext();

export function AuthProvider({ children }) {
  const [state, dispatch] = useReducer(authReducer, initialState);

  const login = async (credentials) => {
    dispatch({ type: 'LOGIN_REQUEST' });
    try {
      const user = await api.login(credentials);
      dispatch({ type: 'LOGIN_SUCCESS', payload: user });
    } catch (error) {
      dispatch({ type: 'LOGIN_FAILURE', payload: error });
    }
  };

  return (
    <AuthContext.Provider value={{ ...state, login }}>
      {children}
    </AuthContext.Provider>
  );
}

export const useAuth = () => useContext(AuthContext);
2. 异步状态管理中间件(Redux Thunk)
javascript 复制代码
// store.js
import { configureStore } from '@reduxjs/toolkit';
import { fetchUser } from './userSlice';

const store = configureStore({
  reducer: userReducer,
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware().concat(thunkMiddleware),
});

// userSlice.js
export const fetchUser = (userId) => async (dispatch) => {
  dispatch(userLoading());
  try {
    const user = await api.getUser(userId);
    dispatch(userSuccess(user));
  } catch (error) {
    dispatch(userFailure(error));
  }
};

三、高级组件模式扩展

1. 控制反转(Inversion of Control)
javascript 复制代码
function DynamicForm({ fields, onSubmit }) {
  return (
    <form onSubmit={onSubmit}>
      {fields.map((FieldComponent, index) => (
        <FieldComponent key={index} />
      ))}
      <button type="submit">Submit</button>
    </form>
  );
}

// 使用
<DynamicForm
  fields={[TextInput, DatePicker, Dropdown]}
  onSubmit={handleSubmit}
/>
2. Headless 组件模式
javascript 复制代码
function useDropdown(options) {
  const [isOpen, setIsOpen] = useState(false);
  const [selected, setSelected] = useState(null);

  const toggle = () => setIsOpen(!isOpen);

  return {
    isOpen,
    selected,
    toggle,
    options,
    setSelected,
  };
}

// 使用
function CustomDropdown() {
  const dropdown = useDropdown(['Option 1', 'Option 2']);
  return (
    <div className="dropdown">
      <button onClick={dropdown.toggle}>
        {dropdown.selected || 'Select...'}
      </button>
      {dropdown.isOpen && (
        <ul>
          {dropdown.options.map((opt) => (
            <li key={opt} onClick={() => dropdown.setSelected(opt)}>
              {opt}
            </li>
          ))}
        </ul>
      )}
    </div>
  );
}

四、服务端渲染与静态生成(Next.js 集成)

1. 基础 SSR 实现
javascript 复制代码
// pages/index.js
export async function getServerSideProps() {
  const data = await fetch('https://api.example.com/data').then(res => res.json());
  return { props: { data } };
}

export default function HomePage({ data }) {
  return (
    <div>
      <h1>Server-Side Rendered Data</h1>
      <pre>{JSON.stringify(data, null, 2)}</pre>
    </div>
  );
}
2. 静态生成(SSG)
javascript 复制代码
// pages/posts/[id].js
export async function getStaticPaths() {
  const posts = await fetch('https://api.example.com/posts')
    .then(res => res.json());
  const paths = posts.map(post => ({ 
    params: { id: post.id.toString() } 
  }));
  return { paths, fallback: false };
}

export async function getStaticProps({ params }) {
  const post = await fetch(`https://api.example.com/posts/${params.id}`)
          .then(res => res.json());
  return { props: { post } };
}

export default function Post({ post }) {
  return (
    <article>
      <h1>{post.title}</h1>
      <div>{post.content}</div>
    </article>
  );
}

五、动画与交互增强

1. 使用 Framer Motion 实现复杂动画
bash 复制代码
npm install framer-motion
javascript 复制代码
import { motion, AnimatePresence } from 'framer-motion';

function Modal({ isOpen, onClose }) {
  return (
    <AnimatePresence>
      {isOpen && (
        <motion.div
          initial={{ opacity: 0 }}
          animate={{ opacity: 1 }}
          exit={{ opacity: 0 }}
          className="modal"
        >
          <motion.div
            initial={{ y: 50 }}
            animate={{ y: 0 }}
          >
            <button onClick={onClose}>Close</button>
            Modal Content
          </motion.div>
        </motion.div>
      )}
    </AnimatePresence>
  );
}
  1. 拖拽交互实现
javascript 复制代码
import { useDrag } from 'react-dnd';

function DraggableItem({ id, text }) {
  const [{ isDragging }, drag] = useDrag(() => ({
    type: 'ITEM',
    item: { id },
    collect: (monitor) => ({
      isDragging: !!monitor.isDragging(),
    }),
  }));

  return (
    <div
      ref={drag}
      style={{ opacity: isDragging ? 0.5 : 1 }}
      className="draggable"
    >
      {text}
    </div>
  );
}

六、工程化最佳实践

1. 项目目录结构规范
javascript 复制代码
src/
├── components/       # 通用组件
├── features/         # 功能模块
│   └── auth/
│       ├── components/  # 模块专用组件
│       ├── hooks/       # 模块自定义 Hooks
│       └── slices/      # Redux Toolkit slices
├── lib/              # 工具函数/第三方集成
├── pages/            # 页面组件(Next.js 路由)
└── stores/           # 全局状态管理
  1. 自定义 ESLint 配置
javascript 复制代码
// .eslintrc.js
module.exports = {
  extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:react-hooks/recommended',
  ],
  rules: {
    'react/prop-types': 'off',
    'no-unused-vars': 'warn',
    'react-hooks/exhaustive-deps': 'error',
  },
};

七、调试与错误排查

1. React DevTools 高级用法
  • 使用 Profiler 分析组件渲染性能

  • 查看组件 Hooks 依赖关系图

  • 追踪不必要的渲染原因

2. 错误日志收集(Sentry 集成)
javascript 复制代码
// 初始化
import * as Sentry from '@sentry/react';

Sentry.init({
  dsn: 'YOUR_DSN',
  integrations: [new Sentry.BrowserTracing()],
  tracesSampleRate: 1.0,
});

// 错误边界自动捕获
const ErrorBoundary = Sentry.ErrorBoundary;

// 手动捕获
try {
  riskyOperation();
} catch (error) {
  Sentry.captureException(error);
}

八、微前端架构实践

1. 使用 Module Federation
javascript 复制代码
// webpack.config.js (Host)
const { ModuleFederationPlugin } = require('webpack').container;

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'host',
      remotes: {
        remoteApp: 'remoteApp@http://localhost:3001/remoteEntry.js',
      },
    }),
  ],
};

// 动态加载远程组件
const RemoteComponent = React.lazy(() => import('remoteApp/Button'));

九、推荐学习路径

  1. 实战项目:电商后台管理系统、实时协作工具

  2. 源码学习 :阅读 React 核心算法 reconciler 源码

  3. 性能大师:深入研究 React 的 Fiber 架构与调度机制

  4. 架构演进:从单体应用到微前端架构的迁移策略


十、扩展工具链

类别 推荐工具
状态管理 Zustand, Jotai
表单处理 React Hook Form
数据请求 SWR, React Query
静态站点 Gatsby
移动端 React Native
桌面端 Electron + React
相关推荐
桂月二二13 分钟前
基于模块联邦的微前端架构:重构大型前端应用的模块化边界
前端·重构·架构
前端没钱1 小时前
日报列表滚动到哪里、哪里就自动变成已读状态
前端·vue.js
bigyoung1 小时前
告警 Detected multiple renderers concurrently rendering the same context provider
react.js·前端框架
lc_front_developer1 小时前
为什么使用Knex 做为 Express 中操作 MySQL 数据库的方案?
前端·node.js
❆VE❆2 小时前
vue3: directive自定义指令防止重复点击
前端·javascript·vue.js·自定义指令·directive
布兰妮甜2 小时前
Fetch API 与 XMLHttpRequest:深入剖析异步请求的利器
前端·javascript·xmlhttprequest·fetch api
巴巴博一3 小时前
vue-i18n国际化插件安装教程(Vue3篇)
前端·javascript·vue.js·typescript
Merlyn103 小时前
npm : 无法加载文件 E:\ProgramFiles\Nodejs\npm.ps1,因为在此系统上禁止运行脚本。
前端·npm·node.js
一个打工仔的笔记3 小时前
npm i 失败权限问题
前端·npm·node.js