2024年前端 React 25道常见面试题汇总_前端面试题2024 react

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文


* 模拟 componentDidUpdate。没有第二个参数代表监听所有的属性更新,示例如下。



useEffect(()=>{console.log(‘任意状态改变’)})


如果需要监听多个属性的变化则需要将属性作为数组传入第二个参数。



useEffect(()=>{console.log(‘指定状态改变’)},[状态1,状态2…])


* 模拟 componentWillUnmount



useEffect(()=>{ … return()=>{ //组件卸载前} })


##### 9,setsate 和 usestate 的区别


* setState(updater [,callback] ):构造函数是唯一建议给 this.state 赋值的地方,不建议直接修改 state 的值,因为这样不会重新渲染组件,自动进行浅合并(只会合并第 1 层),由于 setState() 异步更新的缘故,依赖 state 旧值更新 state 的时候建议采用传入函数的方式。
* useState(initState):setState(updater) 用于修改状态的方法,updater:object/function 用于更新数据,initState 用于状态的初始值。


##### 10,如何监听 react 父组件 props 变化。


当 props 发生变化时执行,初始化 render 时不执行,在这个回调函数里面,你可以根据属性的变化,通过调用 this.setState() 来更新你的组件状态,旧的属性还是可以通过 this.props 来获取, 这里调用更新状态是安全的,并不会触发额外的 render 调用。



componentWillReceiveProps(props) {
console.log(props)
this.setState({show: props.checked})
}


##### 11,usememo 的作用,以及怎么使用


返回一个 memoized 值。


把 “创建” 函数和依赖项数组作为参数传入 useMemo,它仅会在某个依赖项改变时才重新计算 memoized 值。这种优化有助于避免在每次渲染时都进行高开销的计算。传入 useMemo 的函数会在渲染期间执行。请不要在这个函数内部执行与渲染无关的操作,诸如副作用这类的操作属于 useEffect 的适用范畴,而不是 useMemo。


如果没有提供依赖项数组,useMemo 在每次渲染时都会计算新的值。


你可以把 useMemo 作为性能优化的手段,但不要把它当成语义上的保证。将来,React 可能会选择 “遗忘” 以前的一些 memoized 值,并在下次渲染时重新计算它们,比如为离屏组件释放内存。先编写在没有 useMemo 的情况下也可以执行的代码 —— 之后再在你的代码中添加 useMemo,以达到优化性能的目的。


##### 12,React 的 Component 和 Purecomponent 区别


Component 没有直接实现 shouldComponentUpdate 这个方法,但是 PureComponent 通过浅层的 Porps 和 state 的对比,内部实现了这个生命周期函数。


PureComponent 会跳过整个组件子树的 props 更新,要确保全部的子组件也是 pure 的形式。


Component 中需要手动执行的 shouldComponentUpdate 函数,在 PureComponent 中已经自动完成了(自动浅对比)。


PureComponent 不仅会影响本身,而且会影响子组件,所以 PureComponent 最好用在数据展示组件中。


PureCoponent 如果是复杂数据类型,这里会造成错误的显示(setState 浅复制更新,但是界面不会重新渲染)。


##### 13,Hooks 相对于类有哪些优化


首先,我们来看一下类组件的一些缺点:


**缺点 1:复杂且不容易理解的 “this”。**


Hooks 解决方式:函数组件和普通 JS 函数非常相似,在普通 JS 函数中定义的变量、方法都可以不使用 “this.”,而直接使用该变量或函数,因此你不再需要去关心“this” 了。


**缺点 2:组件数据状态逻辑不能重用**


Hooks 解决方式:通过自定义 Hook,可以数据状态逻辑从组件中抽离出去,这样同一个 Hook 可以被多个组件使用,解决组件数据状态逻辑并不能重用的问题。


**缺点 3:组件之间传值过程复杂**


Hooks 解决方式:通过 React 内置的 useState()函数,可以将不同数据分别从 “this.state” 中独立拆分出去。降低数据复杂度和可维护性,同时解决类组件缺点三中 “内部 state 数据只能是整体,无法被拆分更细” 的问题。


通过 React 内置的 useEffect() 函数,将 componentDidMount、componentDidUpdate、componentWillUncount 3 个生命周期函数通过 Hook(钩子) 关联成 1 个处理函数,解决事件订阅分散在多个生命周期函数的问题。


##### 14,Hooks 父组件怎么调用子组件的方法


父组件使用 useRef 创建一个 ref 传入 子组件 子组件需要使用。useImperativeHandle 暴露 ref 自定义的实例值给父组件,并且需要使用 forwardRef 包裹着。


##### 15,React 通过什么方法修改参数?


类组件修改数据的方法, 通过 setState , 注意 setState 的修改方法有两种,而且它是异步的


函数组件修改方式通过自定义的方法。需要通过 useState , 例如。const [count,setCount] = useState(0)。


##### 16,说说你对 react native 的了解


React native 基于 JavaScript 开发的一个 可以开发原生 app 的这么一个集成框架,它兼容开发 iOS 和 Android 能够实现一套代码,两个系统都能使用,方便维护,相比于 web 前端的 react ,react-native 更好的提供了一些调用手机硬件的 API, 可以更好的开发移动端,现在 react-native 它的生态环境也是越来越好,基本上可以完全实现原生开发,


但是现在好多的应用还是用它来套壳 (原生 + web 前端),用它来做有些路由,和框架的搭建,然后里面内容来使用前端的 react 来实现,这样一来让维护更方便,开发更快捷


##### 17,React 的输入框输入文字就会触发 onchange,怎么拿到他最后输入的结果呢?


方法 1:通过受控组件,可以获取到 state 里面的值,获取修改结果,代码如下。



class Home extends React.Component {
state = {
val:“”
}
//这是一个通用的写法,然后注意 name的值一定要与state定义的一直
changeInput = (e) =>{
let {name,value} = e.target
this.setState({
[name]:value
})
}
render(){
return <>

</>
}
}


方法 2:通过 ref 来获取里面的值。



class Home extends React.Component {
render(){
//this.val 获取里面的真是dom
return <input ref={node=>this.val} />
}
}


##### 18,React 的 render 什么时候渲染


React 生命周期有三个阶段。 两个阶段都会执行 render 主要从更新和挂载两个阶段来讲,挂载阶段会执行一次,更新阶段主要会涉及 shouldComponentUpdate。


首先,我们看一下挂载阶段:



constructor(){}
static getDerivedStateFromProps(){
return {}
}

render(){} //挂载阶段会执行一次
componentDidMount(){}


接下来,我们看一下更新阶段:



static getDerivedStateFromProps(props, state){rerturn {}}
shouldComponentUpdate(nextProps, nextState).{
return Boolean //注意如果 false 则 不向下执行 ,true的时候会执行render
}

render() …


##### 19,useEffect 的依赖为引用类型如何处理


useEffect 的依赖为引用类型的时候,可能会导致监听不出发,原因就是监听的统一个地址的时候,对象本身地址没变,所以监听的结果就是认为数据并没有改变从而不直接调用。


解决的方法有以下几点:


* 如果数据是对象的话,可以监听对象的里面的值,值是基本类型,如果值改变了,那么可以监听执行;
* 在去修改对象和数据的时候,使用参拷贝或者浅拷贝,这样地址发生改变可以监听执行;
* 可以转成字符串,通过 JSON.stringify() , 监听字符串这样的,这样改变也会执行;


##### 20,说一下 key 发生哪些变化会触发什么生命周期


React 的 key 值给组件作为唯一标识,类似身份证,当数组发生增删改查的时候可以通过这个 标识来去对比虚拟 dom 的更改前后,如果相同标识的数据或者属性没有改变的话,讲直接略过,对比有改变的然后直接改变此项。


如果给组件添加 key,如果 key 值改变的时候,组件将会触发如下的生命周期:


* constructor
* getDerivedStateFromProps()
* render(){}
* componentDidUpdate


##### 21,说说 React 里面的 createPortal。


react.createPortal() 这个方法是来使用做弹窗 Modal 组件的, 在没有这个组件之前我们可以自己定义组件,然后去实现 Modal 效果。



const styles = {
modal: {
position: ‘fixed’,
top: 0,
left: 0,
前端资料汇总

我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。

首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。

更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。
找工作无非就是看三点:和什么人、做什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-Kf3U3vdb-1713022392812)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值