React 进阶阶段学习计划

React 进阶阶段学习计划

目标

  • 掌握自定义Hooks的创建和使用。
  • 深入理解上下文(Context)和Redux的高级用法。
  • 学会服务端渲染(SSR)。
  • 深入探讨性能优化技巧。

学习内容

自定义Hooks

创建和使用自定义Hooks
  • 自定义Hooks:用于提取组件逻辑,使代码更加模块化和复用。

  • 示例

    // useFetch.js
    import { useState, useEffect } from 'react';function useFetch(url) {const [data, setData] = useState(null);const [loading, setLoading] = useState(true);const [error, setError] = useState(null);useEffect(() => {async function fetchData() {try {const response = await fetch(url);const json = await response.json();setData(json);} catch (err) {setError(err);} finally {setLoading(false);}}fetchData();}, [url]);return { data, loading, error };
    }export default useFetch;
    
    // App.js
    import React from 'react';
    import useFetch from './useFetch';function App() {const { data, loading, error } = useFetch('https://jsonplaceholder.typicode.com/posts');if (loading) return <div>Loading...</div>;if (error) return <div>Error: {error.message}</div>;return (<div><h1>Data from API</h1><ul>{data.map(item => (<li key={item.id}>{item.title}</li>))}</ul></div>);
    }export default App;
    

上下文(Context)和Redux的高级用法

上下文(Context)的高级用法
  • Context Consumer:用于在函数组件中消费Context。
  • 示例
    // ThemeContext.js
    import React, { createContext, useContext, useState } from 'react';const ThemeContext = createContext();// 提供者组件
    function ThemeProvider({ children }) {const [theme, setTheme] = useState('light');const toggleTheme = () => {setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));};return (<ThemeContext.Provider value={{ theme, toggleTheme }}>{children}</ThemeContext.Provider>);
    }// 消费者组件
    function ThemedButton() {const { theme, toggleTheme } = useContext(ThemeContext);return (<button onClick={toggleTheme} style={{ background: theme === 'light' ? '#fff' : '#333', color: theme === 'light' ? '#000' : '#fff' }}>Toggle Theme</button>);
    }// App.js
    import React from 'react';
    import ThemeProvider from './ThemeProvider';
    import ThemedButton from './ThemedButton';function App() {return (<ThemeProvider><ThemedButton /></ThemeProvider>);
    }export default App;
    
Redux的高级用法
  • Redux Toolkit:简化Redux的开发流程。

  • 安装

    npm install @reduxjs/toolkit react-redux
    
  • 示例

    // store.js
    import { configureStore, createSlice } from '@reduxjs/toolkit';const counterSlice = createSlice({name: 'counter',initialState: { value: 0 },reducers: {increment: (state) => {state.value += 1;},decrement: (state) => {state.value -= 1;},},
    });const store = configureStore({reducer: {counter: counterSlice.reducer,},
    });export const { increment, decrement } = counterSlice.actions;
    export default store;
    
    // App.js
    import React from 'react';
    import { useSelector, useDispatch } from 'react-redux';
    import { increment, decrement } from './store';
    import { Provider } from 'react-redux';
    import store from './store';function Counter() {const count = useSelector((state) => state.counter.value);const dispatch = useDispatch();return (<div><p>Count: {count}</p><button onClick={() => dispatch(increment())}>Increment</button><button onClick={() => dispatch(decrement())}>Decrement</button></div>);
    }function App() {return (<Provider store={store}><Counter /></Provider>);
    }export default App;
    

服务端渲染(SSR)

Next.js
  • Next.js:一个流行的React框架,支持服务端渲染。

  • 安装

    npx create-next-app@latest my-app
    cd my-app
    npm run dev
    
  • 示例

    // pages/index.js
    import { useState } from 'react';export default function Home() {const [count, setCount] = useState(0);return (<div><h1>Welcome to Next.js!</h1><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
    }
    
    // pages/api/hello.js
    export default function handler(req, res) {res.status(200).json({ name: 'John Doe' });
    }
    

性能优化的深入探讨

使用React Profiler
  • React Profiler:用于分析组件的渲染性能。
  • 启用Profiler
    import React, { Profiler } from 'react';function onRender(id, phase, actualDuration, baseDuration, startTime, commitTime) {console.log({ id, phase, actualDuration, baseDuration, startTime, commitTime });
    }function App() {return (<Profiler id="App" onRender={onRender}><div><h1>React Profiler Example</h1>{/* 其他组件 */}</div></Profiler>);
    }export default App;
    
使用React.memo和PureComponent
  • React.memo:用于优化函数组件的性能。

  • PureComponent:用于优化类组件的性能。

  • 示例

    // MyComponent.js
    import React, { PureComponent } from 'react';class MyComponent extends PureComponent {render() {return <div>{this.props.value}</div>;}
    }export default MyComponent;
    
    // MyFunctionComponent.js
    import React from 'react';const MyFunctionComponent = React.memo(({ value }) => {return <div>{value}</div>;
    });export default MyFunctionComponent;
    

实践项目

社交媒体应用
  1. 创建项目
    npx create-next-app@latest social-media-app
    cd social-media-app
    npm run dev
    
  2. 创建组件
    • PostList.js:显示帖子列表
      import React, { useState, useEffect } from 'react';
      import axios from 'axios';function PostList() {const [posts, setPosts] = useState([]);useEffect(() => {axios.get('https://jsonplaceholder.typicode.com/posts').then(response => {setPosts(response.data);}).catch(error => {console.error('Error fetching posts:', error);});}, []);return (<div className="post-list">{posts.map(post => (<div key={post.id} className="post"><h3>{post.title}</h3><p>{post.body}</p></div>))}</div>);
      }export default PostList;
      
    • App.js:主组件
      import React from 'react';
      import PostList from '../components/PostList';function Home() {return (<div className="container"><h1>Social Media App</h1><PostList /></div>);
      }export default Home;
      
博客管理系统
  1. 创建项目
    npx create-react-app blog-management --template typescript
    cd blog-management
    npm start
    
  2. 安装axios
    npm install axios
    
  3. 创建组件
    • PostForm.tsx:添加和编辑帖子的表单

      import React, { useState } from 'react';
      import axios from 'axios';interface Post {id?: number;title: string;content: string;
      }interface PostFormProps {initialPost?: Post;onSubmit: (post: Post) => void;
      }const PostForm: React.FC<PostFormProps> = ({ initialPost, onSubmit }) => {const [post, setPost] = useState<Post>({id: initialPost?.id,title: initialPost?.title || '',content: initialPost?.content || '',});const handleSubmit = async (e: React.FormEvent) => {e.preventDefault();onSubmit(post);setPost({ title: '', content: '' });};return (<form onSubmit={handleSubmit}><inputtype="text"value={post.title}onChange={(e) => setPost({ ...post, title: e.target.value })}placeholder="Title"/><textareavalue={post.content}onChange={(e) => setPost({ ...post, content: e.target.value })}placeholder="Content"/><button type="submit">Submit</button></form>);
      };export default PostForm;
      
    • PostList.tsx:显示帖子列表

      import React, { useState, useEffect } from 'react';
      import axios from 'axios';
      import PostForm from './PostForm';interface Post {id: number;title: string;content: string;
      }const PostList: React.FC = () => {const [posts, setPosts] = useState<Post[]>([]);const [editingPost, setEditingPost] = useState<Post | null>(null);useEffect(() => {axios.get<Post[]>('https://jsonplaceholder.typicode.com/posts').then(response => {setPosts(response.data.slice(0, 10));}).catch(error => {console.error('Error fetching posts:', error);});}, []);const handleEdit = (post: Post) => {setEditingPost(post);};const handleDelete = (postId: number) => {setPosts(posts.filter(post => post.id !== postId));};const handleSave = (post: Post) => {if (post.id) {setPosts(posts.map(p => (p.id === post.id ? post : p)));} else {setPosts([...posts, post]);}setEditingPost(null);};return (<div className="post-list">{editingPost ? (<PostForm initialPost={editingPost} onSubmit={handleSave} />) : (<PostForm onSubmit={handleSave} />)}<ul>{posts.map(post => (<li key={post.id}><h3>{post.title}</h3><p>{post.content}</p><button onClick={() => handleEdit(post)}>Edit</button><button onClick={() => handleDelete(post.id)}>Delete</button></li>))}</ul></div>);
      };export default PostList;
      
    • App.tsx:主组件

      import React from 'react';
      import PostList from './components/PostList';const App: React.FC = () => {return (<div className="App"><h1>Blog Management System</h1><PostList /></div>);
      };export default App;
      

建议

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

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/882008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抓取指定网站上的所有图片的Python脚本

引言 在当今信息爆炸的时代&#xff0c;互联网上的数据量呈现出指数级的增长。对于开发者、数据分析师以及研究人员而言&#xff0c;从网页中提取有价值的信息是一项至关重要的技能。其中&#xff0c;抓取网站上的图片资源不仅能够丰富我们的数据集&#xff0c;还能为各种应用…

Linux操作系统分析实验-文件操作,实验三

一、实验目的 1、 理解Linux中虚拟文件系统的内容 2、 学习编写内核模块的方法 3、 在虚拟文件系统/proc中实现文件操作算法 二、实验内容 编写一个内核模块&#xff0c;在/proc文件系统中增加一个目录hello&#xff0c;并在这个目录中增加一个文件world&#xff0c;文件的…

推荐给前端同学的自动化测试库

对于前端开发而言&#xff0c;自动化测试不仅能够提高开发效率&#xff0c;还能确保应用的稳定性和可靠性。而Python提供了多种适用于前端自动化测试的库。这些库能够帮助前端开发者轻松实现UI测试、API测试和性能测试等多种需求。本文将介绍几个Python中常用的前端自动化测试库…

YOLO11改进-模块-引入Histogram Transformer Block(HTB)解决恶劣天气(雨雾雪)

本篇文章将介绍一个新的改进机制——HTB&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。在现代计算机视觉任务中&#xff0c;尤其是在目标检测领域&#xff0c;YOLO系列模型因其快速和准确的检测性能而备受关注。随着YOLOv11的提出&#xff0c;我们迎…

CTF(二)

导言&#xff1a; 本文主要讲述在CTF竞赛中&#xff0c;web类反序列化题目unseping。。 靶场链接&#xff1a;攻防世界 (xctf.org.cn) 反序列化漏洞&#xff1a;反序列化漏洞&#xff08;二&#xff09;_fst反序列化 rocksdb 字段值错误-CSDN博客 打开后可以看到&#xff1…

涂鸦智能落地 Koupleless 合并部署,实现云服务降本增效

文&#xff5c;八幡、朵拉 杭州涂鸦智能技术专家 主要研究微服务与可观测、消息引擎、任务调度、数据层中间件等领域。 本文 5389 字 阅读 15 分钟 当前涂鸦通过 Koupleless 的静态合并部署能力&#xff0c;很好地解决了资源浪费问题。 为了进一步提升研发效率&#xff0c;涂鸦…

MYSQL 拼接函数

目录 1、CONCAT 2、CONCAT_WS 1、CONCAT 解释&#xff1a;用于拼接两个或多个字符串成一个字符串。如果任何一个参数为 NULL&#xff0c;则 CONCAT 函数的结果也会是 NULL。 语法格式&#xff1a;SELECT concat(column_name1,column_name2,...) FROM table_name 中文注释&…

关于Docker

文章目录 DockerWSLWMWare虚拟机CentOS7安装dockerdocker基础命令docker数据卷挂载本地目录或文件 Docker Docker是一个快速构建、运行、管理应用的工具。 能够快速部署项目、项目依赖的组件、项目运行的环境。 项目传统的部署方式缺点&#xff1a; 各类环境、组件命令太多&…

具体应用案例:树莓集团助力传统制造业数字化转型

以一家传统制造业企业为例&#xff0c;在树莓集团的支持下&#xff0c;该企业逐步完成了数字化转型&#xff1a; 1. 生产智能化&#xff1a; 通过树莓集团提供的物联网和智能制造解决方案&#xff0c;企业的生产线实现了全面数字化&#xff0c;实时监控设备状态&#xff0c;进行…

CasADi库C++用法整理学习---以NMPC代码为例

参考几个使用方法博客 1 官方文档写的很清楚 对SM&#xff0c;DM&#xff0c;XM数据类型疑惑。什么时候使用什么样的类型&#xff0c;还是都可以&#xff1f; x MX.sym(“x”) 这将创建一个 11 矩阵&#xff0c;即一个包含名为 x 的符号基元的标量。这只是显示名称&#xff…

关键词提取技术:TF-IDF 详解

1. 什么是TF-IDF&#xff1f; TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09; 是一种统计方法&#xff0c;用于评估单词在文档集或语料库中的重要性。它是自然语言处理和信息检索中的核心技术之一。 TF-IDF主要基于以下两个概念&#xff1a; TF&a…

书籍推荐:《从零构建大型语言模型》附免费PDF下载

通过从头开始构建一个大型语言模型&#xff0c;了解如何创建、训练和调整大型语言模型 &#xff08;LLMs&#xff09;&#xff01; 一、构建大型语言模型&#xff08;从头开始&#xff09; 在《构建大型语言模型&#xff08;从头开始&#xff09;》中&#xff0c;你将了解如何…

C++ —— 关于继承(inheritance)

目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承的定义格式 1.3 继承基类成员访问方式的变化 1.4 类模板的继承 2.基类与派生类的转换 3. 继承中的作用域 3.1 隐藏规则 4. 派⽣类的默认成员函数 4.1 4个常见默认成员函数 4.2 实现⼀个不能被继承的类 5. 继承与友元…

webpack 学习入门

webpack 1. 简介1.1 webpack 是什么1.2 webpack 五个核心概念1.2.1 入口 - Entry1.2.2 出口 - Output1.2.3 Loader1.2.4 插件 - Plugins1.2.6 模式 - Mode 2. webpack 初体验2.1 初始化配置2.1.1. 准备2.1.2. 写代码2.1.3 编译打包应用 3. webpack 开发环境的基本配置3.1 打包样…

HTML(七)表格

https://chatgai.lovepor.cn/ 在HTML中&#xff0c;表格的标准形式如下&#xff1a; <table></table> 使用上面的语言&#xff0c;就已经生成了一个表格&#xff0c;只不过这个表格什么都没有 那么&#xff0c;该如何让表格存在东西呢&#xff1f; 首先&#xf…

springboot 整合spring ai实现 基于知识库的客服问答

rag 需求产生的背景介绍&#xff1a; 在使用大模型时&#xff0c;常遇到的问题之一是模型可能产生幻觉&#xff0c;即生成的内容缺乏准确性。此外&#xff0c;由于大模型不直接访问企业的专有数据&#xff0c;其响应可能会显得泛泛而谈&#xff0c;不够精准或具体&#xff0c;…

基于YOLOv10的农场实时目标检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

摘要&#xff1a; 基于YOLOv10的农场实时目标检测系统&#xff0c;利用4393张图片&#xff08;3905张训练集&#xff0c;488张验证集&#xff09;进行模型训练&#xff0c;最终开发出一个高效的农场目标检测模型。为了方便用户操作和实时检测&#xff0c;本系统还开发了基于Pyt…

VSCode运行QT界面

VSCode用久了,感觉Qt Creator的写起代码来还是不如VSCode得心应手,虽然目前还是存在一些问题,先把目前实现的状况做个记录,后续有机会再进一步优化。 当前方式 通过QtCreator创建一个CMake项目,然后使用CMake的方式在VSCode中进行编译。 claude给出的建议 左上角的名字会…

SiLM27212 270V 4A/4A 支持高频信号输入 集成自举二极管的高低边门极驱动器

SiLM27212系列选型&#xff1a; SiLM27212LEK-DG SiLM27212EK-DG SiLM27212LCA-DG SiLM27212CA-DG SiLM27212LCB-DG SiLM27212CB-DG SiLM27212系列是一款支持高频信号输入的高低边N沟道MOSFET驱动器&#xff0c;有着优异的性能&#xff0c;广泛应用于各类模…

Linux查看下nginx及使用的配置文件

1、查到nginx进程 ps -aef | grep nginx2、通过进行pid查到nginx路径 pwdx <pid>3、根据路径得到配置文件 path***/nginx -t如下&#xff1a;