问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

从原理上解读useState钩子函数

发布网友 发布时间:2024-10-02 20:26

我来回答

1个回答

热心网友 时间:2024-11-04 09:44

原生useState具有的几个特点

返回一个数组,数组的第一个参数值是状态值,第二个参数值是设置状态的方法。

useState会判断传入的state是初始值还是已存在的值。

useState可能被多次调用

调用设置状态的方法后需要重新渲染组件。

手写useState第一步:用不同的数组来分别存放状态值和设置状态的方法letstates=[];letsetters=[];letstateId=0;第二步:判断useState传入的初始状态值是否已经存在

存在用以前的,不存在则使用初始状态值

states[stateId]=states[stateId]?states[stateId]:initialState;第三步:通过状态的id来返回设置状态的方法,然后加入到设置方法的数组中

注意:自定义的渲染函数必须能够操作全局的状态id.

setters.push(createSetter(stateId));functioncreateSetter(stateId){returnfunction(newState){states[stateId]=newState;myRender();}}functionmyRender(){stateId=0;ReactDOM.render(<App/>,document.querySelector('#root'));}第四步:返回第i个状态值和操作状态的方法,并对stateId+1letvalue=states[stateId];letsetter=setters[stateId];stateId++;return[value,setter]完整代码importReactfrom'react'importReactDOMfrom'react-dom'//自定义Hook/***@description:手写useState*@param{*}*@return{*}*/letstates=[];letsetters=[];letstateId=0;functioncreateSetter(stateId){returnfunction(newState){states[stateId]=newState;myRender();}}functionmyRender(){stateId=0;ReactDOM.render(<App/>,document.querySelector('#root'));}functionmyUseState(initialState){//判断state是否存在,存在则使用以前的,不存在则使用初始值states[stateId]=states[stateId]?states[stateId]:initialState;setters.push(createSetter(stateId));letvalue=states[stateId];letsetter=setters[stateId];stateId++;return[value,setter]}functionApp(){const[count,setCount]=myUseState(0);const[name,setName]=myUseState('张三');return(<div><h1>当前求和为:{count}</h1><buttononClick={()=>setCount(count+1)}>点我+1</button><h1>当前姓名为:{name}</h1><buttononClick={()=>setName('李四')}>点我切换姓名</button></div>)}ReactDOM.render(<App/>,document.querySelector('#root'));CodeSandBox在线实现地址

在线实现

参考资料

官方文档:useState

从源码剖析useState的执行过程

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
主板debug接口怎么使用 Chloe的词根来自哪里 chloe是哪里的牌子 虚言状是怎么讲的 不堪言状的近义词 言状造句 千岛湖森林公园铁索桥地址在哪里? 青岛巨峰风景区-铁索桥地址在哪里? 九潭铁索桥地址在哪里? 铁索桥地址在哪里? 寻仙属性点、技能点怎么加 我和老公都属狗,我是1982年正月初四生日,他是1982年农历2月24生日。属... 《tbc》荣誉装备在 我是1982年8月28日是农历我老婆是1981年10月6日请大师指点我的婚姻? 二、在React中正确使用useState的姿势 我和老公都属狗,我是82年农历2月15的,老公是82年农历6月初6,想要属虎... 王移芝研究领域 ...老婆是1982.9.3(阴历7.16).请问我们要个属兔的孩子.几月比较... 寻仙中关于加属性点的问题 QQ寻仙人物在哪加属性点?从几级开始有属性点?技能点从哪来???为什么... 魔兽世界tbc战场荣誉点装备在哪换-tbc战场荣誉点装备兑换位置分享 计算机系列教材:大学计算机基础实验教程适用的出版社和发行年份是什么... 健身房的增肌训练计划是怎样的? 夏天开车如何保持车内空气清新求解答 为什么三体人不阻止古筝行动? ♾️能形容爱一个人吗? 《三体》中的"古筝计划"怎么没人逃生 关于开车开车窗有没什么讲究? 耳挂式耳机一定会漏音吗?有没有不漏音的?(三星手机能用的)求推荐,顺便... 我DNF驭剑士70级黑色瘟疫一套 手镯死亡抉择 项链龙灵石... 寻仙各个职业的属性点怎么加的? iphone6 plus和iphone6s plus有什么区别 寻仙怎么增加人物基本属性? 急求,合同制法警通过司法考试能不能转成法官,还有什么硬性的条件嘛... 杭州浙大博学教育咨询有限公司浙大博学核心团队 谁可以帮我找一份法警心得,谢谢了啊 做好自己的八字短句 苹果6s闪退黑屏,然后按下home键就会好了 现在豫p车可以在山西静乐下高速吗? 我关注的qq部落能不能设置不让任何人看到我关注的部落?不取消关注的... 怎么设置页码横版和竖版 怎么把小米手机国家设置成海外 特别吸粉的短句 永远奔赴最美好的自己! 郑州至项城、周口等地方的汽车怎么那么牛呀? 小米12 PRO 刷 MIUI 14 海外版(Android 12) 豫P是哪个城市的车牌号? 小米手机海外版怎么更新系统 努力短句致自己精选93句 豫p是河南什么地方的牌照,河南车牌字母ABCDEF代表哪个地方? 豫P车牌属于哪个城市?