React 高级阶段学习计划

embedded/2024/10/22 2:42:30/

React 高级阶段学习计划

目标

  • 深入理解React的渲染机制和性能优化。
  • 学会代码分割和懒加载。
  • 掌握单元测试和集成测试。
  • 学习TypeScript与React的结合。

学习内容

性能优化

React.memo
  • React.memo:用于优化函数组件的性能,避免不必要的重新渲染。
  • 示例
    import React, { useState, useMemo } from 'react';const ExpensiveComponent = React.memo(({ value }) => {console.log('ExpensiveComponent rendered');// 模拟昂贵的计算for (let i = 0; i < 1000000000; i++) {}return <div>{value}</div>;
    });function App() {const [count, setCount] = useState(0);const [text, setText] = useState('');const memoizedValue = useMemo(() => {console.log('Computing memoized value');return count * 2;}, [count]);return (<div><h1>Performance Optimization</h1><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment Count</button><inputtype="text"value={text}onChange={(e) => setText(e.target.value)}placeholder="Type something"/><ExpensiveComponent value={memoizedValue} /></div>);
    }export default App;
useCallback和useMemo
  • useCallback:用于缓存函数,避免不必要的重新创建。
  • useMemo:用于缓存计算结果,避免不必要的计算。
  • 示例
    import React, { useState, useCallback, useMemo } from 'react';function App() {const [count, setCount] = useState(0);const [text, setText] = useState('');const expensiveComputation = (num) => {console.log('Computing...');// 模拟昂贵的计算for (let i = 0; i < 1000000000; i++) {}return num * 2;};const memoizedValue = useMemo(() => {return expensiveComputation(count);}, [count]);const memoizedCallback = useCallback(() => {console.log('Callback called');setCount(count + 1);}, [count]);return (<div><h1>Performance Optimization</h1><p>Count: {count}</p><button onClick={memoizedCallback}>Increment Count</button><inputtype="text"value={text}onChange={(e) => setText(e.target.value)}placeholder="Type something"/><p>Memoized Value: {memoizedValue}</p></div>);
    }export default App;
    

代码分割与懒加载

React.lazy和Suspense
  • React.lazy:用于动态导入组件,实现代码分割。
  • Suspense:用于在组件加载时显示加载指示器。
  • 示例
    import React, { Suspense, lazy } from 'react';
    import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom';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="/">Home</Link></li><li><Link to="/about">About</Link></li><li><Link to="/contact">Contact</Link></li></ul></nav><Suspense fallback={<div>Loading...</div>}><Switch><Route path="/" exact component={Home} /><Route path="/about" component={About} /><Route path="/contact" component={Contact} /></Switch></Suspense></div></Router>);
    }export default App;
    

测试

单元测试和集成测试
  • Jest:一个JavaScript测试框架。

  • Testing Library:一组用于测试UI组件的库。

  • 安装

    npm install --save-dev jest @testing-library/react @testing-library/jest-dom
    
  • 示例

    // Button.js
    import React from 'react';function Button({ onClick, label }) {return <button onClick={onClick}>{label}</button>;
    }export default Button;
    
    // Button.test.js
    import React from 'react';
    import { render, screen, fireEvent } from '@testing-library/react';
    import '@testing-library/jest-dom/extend-expect';
    import Button from './Button';test('renders button with correct label', () => {render(<Button label="Click Me" />);const buttonElement = screen.getByText('Click Me');expect(buttonElement).toBeInTheDocument();
    });test('calls onClick handler when clicked', () => {const handleClick = jest.fn();render(<Button label="Click Me" onClick={handleClick} />);const buttonElement = screen.getByText('Click Me');fireEvent.click(buttonElement);expect(handleClick).toHaveBeenCalled();
    });
    

TypeScript

TypeScript基础
  • TypeScript:一种静态类型的编程语言,可以提高代码的可读性和可维护性。
  • 安装
    npm install --save typescript @types/react @types/react-dom
    
  • 配置
    • 在项目根目录下创建 tsconfig.json 文件:
      {"compilerOptions": {"target": "es5","lib": ["dom", "dom.iterable", "esnext"],"allowJs": true,"skipLibCheck": true,"esModuleInterop": true,"allowSyntheticDefaultImports": true,"strict": true,"forceConsistentCasingInFileNames": true,"noFallthroughCasesInSwitch": true,"module": "esnext","moduleResolution": "node","resolveJsonModule": true,"isolatedModules": true,"noEmit": true,"jsx": "react-jsx"},"include": ["src"]
      }
      
TypeScript与React结合
  • 函数组件

    import React from 'react';interface ButtonProps {label: string;onClick: () => void;
    }const Button: React.FC<ButtonProps> = ({ label, onClick }) => {return <button onClick={onClick}>{label}</button>;
    };export default Button;
    
  • 类组件

    import React, { Component } from 'react';interface CounterState {count: number;
    }class Counter extends Component<{}, CounterState> {state: CounterState = { count: 0 };increment = () => {this.setState({ count: this.state.count + 1 });};render() {return (<div><p>Count: {this.state.count}</p><button onClick={this.increment}>Increment</button></div>);}
    }export default Counter;
    

实践项目

个人博客

  1. 创建项目
    npx create-react-app personal-blog-ts --template typescript
    cd personal-blog-ts
    npm start
    
  2. 创建组件
    • Header.tsx:头部组件
      import React from 'react';const Header: React.FC = () => {return <header><h1>My Personal Blog</h1></header>;
      };export default Header;
      
    • PostList.tsx:文章列表组件
      import React from 'react';interface Post {id: number;title: string;content: string;
      }const posts: Post[] = [{ id: 1, title: 'First Post', content: 'This is the first post.' },{ id: 2, title: 'Second Post', content: 'This is the second post.' },
      ];const PostList: React.FC = () => {return (<div>{posts.map(post => (<div key={post.id}><h2>{post.title}</h2><p>{post.content}</p></div>))}</div>);
      };export default PostList;
      
    • App.tsx:主组件
      import React from 'react';
      import Header from './Header';
      import PostList from './PostList';const App: React.FC = () => {return (<div className="App"><Header /><PostList /></div>);
      };export default App;
      

电子商务网站

  1. 创建项目
    npx create-react-app ecommerce-ts --template typescript
    cd ecommerce-ts
    npm start
    
  2. 安装axios
    npm install axios
    
  3. 创建组件
    • ProductList.tsx:显示产品列表
      import React, { useState, useEffect } from 'react';
      import axios from 'axios';interface Product {id: number;title: string;price: number;image: string;
      }const ProductList: React.FC = () => {const [products, setProducts] = useState<Product[]>([]);useEffect(() => {axios.get<Product[]>('https://fakestoreapi.com/products').then(response => {setProducts(response.data);}).catch(error => {console.error('Error fetching products:', error);});}, []);return (<div className="product-list">{products.map(product => (<div key={product.id} className="product"><img src={product.image} alt={product.title} /><h3>{product.title}</h3><p>${product.price}</p></div>))}</div>);
      };export default ProductList;
      
    • App.tsx:主组件
      import React from 'react';
      import ProductList from './ProductList';const App: React.FC = () => {return (<div className="App"><h1>E-commerce Website</h1><ProductList /></div>);
      };export default App;
      

建议

  • 定期回顾:每周花时间回顾本周所学内容,确保知识点牢固掌握。
  • 参与社区:加入React相关的论坛、Slack群组或Discord服务器,与其他开发者交流心得。
  • 阅读源码:尝试阅读一些复杂的React库的源码,提高代码理解和分析能力。

希望这个学习计划能够帮助你系统地学习React高级技能,并通过实践项目巩固所学知识。祝你学习顺利!


你可以将上述Markdown内容复制到任何支持Markdown的编辑器或平台中,以便于查看和使用。

http://www.ppmy.cn/embedded/129444.html

相关文章

【Linux】内存文件系统的I/O、重定向

文章目录 1. 系统中的文件2. 回顾C中的文件接口3. 文件类的系统调用3.1 open3.2 文件描述符 4. IO的基本过程5.重定向5.1 引入重定向5.2 系统中的重定向接口 6. 缓冲区问题7. 简单版shell的实现 1. 系统中的文件 在学习完Linux权限后&#xff0c;我们清楚的知道&#xff1a;文…

111 - Lecture 5

Decomposition,Abstraction and Functions 1. 编程中的基础语言机制(basic language mechanisms)&#xff1a; 回顾我们已经学习的 Java 基本语法&#xff0c;包括&#xff1a; • Primitives 原始数据类型&#xff08;byte, short, int, long, float, double, boolean, cha…

Unity3D模型消融方法(二)

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、模型淡入淡出效果实现👉3-1、具体实现方法👉3-2、CrollerShader.cs👉3-3、ModelXR.cs👉3-4、交互脚本👉壁纸分享👉总结👉前言 上一篇写了模型消融的方法, 这一篇算是淡入淡出效…

php之is_null、empty 、isset 的区别

目录 1.isset()&#xff1a; 2.empty()&#xff1a; 3.is_null&#xff1a; 4.总结&#xff1a; 在PHP中&#xff0c;is_null、empty 和 isset 是三个用于检查变量状态的常用函数&#xff0c;它们各自有不同的用途和行为&#xff1a; 1.isset()&#xff1a; isset() 函数…

qt继承结构

一、 继承结构 所有的窗口类均继承自QWidget类&#xff0c;因此QWidget类本身包含窗口的特性。QWidget对象本身既可以作为独立窗口&#xff0c;又可以作为组件&#xff08;子窗口&#xff09;。 通过构造函数可以创建以上两种形态的QWidget&#xff1a; // 参数1&#xff1a;使…

基于SpringBoot+Vue+uniapp的海产品加工销售一体化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

Git客户端使用之命令行

一、git客户端命令行的使用 1、创建本地用户并绑定ssh-key到gitlab #在本地注册用户,这个用户随便创建它就是与git仓库连接的一个用户&#xff0c;不过最好喝git仓库用户一样有利于区分。 git config --global user.name "wenqiang1" git config --global user.ema…

Android中的内存泄漏及其检测方式

Android中的内存泄漏及其检测方式 一、Android内存泄漏概述 在Android开发中&#xff0c;内存泄漏是一个常见且严重的问题。内存泄漏指的是在应用程序中&#xff0c;由于某些原因&#xff0c;已经不再使用的对象仍然被引用&#xff0c;导致垃圾回收器&#xff08;Garbage Col…