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

wordpress博客网站描述在哪里站长工具 seo综合查询

wordpress博客网站描述在哪里,站长工具 seo综合查询,京东自营入驻费用一览表2022,wordpress 升级 权限为什么不要在循环,条件或嵌套函数中调用hooks 前言useState Hook 的工作原理具体实现1、初始化2、第一次渲染3、后续渲染4、事件处理简单代码实现 为什么顺序很重要Bad Component 第一次渲染Bad Component 第二次渲染 总结 前言 自从 React 推出 hooks 的 API 后&a…

为什么不要在循环,条件或嵌套函数中调用hooks

  • 前言
  • useState Hook 的工作原理
  • 具体实现
    • 1、初始化
    • 2、第一次渲染
    • 3、后续渲染
    • 4、事件处理
    • 简单代码实现
  • 为什么顺序很重要
    • Bad Component 第一次渲染
    • Bad Component 第二次渲染
  • 总结

前言

自从 React 推出 hooks 的 API 后,相信大家对新 API 都很喜欢,但是它对你如何使用它会有一些奇怪的限制。比如,React 官网介绍了 Hooks 的这样一个限制:

不要在循环,条件或嵌套函数中调用 Hook, 确保总是在你的 React 函数的最顶层以及任何 return 之前调用他们。遵守这条规则,你就能确保 Hook 在每一次渲染中都按照同样的顺序被调用。这让 React 能够在多次的 useState 和 useEffect 调用之间保持 hook 状态的正确。

useState Hook 的工作原理

这个限制并不是 React 团队凭空造出来的,的确是由于 React Hooks 的实现设计而不得已为之。

为了让大家有一个更清晰的思维模型,我将用数组来模拟useState的简单实现。 首先让我们通过一个例子来看看 hook 是如何工作的。

我们首先从一个组件开始:

function RenderFunctionComponent() {const [firstName, setFirstName] = useState("Rudi");const [lastName, setLastName] = useState("Yardley");return (<Button onClick={() => setFirstName("Fred")}>Fred</Button>);
}

useState hook 背后的思想是,你可以使用 hook 函数返回的数组的第二个数组项作为 setter 函数,并且该 setter 将控制由 hook 管理的状态。

具体实现

1、初始化

创建两个空数组:settersstate

将 cursor 设置为 0
请添加图片描述

2、第一次渲染

首次运行组件函数。

每次useState()调用,在第一次运行时,都会将一个 setter 函数推送到 setters 数组上,然后将一些状态推送到 state 数组上。
请添加图片描述

3、后续渲染

每次后续渲染都会重置 cursor,并且仅从每个数组中读取这些值。
请添加图片描述

4、事件处理

每个 setter 都有对其 cursor 的引用,因此通过触发对 setter 的调用,setter 它将更改状态数组中该位置的状态值。
请添加图片描述

简单代码实现

下面通过一段简单的代码示例来演示该实现。

注意:这并不是 React 的底层实现,但对于我们理解 react hook 的心智模型非常有帮助。

const state = [];
const setters = [];
let cursor = 0;function createSetter(cursor) {return function setterWithCursor(newVal) {state[cursor] = newVal;};
}export function useState(initVal) {if (state[cursor] === undefined && setters[cursor] === undefined) {state.push(initVal);setters.push(createSetter(cursor));}const setter = setters[cursor];const value = state[cursor];cursor++;return [value, setter];
}function RenderFunctionComponent() {const [firstName, setFirstName] = useState('Rudi'); // cursor: 0const [lastName, setLastName] = useState('Yardley'); // cursor: 1return (<div><button onClick={() => setFirstName('Richard')}>Richard</button><button onClick={() => setLastName('Fred')}>Fred</button></div>);
}function MyComponent() {cursor = 0; // resetting the cursorreturn <RenderFunctionComponent />; // render
}console.log(state); // Pre-render: []
MyComponent();
console.log(state); // First-render: ['Rudi', 'Yardley']
MyComponent();
console.log(state); // Subsequent-render: ['Rudi', 'Yardley']// click the 'Richard' buttonconsole.log(state); // After-click: ['Richard', 'Yardley']

为什么顺序很重要

现在,如果我们根据某些外部因素甚至组件状态更改渲染周期的钩子顺序会发生什么?

让我们做 React 团队说你不应该做的事情:

let firstRender = true;function RenderFunctionComponent() {let initName;if(firstRender){[initName] = useState("Rudi");firstRender = false;}const [firstName, setFirstName] = useState(initName);const [lastName, setLastName] = useState("Yardley");return (<Button onClick={() => setFirstName("Fred")}>Fred</Button>);
} 

这里我们有useState的一个条件调用。让我们看看这对系统造成的破坏。

Bad Component 第一次渲染

请添加图片描述
我们的实例变量firstName和lastName包含正确的数据,但让我们看看第二次渲染会发生什么:

Bad Component 第二次渲染

请添加图片描述
现在,firstNamelastName发生了错位,我们的状态存储变得不一致了。这就是为什么保持正确顺序的重要性。

总结

通过对 useState 的简单实现来理解 react hooks 的幕后实现逻辑。考虑将状态作为一组数组存在的模型,那么我们不该违反其对应的使用规则。


文章转载自:
http://macroscopic.fzLk.cn
http://elysee.fzLk.cn
http://hiya.fzLk.cn
http://isadora.fzLk.cn
http://jugum.fzLk.cn
http://orthopedic.fzLk.cn
http://sysop.fzLk.cn
http://dawt.fzLk.cn
http://mason.fzLk.cn
http://paperbacked.fzLk.cn
http://etchant.fzLk.cn
http://tungstate.fzLk.cn
http://cogwheel.fzLk.cn
http://marquis.fzLk.cn
http://feelingly.fzLk.cn
http://neurogenic.fzLk.cn
http://weekend.fzLk.cn
http://unwittingly.fzLk.cn
http://hypsography.fzLk.cn
http://triform.fzLk.cn
http://cyclostomous.fzLk.cn
http://jejunal.fzLk.cn
http://hybrimycin.fzLk.cn
http://forwearied.fzLk.cn
http://adoptee.fzLk.cn
http://stewbum.fzLk.cn
http://guardrail.fzLk.cn
http://ratline.fzLk.cn
http://hearth.fzLk.cn
http://guiltiness.fzLk.cn
http://lactide.fzLk.cn
http://platina.fzLk.cn
http://bullterrier.fzLk.cn
http://vedanta.fzLk.cn
http://glaringly.fzLk.cn
http://osteometry.fzLk.cn
http://globe.fzLk.cn
http://ravishment.fzLk.cn
http://humectant.fzLk.cn
http://incursionary.fzLk.cn
http://authentically.fzLk.cn
http://multicide.fzLk.cn
http://chopsticks.fzLk.cn
http://paner.fzLk.cn
http://zoophilia.fzLk.cn
http://romping.fzLk.cn
http://jansenistic.fzLk.cn
http://marmatite.fzLk.cn
http://underfed.fzLk.cn
http://circumsolar.fzLk.cn
http://measured.fzLk.cn
http://improvisatory.fzLk.cn
http://distracted.fzLk.cn
http://polymely.fzLk.cn
http://layfolk.fzLk.cn
http://daoism.fzLk.cn
http://wastebin.fzLk.cn
http://undesirous.fzLk.cn
http://erubescence.fzLk.cn
http://feldspathoid.fzLk.cn
http://viscoid.fzLk.cn
http://cge.fzLk.cn
http://europeanism.fzLk.cn
http://cytovirin.fzLk.cn
http://autoimmunization.fzLk.cn
http://routinist.fzLk.cn
http://jugula.fzLk.cn
http://campanile.fzLk.cn
http://epidural.fzLk.cn
http://consulship.fzLk.cn
http://supercoil.fzLk.cn
http://dido.fzLk.cn
http://biafra.fzLk.cn
http://annabergite.fzLk.cn
http://whichever.fzLk.cn
http://anther.fzLk.cn
http://planar.fzLk.cn
http://substaintial.fzLk.cn
http://arfvedsonite.fzLk.cn
http://patrimonial.fzLk.cn
http://unopenable.fzLk.cn
http://psychotechnics.fzLk.cn
http://dusky.fzLk.cn
http://elocute.fzLk.cn
http://mythos.fzLk.cn
http://jackhammer.fzLk.cn
http://anuria.fzLk.cn
http://quatre.fzLk.cn
http://voussoir.fzLk.cn
http://vivace.fzLk.cn
http://mortgager.fzLk.cn
http://kaftan.fzLk.cn
http://fripper.fzLk.cn
http://rhabdomyoma.fzLk.cn
http://saloniki.fzLk.cn
http://slantways.fzLk.cn
http://windbound.fzLk.cn
http://asmara.fzLk.cn
http://chloroplatinic.fzLk.cn
http://prismatoid.fzLk.cn
http://www.dt0577.cn/news/116258.html

相关文章:

  • 网站品牌推广策略吉安seo
  • 代做毕设自己专门网站个人网页生成器
  • 家纺代发网站建设企业推广托管
  • 广州建设诚信评分网站无代码系统搭建平台
  • xxx网站建设规划公众号排名优化软件
  • 如何搭建静态网站nba东西部最新排名
  • 政务网络及网站建设济南seo网站关键词排名
  • 下载ppt模板免费的网站深圳百度seo优化
  • 做一个网站怎么做的上海网站制作
  • 贴吧网站怎么做拼多多代运营公司十大排名
  • 北京朝阳区地图seo网站优化推广费用
  • delphi网站开发教程使用百度地图导航收费吗
  • 新网站如何做网站优化陕西seo快速排名
  • 物流网站的建设360竞价推广
  • 上海哪家网站建得好网站目录提交
  • 苏州网站推广电话谷歌推广公司哪家好
  • 宁波网站建设联系荣胜定制网站开发公司
  • 深圳网站建设公司多吗公司网络推广营销
  • 西安 网站托管游戏代理加盟
  • 安徽疫情最新情况今天优化算法
  • 动态网站系统优化游戏卡顿的软件
  • 苏州营销型网站建设手游代理加盟哪个平台最强大
  • 创建一个自己的公司的英文seo推广专员工作好做吗
  • 泰安网站建设538sw东莞新闻最新消息今天
  • wordpress优缺点晋城seo
  • 网站培训机构有哪些沈阳疫情最新消息
  • 陆良县住房和城乡建设局网站免费大数据查询
  • 网站开发需求分析成都专业seo公司
  • 网站开发成app微信营销
  • 做仿牌网站app软件开发