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

网站建设网络推广加盟百度推广竞价开户

网站建设网络推广加盟,百度推广竞价开户,鹤山市网站建设公司,办公室装修费用分几年摊销背景 最近朋友在面试,说面试官问到了一个问题不会,说为什么 react hooks为什么不能写在条件语句里,今天我们来研究一下这个问题。 我们在来简单实现一个 useState: const reRender () > {stateIndex -1 ReactDOM.render(&…

背景

最近朋友在面试,说面试官问到了一个问题不会,说为什么 react hooks为什么不能写在条件语句里,今天我们来研究一下这个问题。

我们在来简单实现一个 useState:

const reRender = () => {stateIndex = -1 ReactDOM.render(<App/>,document.getElementById('root'))
}let stateQueue = []; // 用于存放每个useState返回值。
let stateIndex = -1;  //给每个 useState的返回值一个序号。
function useState(initState) {stateIndex++;stateQueue[stateIndex] = stateQueue[stateIndex] || initState;const currentIndex = stateIndexfunction setState(newState) {stateQueue[currentIndex] = newState;reRender(); //组件重渲染}return [stateQueue[stateIndex],setState]
}

我们用上面写的 useState 来测试看看下面代码的执行过程

function RenderFunctionComponent() {const [name, setName] = useState("Lvan");const [age, setAge] = useState("0");return (<div>{name}</div><div>{age}</div><Button onClick={() => setName("Tom")}>name设置为Tom</Button>);
}

调用两次 useState 后:

stateQueue: ["Lvan", "0"]
stateIndex: 1

这时候点击按钮调用 setName,由于闭包的原因,当前这里的 currentIndex 为 0,然后触发了

stateQueue[0] = "Tom"
// reRender()
stateIndex = -1 
ReactDOM.render(<App/>,document.getElementById('root'))

此时重新渲染,并且会重新调用一遍 useState,而这时 stateQueue 已经是 ["Tom", "0"] 了,触发stateQueue[0] = stateQueue[0] || initState;,这样就把 Tom 渲染到页面上了。

这是基本的渲染过程,将下来我们看看如果加到条件语句里面是怎么渲染的:

let show = false;
function RenderFunctionComponent() {if (show) {const [name, setName] = useState("Lvan");}const [age, setAge] = useState("0");return (<div>{name}</div><div>{age}</div><Button onClick={() => setName("Tom")}>name设置为Tom</Button>);
}

很明显,如果这里加上 if 判断,那么 render 的时候,这个 index 就不能一一对应上了。

那么有的同学就会问了,为什么要用这种设计,就不能换种设计方案,比如用一个参数来对应起来。比如说 const [name, setName] = useState("name", "Lvan");,这样就可以知道我是设置 name 这个字段了而不是找 index,这样做当然可以实现。

我觉得 react 没有这样做可能有几个原因:

  • 这样更简洁
  • 函数式开发
  • 并发性能高

总结

所以为了回答题目的问题,我们可以说因为 hooks 内部使用链表来实现。

但是,并不是因为 hooks 内部使用链表来实现,所以我们必须保证 hooks 的调用顺序。这种观点显然倒置了因果关系。

正确的说法是:因为我们为了保证了 hooks 的调用顺序(不保证就会报错),所以 hooks 内部可以使用链表来实现。

参考资料

https://www.zhihu.com/question/532521785/answer/2490282912

http://www.yidumall.com/news/110054.html

相关文章:

  • 大连免费建站网络营销推广及优化方案
  • 唐河做网站roseonly企业网站优化
  • 免费推广网站哪家好百度推广有效果吗
  • 湖南长沙网站建设2022新闻热点10条
  • 鞍山吧台seo引擎优化是什
  • 自己做优惠劵网站河南郑州最新消息
  • 网站建设专家如何选百度商业平台
  • 免费注册com域名草根seo视频大全网站
  • 漏惹网站做永久免费linux服务器
  • 厦门seo网站智推教育seo课程
  • html做静态网站陕西新站seo
  • 怎么打开google网站怎样推广产品
  • 重庆做网站建设公司seo是什么职位
  • 自建站是属于什么模式淄博seo推广
  • 佛山市网站建设搜全网的浏览器
  • 有哪些网站平台石家庄今天最新新闻头条
  • 昆明小程序开发公司哪家好排名优化公司电话
  • 为什么谷歌网站打不开搜索引擎优化的英文缩写
  • 网站建设北京市网络平台推广广告费用
  • 贵州百度seo整站优化seo工具不包括
  • 个人简历范文100字德阳seo优化
  • 网站做定制还是固定模板查网站是否正规
  • 做服装行业网站怎么每天更新内容怎么给网站做优化
  • 网站制作公司珠海nba最新交易
  • 携程网站建设项目个人做外贸怎样起步
  • 做网站的叫什么软件怎么推广游戏叫别人玩
  • 苏州电子商务网站建设网站首页快速收录
  • 南通网站建设知识武汉网络推广广告公司
  • 河北住房和城乡建设厅网站卡100个成功营销策划案例
  • asp.net做的小网站营销策略怎么写