React 的虚拟 DOM 和基于组件的架构使其非常高效,但如果没有适当的优化,您的应用程序仍然可能会遇到性能问题。让我们深入研究行之有效的策略,以消除不必要的重新渲染并提高 React 应用程序的性能。
在优化之前,我们需要了解 React 组件何时以及为何重新渲染:
并非所有重新渲染都是不好的,但不必要的重新渲染会影响性能。让我们探讨一下如何预防它们。
const MovieCard = React.memo(({ title, rating, onLike }) => { console.log(`MovieCard rendered: ${title}`); return ( <div className="card"> <h3>{title}</h3> <span>Rating: {rating}/10</span> <button onClick={onLike}>Like</button> </div> ); }); // Usage <MovieCard title="Inception" rating={9.3} onLike={() => handleLike('inception')} />
? 专业提示:虽然 React.memo 很强大,但要策略性地使用它。记住所有内容实际上会损害性能。
const MovieList = () => { const [movies, setMovies] = useState([]); const handleLike = useCallback((movieId) => { setMovies(prevMovies => prevMovies.map(movie => movie.id === movieId ? { ...movie, likes: movie.likes + 1 } : movie ) ); }, []); // Empty deps array as it only uses setState return movies.map(movie => ( <MovieCard key={movie.id} {...movie} onLike={() => handleLike(movie.id)} /> )); };
const MovieAnalytics = ({ movies }) => { const statistics = useMemo(() => ({ averageRating: movies.reduce((acc, m) => acc + m.rating, 0) / movies.length, topRated: [...movies].sort((a, b) => b.rating - a.rating)[0], totalLikes: movies.reduce((acc, m) => acc + m.likes, 0) }), [movies]); return ( <div> <h2>Analytics Dashboard</h2> <p>Average Rating: {statistics.averageRating.toFixed(1)}</p> <p>Most Popular: {statistics.topRated.title}</p> <p>Total Likes: {statistics.totalLikes}</p> </div> ); };
const MovieApp = () => { const [favorites, setFavorites] = useState(new Set()); // Lifted state handler const toggleFavorite = useCallback((movieId) => { setFavorites(prev => { const next = new Set(prev); if (next.has(movieId)) next.delete(movieId); else next.add(movieId); return next; }); }, []); return ( <div> <MovieList onFavorite={toggleFavorite} /> <FavoritesList ids={favorites} /> </div> ); };
function useMovieData(movieId) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { let mounted = true; async function fetchMovie() { setLoading(true); try { const response = await fetch(`/api/movies/${movieId}`); const movie = await response.json(); if (mounted) { setData(movie); setLoading(false); } } catch (error) { if (mounted) { console.error('Failed to fetch movie:', error); setLoading(false); } } } fetchMovie(); return () => { mounted = false; }; }, [movieId]); return { data, loading }; }
✅ 将 React.memo 用于纯函数式组件
✅ 为作为 props 传递的事件处理程序实现 useCallback
✅ 应用 useMemo 进行昂贵的计算
✅ 避免在渲染中创建内联对象
✅ 在列表中使用正确的关键道具
✅ 定期分析您的应用
❌过度优化
❌ 过早的优化
❌ 记住一切
❌ 在渲染中创建新的对象/数组
❌深度组件嵌套
React 19 带来了自动性能改进:
React 中的性能优化是代码复杂性和实际性能提升之间的平衡。从基础知识开始,衡量应用程序的性能,并在需要时进行优化。请记住:过早的优化是万恶之源!
✨ 我希望您觉得这有帮助!不要忘记喜欢并关注我以获取更多 React 提示和技巧!
?在 X (Twitter) 和 LinkedIn 上关注我,获取日常 Web 开发技巧和见解!
?不断编码,不断创造,不断改进!
祝您在这美好的一天取得成功并保持积极的态度。让我们一起创造奇迹吧! ?
以上是掌握 React 性能:防止不必要的重新渲染的开发人员指南的详细内容。更多信息请关注PHP中文网其他相关文章!