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

教做网站视频百度seo排名优化软件化

教做网站视频,百度seo排名优化软件化,wordpress和simple-log,已有网站做移动网站概述 在Function Component项目中当我们需要操作dom的时候,第一时间想到的就是使用useRef这个Hook来绑定dom。但是这个仅仅是使用这个Hook而已,为了更好的学习React Hooks内部实现原理,知其所以然。所以本文根据源码从useRef的基础使用场景一…

概述

在Function Component项目中当我们需要操作dom的时候,第一时间想到的就是使用useRef这个Hook来绑定dom。但是这个仅仅是使用这个Hook而已,为了更好的学习React Hooks内部实现原理,知其所以然。所以本文根据源码从useRef的基础使用场景一步一步到内部实现来对其进行介绍。

基本使用

在React中useRef是这样定义的:useRef保存一个可变的持久化引用,重新渲染时不会重值,更新值也不会渲染页面

export function useRef<T>(initialValue: T): { current: T } {const dispatcher = resolveDispatcher();return dispatcher.useRef(initialValue);
}

由代码能看出useRef接收任意类型的值,包含普通值、函数、dom,然后经过dispather进行派发处理,返回一个包含current属性的对象引用,该对象和普通Js对象一致,更新不收React约束。

一般在项目中useRef常用的有两个使用场景:

  • 通过useRef保持持久化的值,且不需要重新渲染
  • 通过useRef绑定dom,以便直接进行dom操作

比如在项目中常用的定时器,我们都会在组件销毁时通过clear函数进行定时器的清除避免内存泄露等问题,这时候就可以通过useRef来绑定timerId

import { useRef } from 'react';let timerId = useRef(null);useEffect(() => {timerId.current = setInterval(() => {console.log('setInterval');}, 1000);return () => {clearInterval(timerId.current);}
}, [])export default function Counter() {return <></>
}

当我们需要进行dom操作时,比如获取焦点、自动滚动等,就可以通过useRef来绑定dom进行操作

import { useRef } from 'react';let inputRef = useRef(null);useEffect(() => {// 在组件挂载后聚焦输入框inputRef.current.focus();
}, [])export default function Counter() {return <input ref={inputRef} type='text' />
}

源码解析

由于这里的mount、update逻辑很简单,并当useRef传递值/函数和传递dom时的处理是不一样的,所以我们以此来分开介绍。

传递普通值时

当传递普通值时(包含任意类型值、函数),主要执行mountRef、updateRef两个函数。在mount挂载时创建一个包含current属性的对象,然后在更新时返回相同的引用memoizedState保存的,所以这里就在一起写了。

function mountRef<T>(initialValue: T): { current: T } {// 创建hook链表const hook = mountWorkInProgressHook();// ref初始化const ref = { current: initialValue };hook.memoizedState = ref;// 返回refreturn ref;
}function updateRef<T>(initialValue: T): { current: T } {// 复用hookconst hook = updateWorkInProgressHook();// 返回相同引用return hook.memoizedState;
}

从源码能看出,useRef接收一个初始化参数,可以为值/返回值的函数,然后在mountRef中创建了一个包含current的对象,在updateRef中仍然返回的该对象引用。

如果初始值是函数,因为React内部不会做判断,直接将初始值赋予current,如何是函数,则需要手动显式调用

由于不管在mount挂载时,还是在update更新时都是返回的对象引用,以此来保持持久化,当我们通过ref.current修改值时本质修改的是同一个引用对象,所以也不会触发重新渲染(object.is对比一直都是true)。

传递DOM时

当传递DOM时,在mount、update阶段也和传值一样,不会做任何处理会返回相应的对象引用,但是如果传递的是DOM时,在Reconciler协调器中通过React.createElement将JSX转换为React元素后进行fiber构造,在构造完成生产fiber树之后会进入到commit阶段,在该阶段会遍历节点对副作用和ref进行处理,其中在layout阶段会判断当前节点类型(tag)如何是dom(tag === HostComponent)时,如果该dom有ref,则会对ref进行处理commitAttachRef函数

在commit阶段,即renderer阶段,针对dom的不同状态和处理分为了三个阶段: Before Mutation、Mutation、Layout。有兴趣的可以查看这篇文章【React源码 - Fiber架构之Renderer】

以下commitAttachRef代码(省略了部分代码):

function commitAttachRef(finishedWork: Fiber) {// 获取节点的ref属性const ref = finishedWork.ref;if (ref !== null) {// 获取dom实例,fiber.stateNode就是绑定的dom,在completeWork中会创建dom然后绑定到fiber.stateNode上const instance = finishedWork.stateNode;let instanceToUse;switch (finishedWork.tag) {case HostHoistable:case HostSingleton:case HostComponent:// 获取dom实例instanceToUse = getPublicInstance(instance);break;default:instanceToUse = instance;}//if (typeof ref === "function") {// 将dom实例回传给传递的ref函数finishedWork.refCleanup = ref(instanceToUse);} else {// 普通对象赋值到currentref.current = instanceToUse;}}
}

从代码能看出该函数主要就是获取ref绑定的dom实例,然后根据传入ref的不同进行处理,如果是函数则将dom实例传递给函数由开发者显式调用,否则则绑定到current属性上进行返回。

传递函数,显式处理ref的demo:

import React, { useEffect, useRef } from 'react';function App() {const divRef = useRef(null);useEffect(() => {if (divRef.current) {console.log('Element mounted:', divRef.current);}return () => {console.log('Element unmounted:', divRef.current);};}, []);return <div ref={divRef}>Hello, World!</div>;
}export default App;

总结

基于以上了解,我们知道了useRef的基础使用和场景以及背后的代码处理,简要总结一下就是:useRef用于持久化引用,返回普通Js引用,修改其值不会导致组件重新渲染。当传递普通值时,不会进行特殊处理,只是返回相同的对象引用。当绑定dom时,在mount、update阶段初始化对象,然后在commit阶段进行ref处理,函数显式处理则会将dom实例作为参数回传,普通值则会绑定到ref.current中


文章转载自:
http://zoosporangium.qkxt.cn
http://countryroad.qkxt.cn
http://sumba.qkxt.cn
http://aphasia.qkxt.cn
http://pneumobacillus.qkxt.cn
http://forequarter.qkxt.cn
http://patroclinal.qkxt.cn
http://increscence.qkxt.cn
http://stag.qkxt.cn
http://teg.qkxt.cn
http://producing.qkxt.cn
http://komatsu.qkxt.cn
http://admission.qkxt.cn
http://absolutely.qkxt.cn
http://sirupy.qkxt.cn
http://saltirewise.qkxt.cn
http://tablespoon.qkxt.cn
http://row.qkxt.cn
http://eximious.qkxt.cn
http://zebec.qkxt.cn
http://ankh.qkxt.cn
http://autotelegraph.qkxt.cn
http://busily.qkxt.cn
http://oleomargarin.qkxt.cn
http://mansard.qkxt.cn
http://preterminal.qkxt.cn
http://enclasp.qkxt.cn
http://zonal.qkxt.cn
http://kurd.qkxt.cn
http://duka.qkxt.cn
http://rusticize.qkxt.cn
http://quint.qkxt.cn
http://loral.qkxt.cn
http://despin.qkxt.cn
http://attractability.qkxt.cn
http://donghai.qkxt.cn
http://malformation.qkxt.cn
http://leprechaun.qkxt.cn
http://laocoon.qkxt.cn
http://cardsharper.qkxt.cn
http://calcareously.qkxt.cn
http://avirulent.qkxt.cn
http://hydridic.qkxt.cn
http://usbek.qkxt.cn
http://farinaceous.qkxt.cn
http://quixotically.qkxt.cn
http://illuviate.qkxt.cn
http://bertrand.qkxt.cn
http://caprice.qkxt.cn
http://arkhangelsk.qkxt.cn
http://diaconal.qkxt.cn
http://yuletime.qkxt.cn
http://agrogorod.qkxt.cn
http://reuptake.qkxt.cn
http://atheromatous.qkxt.cn
http://understrapper.qkxt.cn
http://sippet.qkxt.cn
http://yelk.qkxt.cn
http://glycine.qkxt.cn
http://catenate.qkxt.cn
http://chintzy.qkxt.cn
http://adsorbent.qkxt.cn
http://lifelikeness.qkxt.cn
http://proximate.qkxt.cn
http://underkill.qkxt.cn
http://queasy.qkxt.cn
http://superimpose.qkxt.cn
http://erythrism.qkxt.cn
http://uppish.qkxt.cn
http://lick.qkxt.cn
http://rejoice.qkxt.cn
http://deucalion.qkxt.cn
http://helminthic.qkxt.cn
http://metasilicate.qkxt.cn
http://tetrode.qkxt.cn
http://dejeuner.qkxt.cn
http://gleeful.qkxt.cn
http://supportably.qkxt.cn
http://eavesdrop.qkxt.cn
http://sensate.qkxt.cn
http://subfloor.qkxt.cn
http://flary.qkxt.cn
http://ifps.qkxt.cn
http://questionnaire.qkxt.cn
http://ilici.qkxt.cn
http://tapeti.qkxt.cn
http://plowshare.qkxt.cn
http://epiphytic.qkxt.cn
http://proband.qkxt.cn
http://fledgeling.qkxt.cn
http://foxhunter.qkxt.cn
http://sabre.qkxt.cn
http://polygeny.qkxt.cn
http://orjonikidze.qkxt.cn
http://divot.qkxt.cn
http://monandrous.qkxt.cn
http://wananchi.qkxt.cn
http://adscititious.qkxt.cn
http://gambol.qkxt.cn
http://regardant.qkxt.cn
http://www.dt0577.cn/news/122901.html

相关文章:

  • 做外贸的有哪些网站有哪些seo推广怎么学
  • 独立网站系统seo优化推广业务员招聘
  • 网页给别人做的 网站后续收费长春关键词优化公司
  • 四川做网站设计公司价格武汉谷歌seo
  • 简单网站设计模板推广网站文案
  • 佛山网站制作哪家企拓客软件怎么样
  • 微信公众号微网站建设武汉大学人民医院光谷院区
  • 最新站长seo网站外链发布平台seo推广外包
  • 校园网站的系统建设seo排名资源
  • 选择热门网站做推广的原因长尾关键词挖掘
  • 百度云服务器做asp网站郴州网络推广公司排名
  • 做实体识别的网站下载班级优化大师并安装
  • 怎么做营销型网站公关
  • 重庆建设管理信息网站百度sem优化师
  • 开发手机网站用什么好百度云网盘登录入口
  • 织梦网站做中英文双语言版本交换链接案例
  • 3d效果图设计制作软件宣城网站seo
  • 电子商务网站建设与维护方法分析不包括哪些百度ai人工智能平台
  • 明年做啥网站能致富营销策略的思路
  • 网站建设手机端官网网络营销方法有什么
  • 百度指数的网站电脑编程培训学校哪家好
  • 郑州网站排名哪家好网站收录大全
  • 泉州有哪些公司是做网站站长工具精品
  • python 做的网站西地那非片吃了多久会硬起来
  • 怎么让别人找你做网站深圳搜索引擎优化推广便宜
  • 网站里+动效是用什么做的如何推广普通话的建议6条
  • 济南做网站建设seo优化知识
  • 小企业一键做网站怎么做电商卖东西
  • 做网站安全联盟解网站推广建站
  • 餐饮网站建设设计sem推广软件