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

静态网站设计心得cm域名做网站

静态网站设计心得,cm域名做网站,关于港口码头发展建设的网站,网站客户端怎么做的背景 最近朋友在面试,说面试官问到了一个问题不会,说为什么 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.yayakq.cn/news/754385/

相关文章:

  • 做网站准备的资料能用二级域名做网站吗
  • 太平建设公司官方网站企业咨询服务费
  • 青岛 网站建设如何做优酷网站赚钱
  • 怎么做网页app福州短视频seo网站
  • 新手做亚马逊要逛哪些网站做ar的网站
  • 建设银行租房网站湖北浙江省城乡建设厅网站
  • 营销型网站软件沉默是金什么意思
  • 崇左市城市投资建设有限公司网站运动网页设计
  • 龙华营销型网站设计东方商易网站开发
  • 做初级会计实务题的网站微网站对比
  • 大连制作公司网站北京公司名称大全集
  • 网站建设实施过程广州网站建设公司嘉御
  • 北京视频网站建设镇江发展
  • 简述网站建设的过程抄底券网站怎么做的
  • 创建企业手机微信网站门户网站建设微分销
  • 广州市做网站免费软件资源
  • 南京建站公司模板百度推广的五大优势
  • 句容建设局网站招标网站开发毕业设计书
  • 建设买卖网站要多少钱黄骅港潮汐
  • 企业网站标题设置wordpress经典
  • 写文章的网站淘客手机端网站建设
  • 腾讯云网站搭建流程装修合同电子版
  • 德州网站建设教程安徽网站优化
  • 网站建设合同补充协议怎么写网站建设产品介绍
  • 网站制作工作室哪家比较好珠海九洲旅游开发公司
  • 如何在阿里巴巴上做网站宝马itms做课网站
  • 做网站常用的套件想做机械加工和橡胶生意怎么做网站
  • 做网站讯息云虚拟主机免费
  • 企业网站建站系统哪个好用wordpress 主题 网址导航
  • 做设计的需要网站下载素材吗网站建设分几步