百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

前端React面试基础系列(React基础篇)

myzbx 2025-09-13 06:46 32 浏览

本文阅读8分钟,喜欢的小伙伴可以持续关系小编哦


1. 什么是受控组件和非受控组件?

受控组件

像表单元素在用户输入时,像<input> <select>等元素需要绑定一个 change 事件,当组件的状态发生变化时就会触发 change 事件,更新组件的 state,这种就是受控组件。

非受控组件

如果一个表单组件没有 value、props 时,就可以称为非受控组件。 非受控组件可以使用 ref 来从 DOM 获取到表单的值。

2. 类组件和函数组件有什么区别?

  1. 类组件中存在生命周期函数,而函数组件中我们使用的是 hooks 来替代生命周期函数。
  2. 多次 render 时,类组件实际上只会 new 一次,函数组件会被调用多次。
  3. 心智模型上:函数式组件捕获了渲染所用的值;而类组件在读取 this 的时候,虽然 props 是不可变的,但是 this 是永远可变的,因此能在渲染方法或者生命周期方法中得到最新的实例。具体可参考:juejin.cn/post/684490…

3. state 和 props 的区别

state

state 时用来存储组件中的状态值,必须要使用 setState 来修改,state 值的变化会造成组件的重新渲染。

props

props 时一个外部传入到组件内的参数,具有可读性和不可变性,只能通过外部组件来传入新的 Props 来重新渲染子组件。

区别

  1. props 是不可修改的,state 是在组件中被创建,可以通过 setState 来进行修改的。
  2. props 是传递给组件的,state 则是组件自身内部管理的。

为什么 props 是只读的? 因为 React 的设计中,是根据单向数据流的设计模式,使状态可预测。如果子组件可以修改 props 的值,那么就会造成状态的不可预测性,给后续的维护及调试带来很大的困扰。

4. 父子组件的通信方式

  1. props 和 callback 方式父组件 -> 通过自身 state 改变,重新渲染,传递 props -> 通知子组件子组件 -> 通过调用父组件 props 方法 -> 通知父组件。
  2. ref 方式类组件可以通过 ref 直接获取组件实例,实现组件通信函数组件 forwardRef + useImperativeHandle 实现组件通信
  3. React-redux 或 React-mobx 状态管理方式状态管理库
  4. context 上下文方式将一些数据存储在全局数据中
  5. event bus 事件总线(类似于 PubSub 库)react 中并不推荐,因为需要手动绑定和解绑一定程度上违背了 React 数据流向原则小项目还好,大项目难以维护

5. 类组件的setState和函数组件的useState异同

相同点

都更新视图,底部调用了scheduleUpdateFiber方法,在事件驱动情况下都有批量更新规则。

不同点

  1. setState只要调用了就会执行更新;useState会浅比较2次state是否相同
  2. setState有专门监听变化的回调函数;useState只能通过useEffect
  3. setState底层处理上主要是和老的state合并;useState则重新赋值

6. 为什么React组件中 return 一个对象而不是一个元素时会报错

因为对象不具备迭代接口,必须要时原型或者自己身上有[Symbol.iterator]属性才可以,而数组是有迭代接口的,所以可以直接迭代。

7. 什么是 JSX

JSX 是一种表达式也是 React 的一种标准书写方式,允许我们使用书写 html 的方式去写 react 元素。

最终会变成什么

  1. jsx 元素节点首先会被 babel 编译成React.createElement形式
  2. createElement 处理之后,会被转换成 react element 对象。
  3. 在调和阶段,React element 对象的每一个子节点都会形成一个与之对应的 fiber 对象,然后通过 siblingreturnchild 将每一个 fiber 对象联系起来。

babel工作原理

babel的一种工作原理(html 文件中 script 导入时):在 script 标签中,如果 type 不是text/javascript或者module,游览器不会去解析 javascript 内部的代码,babel 会监听全局的document.contentLoad(意味着当前页面所有的 script 标签全部生成完毕)。

babel 直接拿到所有的 script 标签,并读 script 上的属性getAttributes("type"),如果是text/babel,会把里面的代码全部拿过来,然后转换,生成新的 script 标签插入到页面。

8. 说说有哪些hooks

1. useState

用来声明状态变量,接受的参数是一个初始值;返回一个数组,数组的第[0]项是当前的状态值,[1]项是用来改变状态值的方法函数。

2. useEffect

副作用,react首次渲染和之后的每次渲染都可以调用一遍传给useEffect的函数,可以模拟类组件的3个生命周期:componentDidMountcomponentDidUpdatecomponentWillUnmount

当第二个参数传入一个空数组时,相当于只在首次渲染的时候执行;如果传入一个变量,就会进行一次浅比较,变量发生变化时,会执行传入的函数。

3. useRef

  • 可以获取当前元素的所有属性,并且返回一个可变的ref对象。
  • 可以用来缓存数据

不是仅为真实 dom 服务,构建一个状态出来,但是这个状态时直接脱离 react 控制的,他的变化也不会造成重新渲染,同时状态还不会因为组件的重新渲染而被初始化

如果不使用 useRef 去处理真实 dom 会出现什么问题?

  • 使用 state 会造成没必要的重新渲染,用全局变量又会造成闭包问题

4. useMemo(优化)

场景: 当一个父组件中调用了一个子组件的时候,父组件的 state 发生变化,会导致父组件更新,而子组件虽然没有发生改变,但也会进行更新。

  • useMemo可以减少不必要的渲染和循环;
  • 减少子组件的渲染次数;
  • 同时通过特定的依赖进行更新,避免很多不必要的开销。

5. useCallback(优化)

useMemo类似,useMemo返回的是函数运行的结果useCallback返回的是函数。这个函数是父组件传递子组件的一个函数,防止做无关的刷新,这个组件必须配合memo来使用。

6. useContext

就是类组件中的context,可以用来存储一些全局的状态。

7. useReducer

是一个用于状态管理的hook api,与reducer函数相关。她接受2个参数,分别为reducer函数和初始状态。返回一个数组,第[0]项是state值,第[1]项是dispatch函数。

8. useLayoutEffect

useEffect 几乎完全一致,唯一的区别是 useLayoutEffect 会在所有的 dom 变更之后同步调用(意味着会完全阻塞后续工作),而 useEffect 是在所有的 dom 变更之后异步调用。

9. useTransition(react18,优化)

const [isPending, startTransition] = useTransition()是一个帮助我们在不阻塞UI的情况下更新状态。

返回1个数组,[0]项告诉我们是否存在待处理的transition;[1]项是一个startTransition函数,用这个方法可以把状态更新标记为transition

js

复制代码

function TabContainer() { const [isPending, startTransition] = useTransition(); const [tab, setTab] = useState('about'); function selectTab(nextTab) { startTransition(() => { setTab(nextTab); }); } // …… }

....

更多建议查看React官网
react.docschina.org/reference/r…

9.fowardRef

是一个高阶组件,接收一个组件作为参数返回一个新的组件。给函数组件扩展了一个 ref 属性。 给子组件挂 ref 是要要求子组件去追加一个 forwardRef 的,同时 forwardRef 会将得到的这个 ref 属性通过第二个参数传递给真实的函数组件。

10.useImperativeHandle

第一个参数是 ref,意味着在底层会去改这个 ref 的 current 属性 第二个参数是一个函数,这个函数的返回值最终会被丢到这个 ref.current 属性上去 第三个参数是依赖项,意味着依赖项不变的话 ref 的 current 值不会被重新赋值

11. React18有哪些更新

  1. setState自动批处理
  2. 17中只有react合成事件会进行批处理,legacy模式;
  3. 18中所有事件都进行批处理,提高了性能,concurrent模式。
  4. 支持并发模式的渲染
  5. 去掉了对IE浏览器的支持
  6. flushSync,用于退出批量更新
  7. react组件返回值更新
  8. 17中返回空组件只能返回null,返回undefined会报错
  9. 18中支持null和undefined
  10. 支持useId(在服务器和客户端生成相同的唯一一个id,避免hydrating的不兼容)
  11. 新增hooksuseInsertionEffect:只建议在css in js库中使用,在dom生成之前执行,在useLayoutEffect之前,一般用于提前注入脚本
  12. useSyncExternalStore:解决外部数据撕裂问题
  13. Suspense不再需要fallback捕获
  14. Concurrent Mode:并发模式,可以帮助应用保持响应,根据用户的设备性能和网速进行调整,通过渲染可中断来修复阻塞渲染机制。该模式下,可以同时更新多个状态;
  15. strict mode更新:使用严格模式时,React会对每个组件返回两次渲染,以便你观察一些意想不到的结果,在react17中去掉了一次渲染的控制台日志,以便让日志容易阅读。react18取消了这个限制,第二次渲染会以浅灰色出现在控制台日志 ....

12. Redux工作原理

场景

  • 跨层级组件数据共享与通信
  • 一些需要持久化的全局数据

工作原理

单例模式

主要构成

Store

全局状态管理对象

Reducer

一个纯函数,根据旧state和props更新state

Action

改变状态的唯一方式是调用dispatch函数,传递一个action给这个函数

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 &quot;小贱贱&quot;韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...