免费购物网站程序广告图案大全图片

张小明 2026/1/8 17:42:16
免费购物网站程序,广告图案大全图片,国内免费iphone网站,数字营销的4个特征一、Hooks 进阶#xff1a;脱离 Class 组件的核心能力 React Hooks 是现代 React 的基石#xff0c;除了 useState/useEffect 基础用法#xff0c;这些进阶 Hooks 是处理复杂逻辑的关键#xff1a; 1. useCallback useMemo#xff1a;性能优化#xff08;避免不必要…一、Hooks 进阶脱离 Class 组件的核心能力React Hooks 是现代 React 的基石除了useState/useEffect基础用法这些进阶 Hooks 是处理复杂逻辑的关键1. useCallback useMemo性能优化避免不必要的重渲染/计算核心场景组件重渲染时避免函数/计算结果重复创建导致子组件无效重渲染。useCallback缓存函数引用解决“每次渲染函数重新创建”问题useMemo缓存计算结果解决“每次渲染重复计算”问题。示例import { useState, useCallback, useMemo } from react; const Parent () { const [count, setCount] useState(0); const [name, setName] useState(React); // 缓存函数只有依赖空数组变化时函数引用才会更新 const handleClick useCallback(() { console.log(点击了); }, []); // 缓存计算结果只有 count 变化时才重新计算 const doubleCount useMemo(() { console.log(计算 doubleCount); return count * 2; }, [count]); return ( div pcount: {count}, double: {doubleCount}/p button onClick{() setCount(count 1)}加1/button button onClick{() setName(Vue)}改名字/button {/* 子组件接收缓存的函数避免因函数重新创建导致子组件重渲染 */} Child onClick{handleClick} / /div ); }; // 子组件用 React.memo 配合 useCallback实现“浅比较props才重渲染” const Child React.memo(({ onClick }) { console.log(子组件渲染); return button onClick{onClick}子组件按钮/button; });关键useCallback依赖数组为空 → 函数永久缓存依赖变化 → 函数重新创建useMemo不要用于“无意义的简单计算”比如count 1仅用于“重计算成本高”的场景比如大数据过滤、复杂公式必须配合React.memo组件/useMemo计算才能生效否则单独用无意义。2. useRef跨渲染周期保存数据 操作 DOM核心场景保存跨渲染周期的变量不会因 setState 触发重渲染直接操作 DOM 节点替代 Class 组件的this.refs保存上一次的状态/属性。示例import { useState, useRef, useEffect } from react; const RefDemo () { const [count, setCount] useState(0); // 1. 保存跨渲染周期的变量不会触发重渲染 const countRef useRef(0); // 2. 操作 DOM const inputRef useRef(null); // 3. 保存上一次的 count const prevCountRef useRef(0); useEffect(() { // 每次渲染后更新 prevCountRef prevCountRef.current count; // 操作 DOM聚焦输入框 inputRef.current.focus(); }, [count]); const handleAdd () { countRef.current 1; // 不会触发重渲染 setCount(count 1); }; return ( div input ref{inputRef} typetext / p当前 count: {count}上一次 count: {prevCountRef.current}/p pref 保存的 count: {countRef.current}/p button onClick{handleAdd}加1/button /div ); };3. useContext跨组件通信替代 props 层层传递核心场景祖孙组件、非相邻组件之间共享状态比如主题、用户信息避免“props 钻取”。示例// 1. 创建 Context const ThemeContext React.createContext(); // 父组件提供 Context 数据 const Parent () { const [theme, setTheme] useState(light); return ( ThemeContext.Provider value{{ theme, setTheme }} Child / /ThemeContext.Provider ); }; // 子组件无需接收 props直接消费 Context const Child () { // 2. 消费 Context const { theme, setTheme } useContext(ThemeContext); return ( div style{{ background: theme light ? #fff : #333, color: theme light ? #000 : #fff }} p当前主题{theme}/p button onClick{() setTheme(theme light ? dark : light)}切换主题/button /div ); };4. useReducer复杂状态逻辑管理替代多个 useState核心场景状态逻辑复杂比如多个状态互相关联、状态更新规则多替代 Redux 做轻量级状态管理。示例import { useReducer } from react; // 1. 定义 reducer 函数纯函数state action → 新 state const countReducer (state, action) { switch (action.type) { case ADD: return { ...state, count: state.count 1 }; case SUB: return { ...state, count: state.count - 1 }; case RESET: return { ...state, count: 0 }; default: return state; } }; const ReducerDemo () { // 2. 初始化 useReducer(reducer, 初始state) const [state, dispatch] useReducer(countReducer, { count: 0 }); return ( div pcount: {state.count}/p {/* 3. 分发 action触发 state 更新 */} button onClick{() dispatch({ type: ADD })}加1/button button onClick{() dispatch({ type: SUB })}减1/button button onClick{() dispatch({ type: RESET })}重置/button /div ); };5. useLayoutEffect同步执行 DOM 操作比 useEffect 早核心场景需要在 DOM 更新后、浏览器绘制前执行的操作比如测量 DOM 尺寸、避免页面闪烁。执行时机useLayoutEffect→ DOM 更新 → 浏览器绘制 →useEffect注意内部代码会阻塞浏览器绘制避免做耗时操作。示例import { useState, useLayoutEffect, useRef } from react; const LayoutEffectDemo () { const [width, setWidth] useState(0); const divRef useRef(null); useLayoutEffect(() { // DOM 更新后立即执行测量 div 宽度无闪烁 setWidth(divRef.current.offsetWidth); }, []); return div ref{divRef}该元素宽度{width}px/div; };二、自定义 Hooks状态逻辑复用React 高级用法的核心核心思想将组件中可复用的逻辑抽离成自定义 Hooks实现“逻辑复用代码解耦”替代 Class 组件的 HOC/Render Props。示例1封装“防抖”Hook// hooks/useDebounce.js import { useState, useEffect } from react; export const useDebounce (value, delay 500) { const [debouncedValue, setDebouncedValue] useState(value); useEffect(() { // 延迟更新 debouncedValue const timer setTimeout(() { setDebouncedValue(value); }, delay); // 清除定时器依赖变化时 return () clearTimeout(timer); }, [value, delay]); return debouncedValue; }; // 使用 const Search () { const [input, setInput] useState(); // 防抖后的输入值500ms 无变化才更新 const debouncedInput useDebounce(input, 500); // 仅在防抖后的值变化时请求接口 useEffect(() { if (debouncedInput) { console.log(请求搜索, debouncedInput); } }, [debouncedInput]); return input value{input} onChange{(e) setInput(e.target.value)} placeholder搜索... /; };示例2封装“请求数据”Hook// hooks/useRequest.js import { useState, useEffect } from react; export const useRequest (apiFn, dependencies []) { const [data, setData] useState(null); const [loading, setLoading] useState(true); const [error, setError] useState(null); useEffect(() { const fetchData async () { try { setLoading(true); const res await apiFn(); setData(res); } catch (err) { setError(err); } finally { setLoading(false); } }; fetchData(); }, dependencies); return { data, loading, error }; }; // 使用 const UserList () { // 传入接口函数依赖为空 → 仅初始化请求 const { data, loading, error } useRequest(() fetch(/api/users).then(res res.json()), []); if (loading) return div加载中.../div; if (error) return div出错了{error.message}/div; return ( ul {data?.map(user ( li key{user.id}{user.name}/li ))} /ul ); };三、性能优化进阶1. React.memo组件浅比较避免无意义重渲染作用对函数组件做“浅比较 props”只有 props 变化时才重渲染注意仅对比 props 的“浅值”基本类型、引用类型的地址深对象变化需配合useCallback/useMemo。2. shouldComponentUpdateClass 组件手动控制重渲染作用Class 组件中返回true则重渲染false则跳过替代函数组件用React.memouseCallback/useMemo。3. React.lazy Suspense代码分割按需加载组件核心场景减小首屏加载体积只加载当前页面需要的组件比如路由懒加载。示例import { lazy, Suspense } from react; import { BrowserRouter, Routes, Route } from react-router-dom; // 1. 懒加载组件代码分割 const Home lazy(() import(./components/Home)); const About lazy(() import(./components/About)); const App () { return ( BrowserRouter {/* 2. Suspense指定加载中的 fallback */} Suspense fallback{div加载中.../div} Routes Route path/ element{Home /} / Route path/about element{About /} / /Routes /Suspense /BrowserRouter ); };4. 不可变数据避免意外的状态修改React 状态更新依赖“不可变数据”直接修改原对象不会触发重渲染推荐用immer简化不可变操作import { useState } from react; import { produce } from immer; const ImmerDemo () { const [user, setUser] useState({ name: React, age: 18 }); const handleUpdate () { // 传统方式手动解构易出错 // setUser({ ...user, age: user.age 1 }); // immer 方式直接“修改”草稿自动生成不可变新对象 setUser(produce(draft { draft.age 1; })); }; return ( div pname: {user.name}, age: {user.age}/p button onClick{handleUpdate}加1岁/button /div ); };四、高级模式跨场景解决方案1. 错误边界Error Boundary捕获组件内的错误核心场景避免单个组件报错导致整个应用崩溃仅支持 Class 组件React 暂未提供 Hooks 版本。示例class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state { hasError: false, error: null }; } // 捕获子组件的错误 static getDerivedStateFromError(error) { return { hasError: true, error }; } // 记录错误日志 componentDidCatch(error, info) { console.error(错误信息, error, info); } render() { if (this.state.hasError) { // 自定义错误提示 return div出错了{this.state.error?.message}/div; } return this.props.children; } } // 使用包裹可能出错的组件 const App () { return ( ErrorBoundary PotentiallyErrorComponent / /ErrorBoundary ); };2. 端口转发Portals将组件渲染到 DOM 树外核心场景弹窗、模态框、提示框等避免被父组件的样式比如overflow: hidden遮挡。示例import { createPortal } from react-dom; const Modal ({ children, visible }) { if (!visible) return null; // 渲染到 body 下的 div而非当前组件的 DOM 层级 return createPortal( div style{{ position: fixed, top: 0, left: 0, right: 0, bottom: 0, background: rgba(0,0,0,0.5), display: flex, alignItems: center, justifyContent: center }} div style{{ background: #fff, padding: 20 }}{children}/div /div, document.body // 目标 DOM 节点 ); }; // 使用 const PortalDemo () { const [visible, setVisible] useState(false); return ( div style{{ height: 200, overflow: hidden, border: 1px solid #eee }} button onClick{() setVisible(true)}打开弹窗/button Modal visible{visible}{/* 弹窗内容不会被父组件 overflow 遮挡 */}/Modal /div ); };3. 服务器组件RSCReact 18 新特性核心场景服务端渲染组件减少客户端 JS 体积提升首屏加载速度Next.js 已深度集成。特点组件在服务端运行不依赖浏览器 API可直接访问数据库注意需配合 React 18 服务端渲染框架Next.js、Remix使用。五、总结高级用法的核心价值React 高级用法的本质是复用自定义 Hooks 实现逻辑复用替代传统的 HOC/Render Props性能useCallback/useMemo/React.memo减少无效渲染React.lazy分割代码解耦useContext/useReducer简化状态管理避免 props 钻取和冗余 state兼容错误边界、Portals 解决特殊场景的 UI/交互问题学习建议先掌握基础 HooksuseState/useEffect再逐步学习进阶 Hooks自定义 Hooks 是核心从封装小逻辑防抖、请求开始逐步抽象复杂逻辑性能优化要“按需使用”不要过度优化比如简单组件无需useCallback结合实际场景比如表单、列表、弹窗练习理解“为什么用”比“怎么用”更重要。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

邢台建设企业网站价格上海网站改版服务

影刀RPAAI强强联合!小红书品牌笔记自动创建,效率提升20倍!🚀还在为品牌合作笔记的重复劳动头疼?手动创建、格式调整、内容校对耗尽心力的日子该结束了!今天,我将分享一个AI加持的影刀RPA解决方案…

张小明 2026/1/8 6:53:44 网站建设

优质网站有哪些小程序定制开发中软

在寻找能够满足最苛刻工作负载的存储解决方案吗?让我们来认识联想的下一代NVMe解决方案——DE6600系列。它专为速度、简便性和可扩展性而打造,让您能够专注于真正重要的事情:驱动业务发展。产品亮点两款强大型号:DE6600F提供全闪存…

张小明 2026/1/8 4:41:19 网站建设

网站前端 设计做spa的网站怎么推广

如何快速获取同花顺问财数据:pywencai完整使用指南 【免费下载链接】pywencai 获取同花顺问财数据 项目地址: https://gitcode.com/gh_mirrors/py/pywencai pywencai是一个强大的Python开源工具,专门用于帮助用户轻松获取同花顺问财平台的股票数据…

张小明 2026/1/8 4:39:35 网站建设

建立平台网站需要花多少钱南京中企动力有限公司

目录 一、回忆类加载过程 二、类加载器 1、定义与本质 2、JVM内置类加载体系 3、自定义类加载器 ClassLoader类中的两个关键方法: 核心原则: 4、类加载器加载的顺序 (1)核心:双亲委派模型下的委托与加载顺序 1&#xff…

张小明 2026/1/8 10:24:39 网站建设

网站推广软件推广抖音关键词seo系统

文章目录前言1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址前言 Joplin 是一款主打多端同步的笔记工具,支持文字、图片、附件等多种内容格式,还能加密存储,适合学生整理资料、上…

张小明 2026/1/8 10:30:24 网站建设

商城网站建设的注意事项首钢建设网站

Unlock Music音频解密工具完全教程:浏览器端音乐格式转换终极指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目…

张小明 2026/1/8 10:26:27 网站建设