当前位置: 首页 > news >正文

团购网站模板免费下载wordpress导航小图标

团购网站模板免费下载,wordpress导航小图标,品牌营销策划方案ppt,义乌网站搭建在日常开发中,我们经常用到 React 的状态管理 Hook:useState 和 useReducer。 但你有没有想过:这些 Hook 内部是怎么实现的?为什么调用 setState 之后组件会重新渲染? 今天我们就来从零手写 useState 和 useReducer&am…

在日常开发中,我们经常用到 React 的状态管理 Hook:useStateuseReducer
但你有没有想过:这些 Hook 内部是怎么实现的?为什么调用 setState 之后组件会重新渲染?

今天我们就来从零手写 useState 和 useReducer,理解它们的原理。


一、React Hook 的本质

在 React 中,每个函数组件调用时都会按照 调用顺序 来记录 Hook。
比如下面的例子:

function Counter() {const [count, setCount] = useState(0);const [name, setName] = useState("张三");return (<div><p>{count}</p><p>{name}</p></div>);
}

React 内部会维护一个 数组(或链表) 来存储这些 Hook 对应的状态:

hooks = [{ state: 0 },        // count{ state: "张三" }     // name
]
  • 每次组件渲染时,useState 都会返回这个位置对应的状态。
  • 调用 setState 时,会更新状态并触发组件重新渲染。

所以:Hook 的核心 = 存储状态 + 按顺序取出


二、手写 useState

我们先写一个最简版的 React Hook 运行环境:

let hookStates = []; // 存放所有 hook 的状态
let hookIndex = 0;   // 当前执行到第几个 hookfunction useState(initialValue) {const currentIndex = hookIndex; // 记录当前 hook 的位置// 第一次渲染:存储初始值if (hookStates[currentIndex] === undefined) {hookStates[currentIndex] = initialValue;}// 获取当前状态const state = hookStates[currentIndex];// 更新函数const setState = (newValue) => {hookStates[currentIndex] =typeof newValue === "function"? newValue(hookStates[currentIndex]): newValue;render(); // 触发重新渲染};hookIndex++; // 下一个 hook 位置return [state, setState];
}

这里我们做了几件事:

  1. hookStates 保存所有状态。
  2. hookIndex 保证按顺序存取。
  3. setState 更新状态后调用 render,模拟 React 重新渲染。

三、测试 useState

写一个小 demo:

function Counter() {const [count, setCount] = useState(0);const [name, setName] = useState("张三");console.log("render:", { count, name });return {add: () => setCount(count + 1),rename: () => setName("李四"),};
}// 模拟渲染
function render() {hookIndex = 0; // 每次渲染重置app = Counter();
}let app;
render();// 测试
app.add();    // count 从 0 → 1
app.rename(); // name 从 "张三" → "李四"

运行过程:

render: { count: 0, name: '张三' }
render: { count: 1, name: '张三' }
render: { count: 1, name: '李四' }

✅ 我们的 useState 成功模拟了 React 的状态管理!


四、手写 useReducer

useReducer 的本质就是 useState 的加强版:

  • useState 直接存值
  • useReducerreducer 函数 来更新值

我们来实现它:

function useReducer(reducer, initialValue) {const [state, setState] = useState(initialValue);function dispatch(action) {const newState = reducer(state, action);setState(newState);}return [state, dispatch];
}

是不是很眼熟?
其实 React 源码里 useState 就是 useReducer 的语法糖:

function useState(initialValue) {return useReducer((state, action) => action, initialValue);
}

五、测试 useReducer

来写一个计数器:

function reducer(state, action) {switch (action.type) {case "add":return state + 1;case "sub":return state - 1;default:return state;}
}function Counter2() {const [count, dispatch] = useReducer(reducer, 0);console.log("render:", { count });return {add: () => dispatch({ type: "add" }),sub: () => dispatch({ type: "sub" }),};
}// 模拟渲染
function render() {hookIndex = 0;app = Counter2();
}let app;
render();app.add(); // count: 0 → 1
app.add(); // count: 1 → 2
app.sub(); // count: 2 → 1

输出:

render: { count: 0 }
render: { count: 1 }
render: { count: 2 }
render: { count: 1 }

完美模拟 ✅


六、总结

  • useState:存储值,返回 [state, setState]
  • useReducer:存储值 + reducer 逻辑,返回 [state, dispatch]
  • 关系useState = useReducer 的简化版。

什么时候用哪个?

  • 逻辑简单(计数器、表单输入) → 用 useState
  • 逻辑复杂(多个状态、复杂操作) → 用 useReducer

结语

通过手写,我们发现 React Hook 并没有什么黑魔法:
它只是 按照调用顺序存储状态,并在更新时触发重新渲染。

理解了原理,再写业务代码时就更清晰:
为什么 Hook 不能写在 if/for 里?为什么每次渲染必须顺序一致?
—— 因为 React 就是用数组来按顺序存储的

http://www.dtcms.com/a/570097.html

相关文章:

  • 企业网站建设的意义做米业的企业网站
  • MySQL系列之数据类型(String)
  • Janet 介绍
  • 有关于网站开发的参考文献订阅号可以做网站么
  • 基于瑞芯微 RK3588 的 ARM 与 FPGA 交互通信实战指南
  • 电商平台系统分销系统保定seo排名公司
  • js 的异步编程解决方案
  • 排队选人-2024年秋招-小米集团-软件开发岗-第二批笔试
  • 告别混乱!Spring Boot + MyBatis 标准化开发:结构解析 + 接口实战 + Checklist
  • 滨州网站建设哪家专业外贸网站外链怎么做
  • 光刻胶分类与特性:正性胶和负性胶以及SU-8厚胶和AZ 1500 系列光刻胶(下)
  • 上海市建上海市建设安全协会网站网站的优化通过什么做上去
  • [vue3] h函数,阻止事件冒泡
  • 渲染学进阶内容——模型(3)
  • 企业微信智能机器人消息监听与回复完整指引
  • MySQL基础题
  • Spring MVC中@RequestMapping注解的全面解析
  • 网站建设流程有几个阶段wordpress页脚菜单横排
  • 西宁建设网站价格低桂林漓江风景图片
  • Linux工具介绍——自动化构建工具make/Makefile
  • 如何在springboot添加静态页面
  • 北京网站设计外包公司大兴高米店网站建设
  • Linux 进程通信(IPC)一站式笔记:概念 → 常用方式 → 函数原型与参数详解
  • 盐城网站推广wordpress手机pc分开模板
  • 建立网站时要采用一定的链接结构网站建设最简单的教程视频教程
  • 泰安手机网站建设电话肇庆自助网站建设系统
  • 基于Vue的地铁综合服务管理系统7949eg04(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 房产网站建设接单如何在手机上做微电影网站
  • Oracle AWR管理与快照操作完整指南
  • 济源专业做网站公司又拍云WordPress 插件