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

咸宁网站建设怎么分析一个网站seo

咸宁网站建设,怎么分析一个网站seo,wordpress转发插件,网站聊天工具代码为什么避免在循环、条件或嵌套函数中调用 Hooks 为了确保 Hook 在每一次渲染中都按照同样的顺序被调用。这让 React 能够在多次的 useState 和 useEffect 调用之间保持 hook 状态的正确。 我们可以在单个组件中使用多个 State Hook 或 Effect Hook: function Form…

为什么避免在循环、条件或嵌套函数中调用 Hooks

为了确保 Hook 在每一次渲染中都按照同样的顺序被调用。这让 React 能够在多次的 useState 和 useEffect 调用之间保持 hook 状态的正确。

我们可以在单个组件中使用多个 State Hook 或 Effect Hook:

function Form() {// 1. 使用变量名为 name 的 stateconst [name, setName] = useState('Mary');// 2. 使用 effect 以保存 form 操作useEffect(function persistForm() {localStorage.setItem('formData', name);});// 3. 使用变量名为 surname 的 stateconst [surname, setSurname] = useState('Poppins');// 4. 使用 effect 以更新标题useEffect(function updateTitle() {document.title = name + ' ' + surname;});// ...
}

那么 React 怎么知道哪个 state 对应哪个 useState?答案是 React 靠的是 Hook 调用的顺序。

let hookStates = []; // 放着此组件的所有的hooks数据
let hookIndex = 0; // 代表当前的hooks的索引
function useState(initialState){// 如果有老值取老值,没有取默认值hookStates[hookIndex] = hookStates[hookIndex] || initialState;// 暂存索引let currentIndex = hookIndex;//setState方法,将当前值置为新值function setState(newState){hookStates[currentIndex] = newState;//置完新值,立刻触发渲染render();}return [hookStates[hookIndex++], setState];
}

因为我们的示例中,Hook 的调用顺序在每次渲染中都是相同的,所以它能够正常工作:

// ------------
// 首次渲染
// ------------
useState('Mary')           // 1. 使用 'Mary' 初始化变量名为 name 的 state
useEffect(persistForm)     // 2. 添加 effect 以保存 form 操作
useState('Poppins')        // 3. 使用 'Poppins' 初始化变量名为 surname 的 state
useEffect(updateTitle)     // 4. 添加 effect 以更新标题// -------------
// 二次渲染 
// useState - 不再使用传入的默认值,而是返回上次渲染时存储的状态值。
// useEffect 首先运行之前 useEffect 的清理函数(如果有的话),然后再运行新的副作用函数。
// -------------
useState('Mary')           // 1. 读取变量名为 name 的 state(Mary参数被忽略)
useEffect(persistForm)     // 2. 清除并替换上一次 form 的 effect
useState('Poppins')        // 3. 读取变量名为 surname 的 state(Poppins参数被忽略)
useEffect(updateTitle)     // 4. 清除并替换上一次更新标题的 effect// ...

useEffect Hook有什么作用?如何理解 替换与清除?

告诉 React 需要在完成DOM更新之后(渲染之后)执行一些“副作用”(如数据获取、手动更改DOM、设置订阅或者清除上一次的副作用等)。

useEffect(persistForm) 在首次渲染时添加了一个副作用,即 persistForm 函数。然后,在随后的组件更新(第二次渲染)中,相同的 useEffect(persistForm) 调用会首先清除前一次的副作用(如果 persistForm 返回了一个清除函数的话),然后再执行新的 persistForm 副作用。

这样确保了副作用是最新的,并且在多次渲染之间不会有冲突。这也是为什么我们说第二次和随后的渲染是“替换”前一次的副作用。

只要 Hook 的调用顺序在多次渲染之间保持一致,React 就能正确地将内部 state 和对应的 Hook 进行关联。但如果我们将一个 Hook (例如 persistForm effect) 调用放到一个条件语句中会发生什么呢?

比如:

// ???? 在条件语句中使用 Hook 违反第一条规则if (name !== '') {useEffect(function persistForm() {localStorage.setItem('formData', name);});}

在第一次渲染中 name !== ‘’ 这个条件值为 true,所以我们会执行这个 Hook。但是下一次渲染时我们可能清空了 name,表达式值变为 false。此时的渲染会跳过该 Hook,Hook 的调用顺序发生了改变:

useState('Mary')           // 1. 读取变量名为 name 的 state(参数被忽略)
// useEffect(persistForm)  // ???? 此 Hook 被忽略!
useState('Poppins')        // ???? 2(之前为 3)。读取变量名为 surname 的 state 失败
useEffect(updateTitle)     // ???? 3 (之前为 4)。替换更新标题的 effect 失败
  1. 第一次调用 useState('Mary'),此时 hookIndex=0,状态被存储在 hookStates[0]

  2. 然后我们跳过 useEffect(persistForm)

  3. 接下来的 useState('Poppins') 会使用 hookIndex=1,但在上一次渲染中,它使用了 hookIndex=2。这会导致 surname 的状态从错误的位置获取。

  4. 以此类推,后续的 useEffect(updateTitle) 也会使用错误的索引。

http://www.khdw.cn/news/56557.html

相关文章:

  • 做免费网站怎么赚钱百度seo优化是做什么的
  • 做网站的公司哪家强百度小说排行榜总榜
  • 桥南做网站网页快照
  • 苏州微信网站建设网站seo专员
  • 郑州高考网站建设深圳招聘网络推广
  • 黄骅市人民医院官网seo的搜索排名影响因素有
  • asp做学生信息网站建立网站要多少钱一年
  • 网站都不需要什么备案时事新闻最新2022
  • 广州专业做网站销售外包
  • 寮步仿做网站第一接单网app地推和拉新
  • 独特网站的百度seo优化教程免费
  • 网站建设nayuwang怎么注册域名网址
  • 谁做响应式网站百度指数大数据分享平台
  • 公司做网站开票是什么项目百度信息流广告推广
  • 添加建设银行的网站91永久海外地域网名
  • 如何做网站公众号推广西安网站公司推广
  • 国外网页素材网站谷歌商店下载官方
  • 网站的主题关键词代做排名推广
  • 做网站时,404网页如何指向南宁网站推广营销
  • 又做投资的网站吗域名是什么
  • 承德网站制作方案百度软件中心官网
  • 做贺卡 网站win10优化大师免费版
  • 疫情结束了吗最新消息青山seo排名公司
  • 网站页面优化方法有哪些内容seo收费低
  • 企业网站部署计划北京疫情发布不再公布各区数据
  • 做文字logo的网站河南seo推广
  • 南昌网站关键词排名网络推广平台网站推广
  • 商业网站开发实训内容深圳网站优化培训
  • 学网站建设 赚钱营销推广渠道
  • asp 网站 500郑州seo外包顾问热狗