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

网站做支付需要准备什么百度权重1是什么意思

网站做支付需要准备什么,百度权重1是什么意思,成都网站建设潮州,那个视频网站好摘要 在React中,如果涉及到了多次setState,组件render几次。setState是同步的还是异步的。这是一个很常见的面试题。 而本篇文章,就是主要实现React中,对于这部分的性能优化,我们称之为批处理。例如当我有下面的JSX。…

摘要

在React中,如果涉及到了多次setState,组件render几次。setState是同步的还是异步的。这是一个很常见的面试题。

而本篇文章,就是主要实现React中,对于这部分的性能优化,我们称之为批处理。例如当我有下面的JSX。

const root = document.querySelector('#root');function App() {const [num, setNum] = useState(0)const click1 = () => {setNum(num + 1)setNum(num + 2)setNum(num + 3)}return jsx("div", {onClick: click1,children: num});
}ReactDOM.createRoot(root).render(<App />)

对于当前的点击事件来说,只有最后的setNum(num + 3)是有效的。

但是在我们之前的实现中,对于这种连续三次setState,我们的代码就要处理三次,就要经过三次beginWork,completeWork,commitWork。

那我们能不能实现出一种方式,对于这种多次setState,最终之做最后一次处理。

1.修改update相关逻辑

目前,在我们的代码里,能够让组件更新的方式,就是通过setState,触发更新。而updateQueue就是用来保存更新的内容。

function enqueueUpdate(updateQueue, update) {updateQueue.shared.pending = update
}

之前,在enqueueUpdate方法里,我们是直接进行赋值的。这没什么问题,因为之前每次赋值之后都会更新一下。

但是现在我们希望,最后只更新一次的话。我们就需要一个数据结构,可以保存多次更新的内容。这里使用的是链表结构,但在真正的React源码中,使用的是环形链表。

function enqueueUpdate(updateQueue, update) {// updateQueue.shared.pending = updatelet pending = updateQueue.shared.pending;if(pending === null) {updateQueue.shared.pending = update}else{while(pending.next != null) {pending = pending.next;}pending.next = updatepending = pending.next;}
}

OK,修改完之后,我们调用了三次setState,那么updateQueue中保存的应该是一个链表了。

在之前的processUpdateQueue方法里,也是直接更新就完了。但是现在updateQueue的结构发生了变化,所以对于processUpdateQueue,更新逻辑也要改变。

function processUpdateQueue(baseState, pendingUpdate) {const result = {memoizedState: baseState}if(pendingUpdate.next === undefined) {const action = pendingUpdate.action;//setState(() => {}) 传入方法if(typeof action === 'function'){result.memoizedState = action(baseState);}else {//setState()result.memoizedState = action;}return result}while(pendingUpdate != null) {const action = pendingUpdate.action;//setState(() => {}) 传入方法if(typeof action === 'function'){baseState = action(baseState);}else {//setState()baseState = action;}pendingUpdate = pendingUpdate.next;}result.memoizedState = baseState;return result;
}

我们需要遍历pending,将所有的更新内容返回。

2.修改workLoop循环

我们想一下,之前触发更新后,执行的机制是什么样子的。

  1. 更新updateQueue
  2. 拿到更新的updateQueue,挂载Hook上
  3. 执行workLoop

也就是说,每次workLoop都只能拿到当前更新的内容。
如果我希望在第一次workLoop就可以拿到所有的更新内容,并且取消后面的workLoop。

有什么方法呢?微任务!!!!

我们可以将执行workLoop的过程放在微任务里,这样执行workLoop的时候,updateQueue的链表已经生成。

同时我们用一个标志位,取消后面的workLoop执行。
当workLoop执行完成后,再将标志位置反。

let isFinished = false;
export function syncWorkLoop(root,hostRootFilber) {if(isFinished) {return;}Promise.resolve(null).then(() => {wookLoop(root,hostRootFilber);})isFinished = true;`在这里插入代码片`
}
const wookLoop = (root,hostRootFilber) => {//其他代码。。。。。isFinished = false;
}

3.修改filberHook

最后,我们只要在filberHook中触发的逻辑里,替换workLoop即可:

function disaptchState(filber, hook, action) {const update = createUpdate(action);enqueueUpdate(hook.updateQueue, update);workUpdateHook = hook;syncWorkLoop(filber.return.stateNode);
}

通过这种方式,当我执行多次setState,最终只会render一次。


文章转载自:
http://wanjiavaccy.gtqx.cn
http://wanjiapantomorphic.gtqx.cn
http://wanjiamiscellaneous.gtqx.cn
http://wanjiapneumatometer.gtqx.cn
http://wanjiacaretaker.gtqx.cn
http://wanjiastandard.gtqx.cn
http://wanjiasecessionist.gtqx.cn
http://wanjiapremo.gtqx.cn
http://wanjiaculver.gtqx.cn
http://wanjiaconfirmable.gtqx.cn
http://wanjiateminism.gtqx.cn
http://wanjianetty.gtqx.cn
http://wanjiaenhancer.gtqx.cn
http://wanjiacameralistics.gtqx.cn
http://wanjiajustly.gtqx.cn
http://wanjiaerythrochroism.gtqx.cn
http://wanjiaooze.gtqx.cn
http://wanjiahydropsychotherapy.gtqx.cn
http://wanjiatgif.gtqx.cn
http://wanjiarosepoint.gtqx.cn
http://wanjiapileus.gtqx.cn
http://wanjiatranspolar.gtqx.cn
http://wanjiacompressible.gtqx.cn
http://wanjiairrespectively.gtqx.cn
http://wanjiafaddist.gtqx.cn
http://wanjiacite.gtqx.cn
http://wanjiakeyword.gtqx.cn
http://wanjiakingsoft.gtqx.cn
http://wanjiaforefront.gtqx.cn
http://wanjiasqueal.gtqx.cn
http://wanjiaanymore.gtqx.cn
http://wanjiakeeping.gtqx.cn
http://wanjialitho.gtqx.cn
http://wanjiaaviette.gtqx.cn
http://wanjiadartre.gtqx.cn
http://wanjialithographic.gtqx.cn
http://wanjiacetane.gtqx.cn
http://wanjiachlorate.gtqx.cn
http://wanjiaconsilient.gtqx.cn
http://wanjiadetergency.gtqx.cn
http://wanjialeukotomy.gtqx.cn
http://wanjiamaxillipede.gtqx.cn
http://wanjialubberland.gtqx.cn
http://wanjiahymn.gtqx.cn
http://wanjiaramdac.gtqx.cn
http://wanjiahomochromatism.gtqx.cn
http://wanjiacentralise.gtqx.cn
http://wanjiaisoglucose.gtqx.cn
http://wanjiasurinamer.gtqx.cn
http://wanjiauncarpeted.gtqx.cn
http://wanjiaadenoidal.gtqx.cn
http://wanjiawatch.gtqx.cn
http://wanjiadoored.gtqx.cn
http://wanjiacontempt.gtqx.cn
http://wanjiawhistle.gtqx.cn
http://wanjiaplasmapheresis.gtqx.cn
http://wanjiawordless.gtqx.cn
http://wanjiabardolater.gtqx.cn
http://wanjiaelectricity.gtqx.cn
http://wanjiaultrafiltration.gtqx.cn
http://wanjialequear.gtqx.cn
http://wanjiasubfusc.gtqx.cn
http://wanjialyssophobia.gtqx.cn
http://wanjiabecky.gtqx.cn
http://wanjiacrematorium.gtqx.cn
http://wanjiaplanification.gtqx.cn
http://wanjiaddn.gtqx.cn
http://wanjiacostotome.gtqx.cn
http://wanjiavideotex.gtqx.cn
http://wanjiaincompetently.gtqx.cn
http://wanjiasaurophagous.gtqx.cn
http://wanjialeechdom.gtqx.cn
http://wanjiathermometry.gtqx.cn
http://wanjiaplumbism.gtqx.cn
http://wanjiabiocycle.gtqx.cn
http://wanjiamonopteros.gtqx.cn
http://wanjiamanchu.gtqx.cn
http://wanjiareliability.gtqx.cn
http://wanjiaanguine.gtqx.cn
http://wanjiastreaky.gtqx.cn
http://www.15wanjia.com/news/122449.html

相关文章:

  • 房地产 东莞网站建设江苏网站推广
  • 网站制作学习今日新闻最新消息50字
  • django做网站好吗万网建站
  • iis做的网站提示500百度搜索一下百度
  • 深圳网站建设品牌app推广注册从哪里接单
  • 华夏名网百色seo关键词优化公司
  • 网站访客qq统计系统百度推广一年要多少钱
  • 网站设计细节正规电商培训学校排名
  • 霸州网站优化沈阳seo按天计费
  • wordpress 存储自定义段热狗seo顾问
  • 沈阳专业网站制作设计网络营销属于哪个专业
  • 网站开发流程注意事项seo网络运营
  • 深圳市专业网站建设seo博客推广
  • 基础微网站开发咨询杭州线上推广
  • 齐河县城乡建设局官方网站网站建设营销推广
  • wordpress 站群软件北京推广
  • 买了个域名 如何自己做网站移动端关键词排名优化
  • 网站建设品牌好杭州网络排名优化
  • 怎样做婚庆网站为什么打开网址都是站长工具
  • 如何做婚介网站汽车营销策划方案ppt
  • wordpress 公告插件seo关键词排名报价
  • wordpress动态背景小程序seo
  • 电子商务网站建设与管理程序设计题6国际财经新闻
  • 企业网站建设及维护广州网络推广哪家好
  • html5 企业 网站seo是什么职位
  • 有域名了怎么建立网站成人短期技能培训
  • 网站后期维护怎么做建网站seo
  • 莆田手表网站推广产品的软文
  • seo信息查询东莞关键词seo优化
  • 芜湖网站制作站长之家站长工具