React 进阶阶段学习计划

server/2024/10/22 15:09:41/

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.ppmy.cn/server/133932.html

相关文章

全天候风险平价策略下载 | Quantlab AI v0.2:OpenAI的Swarm适配国内大模型(附python代码下载)

原创内容第679篇&#xff0c;专注量化投资、个人成长与财富自由。 今天我们来实现服务端策略下载&#xff0c;下载后支持在本地调试运作&#xff0c;及查看源代码。 通过服务器下载策略的代码&#xff1a; login_required def down_strategy(request, task_id: str):task m…

基于深度学习的设备异常检测与预测性维护

基于深度学习的设备异常检测与预测性维护是一项利用深度学习技术分析设备运行数据&#xff0c;实时检测设备运行过程中的异常情况&#xff0c;并预测未来可能的故障&#xff0c;以便提前进行维护&#xff0c;防止意外停机和生产中断。它在工业领域应用广泛&#xff0c;特别是在…

SpringCloud-持久层框架MyBatis Plus的使用与原理详解

在现代微服务架构中&#xff0c;SpringCloud 是一个非常流行的解决方案。而在数据库操作层面&#xff0c;MyBatis Plus 作为 MyBatis 的增强工具&#xff0c;能够简化开发&#xff0c;提升效率&#xff0c;特别是在开发企业级应用和分布式系统时尤为有用。本文将详细介绍 MyBat…

c语言基础程序——经典100道实例。

c语言基础程序——经典100道实例 001&#xff0c; 组无重复数字的数002&#xff0c;企业发放的奖金根据利润提成003&#xff0c;完全平方数004&#xff0c;判断当天是这一年的第几天005&#xff0c;三个数由小到大输出006&#xff0c;输出字母C图案007&#xff0c;特殊图案008&…

使用ollama本地部署qwen2并api调用

目录 一、下载ollama 二、安装qwen大模型 三、Api调用 四、尝试apifox调用 一、下载ollama Ollama 是一个开源的、本地运行的 AI 聊天模型&#xff0c;允许在自己的设备上运行 LLM&#xff0c;无需依赖云服务。它支持多种 LLM。目前Ollama library已经支持Qwen2&#xf…

ASP.NET.Web应用程序(.NET Framework)添加Swagger本地Debuge成功打开接口展示界面,发布服务器无法打开接口展示界面

前言 提示&#xff1a;项目使用ASP.NET.Web应用程序&#xff08;.NET Framework4.6.1&#xff09;创建WEB API接口供外部系统调用。本地Debug运行可支持https://localhost:44374/swagger/打开界面展示操作&#xff0c;发布使用Release部署服务器时打开界面展示失败。 一、Swag…

一文掌握Cephadm部署Ceph存储集群

&#x1f4da; 博客主页&#xff1a; StevenZeng学堂 &#x1f389; 本文专栏: 一文读懂Kubernetes一文读懂Harbor云原生安全实战指南云原生存储实践指南 ❤️ 摘要&#xff1a;随着企业数据量的增长和存储需求的复杂化&#xff0c;Ceph因其高可扩展性和灵活性&#xff0c;能…

Python爬虫:urllib_post请求百度翻译(06)

#post的请求 import urllib.request import urllib.parse import jsonurl https://fanyi.baidu.com/sugheaders {user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36}data {kw : spider }#post请…