没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论






「2021」⾼频前端⾯试题汇总之React篇(上)
⼀、组件基础
1. React 事件机制
React并不是将click事件绑定到了div的真实DOM上,⽽是在document处监听了所有的事件,当事件发
⽣并且冒泡到document处的时候,React将事件内容封装并交由真正的处理函数运⾏。这样的⽅式不仅
仅减少了内存的消耗,还能在组件挂在销毁时统⼀订阅和移除事件。
除此之外,冒泡到document上的事件也不是原⽣的浏览器事件,⽽是由react⾃⼰实现的合成事件
(SyntheticEvent)。因此如果不想要是事件冒泡的话应该调⽤event.preventDefault()⽅法,⽽
不是调⽤event.stopProppagation()⽅法。
JSX 上写的事件并没有绑定在对应的真实 DOM 上,⽽是通过事件代理的⽅式,将所有的事件都统⼀绑
定在了 document 上。这样的⽅式不仅减少了内存消耗,还能在组件挂载销毁时统⼀订阅和移除事件。
另外冒泡到 document 上的事件也不是原⽣浏览器事件,⽽是 React ⾃⼰实现的合成事件
(SyntheticEvent)。因此我们如果不想要事件冒泡的话,调⽤ event.stopPropagation 是⽆效
的,⽽应该调⽤ event.preventDefault 。
实现合成事件的⽬的如下:
合成事件⾸先抹平了浏览器之间的兼容问题,另外这是⼀个跨浏览器原⽣事件包装器,赋予了跨浏览
器开发的能⼒;
对于原⽣浏览器事件来说,浏览器会给监听器创建⼀个事件对象。如果你有很多的事件监听,那么就
<div onClick={this.handleClick.bind(this)}>点我</div>
复制代码

需要分配很多的事件对象,造成⾼额的内存分配问题。但是对于合成事件来说,有⼀个事件池专⻔来
管理它们的创建和销毁,当事件需要被使⽤时,就会从池⼦中复⽤对象,事件回调结束后,就会销毁
事件对象上的属性,从⽽便于下次复⽤事件对象。
2. React的事件和普通的HTML事件有什么不同?
区别:
对于事件名称命名⽅式,原⽣事件为全⼩写,react 事件采⽤⼩驼峰;
对于事件函数处理语法,原⽣事件为字符串,react 事件为函数;
react 事件不能采⽤ return false 的⽅式来阻⽌浏览器的默认⾏为,⽽必须要地明确地调
⽤ preventDefault() 来阻⽌默认⾏为。
合成事件是 react 模拟原⽣ DOM 事件所有能⼒的⼀个事件对象,其优点如下:
兼容所有浏览器,更好的跨平台;
将事件统⼀存放在⼀个数组,避免频繁的新增与删除(垃圾回收)。
⽅便 react 统⼀管理和事务机制。
事件的执⾏顺序为原⽣事件先执⾏,合成事件后执⾏,合成事件会冒泡绑定到 document 上,所以尽量
避免原⽣事件与合成事件混⽤,如果原⽣事件阻⽌冒泡,可能会导致合成事件不执⾏,因为需要冒泡到
document 上合成事件才会执⾏。
3. React 组件中怎么做事件代理?它的原理是什么?
React基于Virtual DOM实现了⼀个SyntheticEvent层(合成事件层),定义的事件处理器会接收到
⼀个合成事件对象的实例,它符合W3C标准,且与原⽣的浏览器事件拥有同样的接⼝,⽀持冒泡机制,所
有的事件都⾃动绑定在最外层上。
在React底层,主要对合成事件做了两件事:
事件委派: React会把所有的事件绑定到结构的最外层,使⽤统⼀的事件监听器,这个事件监听器
上维持了⼀个映射来保存所有组件内部事件监听和处理函数。
⾃动绑定: React组件中,每个⽅法的上下⽂都会指向该组件的实例,即⾃动绑定this为当前组
件。
4. React ⾼阶组件、Render props、hooks 有什么区别,为什么要
不断迭代
这三者是⽬前react解决代码复⽤的主要⽅式:
⾼阶组件(HOC)是 React 中⽤于复⽤组件逻辑的⼀种⾼级技巧。HOC ⾃身不是 React API 的
⼀部分,它是⼀种基于 React 的组合特性⽽形成的设计模式。具体⽽⾔,⾼阶组件是参数为组件,

返回值为新组件的函数。
render props是指⼀种在 React 组件之间使⽤⼀个值为函数的 prop 共享代码的简单技术,更
具体的说,render prop 是⼀个⽤于告知组件需要渲染什么内容的函数 prop。
通常,render props 和⾼阶组件只渲染⼀个⼦节点。让 Hook 来服务这个使⽤场景更加简单。这
两种模式仍有⽤武之地,(例如,⼀个虚拟滚动条组件或许会有⼀个 renderltem 属性,或是⼀个
可⻅的容器组件或许会有它⾃⼰的 DOM 结构)。但在⼤部分场景下,Hook ⾜够了,并且能够帮助
减少嵌套。
(1)HOC 官⽅解释∶
⾼阶组件(HOC)是 React 中⽤于复⽤组件逻辑的⼀种⾼级技巧。HOC ⾃身不是 React API
的⼀部分,它是⼀种基于 React 的组合特性⽽形成的设计模式。
简⾔之,HOC是⼀种组件的设计模式,HOC接受⼀个组件和额外的参数(如果需要),返回⼀个新的组
件。HOC 是纯函数,没有副作⽤。
HOC的优缺点∶
// hoc的定义
function withSubscription(WrappedComponent, selectData) {
return class extends React.Component {
constructor(props) {
super(props);
this.state = {
data: selectData(DataSource, props)
};
}
// ⼀些通⽤的逻辑处理
render() {
// ... 并使⽤新数据渲染被包装的组件!
return <WrappedComponent data={this.state.data} {...this.props} />;
}
};
// 使⽤
const BlogPostWithSubscription = withSubscription(BlogPost,
(DataSource, props) => DataSource.getBlogPost(props.id));
复制代码

优点∶ 逻辑服⽤、不影响被包裹组件的内部逻辑。
缺点∶ hoc传递给被包裹组件的props容易和被包裹后的组件重名,进⽽被覆盖
(2)Render props 官⽅解释∶
"render prop"是指⼀种在 React 组件之间使⽤⼀个值为函数的 prop 共享代码的简单技术
具有render prop 的组件接受⼀个返回React元素的函数,将render的渲染逻辑注⼊到组件内部。在
这⾥,"render"的命名可以是任何其他有效的标识符。
由此可以看到,render props的优缺点也很明显∶
优点:数据共享、代码复⽤,将组件内的state作为props传递给调⽤者,将渲染逻辑交给调⽤者。
缺点:⽆法在 return 语句外访问数据、嵌套写法不够优雅
(3)Hooks 官⽅解释∶
// DataProvider组件内部的渲染逻辑如下
class DataProvider extends React.Components {
state = {
name: 'Tom'
}
render() {
return (
<div>
<p>共享数据组件⾃⼰内部的渲染逻辑</p>
{ this.props.render(this.state) }
</div>
);
}
}
// 调⽤⽅式
<DataProvider render={data => (
<h1>Hello {data.name}</h1>
)}/>
复制代码

Hook是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使⽤ state 以及其
他的 React 特性。通过⾃定义hook,可以复⽤代码逻辑。
以上可以看出,hook解决了hoc的prop覆盖的问题,同时使⽤的⽅式解决了render props的嵌套地狱
的问题。hook的优点如下∶
使⽤直观;
解决hoc的prop 重名问题;
解决render props 因共享数据 ⽽出现嵌套地狱的问题;
能在return之外使⽤数据的问题。
需要注意的是:hook只能在组件顶层使⽤,不可在分⽀语句中使⽤。
总结∶∶ Hoc、render props和hook都是为了解决代码复⽤的问题,但是hoc和render props都有特
定的使⽤场景和明显的缺点。hook是react16.8更新的新的API,让组件逻辑复⽤更简洁明了,同时也
解决了hoc和render props的⼀些缺点。
5. 对React-Fiber的理解,它解决了什么问题?
React V15 在渲染时,会递归⽐对 VirtualDOM 树,找出需要变动的节点,然后同步更新它们, ⼀
⽓呵成。这个过程期间, React 会占据浏览器资源,这会导致⽤户触发的事件得不到响应,并且会导致
掉帧,导致⽤户感觉到卡顿。
// ⾃定义⼀个获取订阅数据的hook
function useSubscription() {
const data = DataSource.getComments();
return [data];
}
//
function CommentList(props) {
const {data} = props;
const [subData] = useSubscription();
...
}
// 使⽤
<CommentList data='hello' />
复制代码
剩余119页未读,继续阅读
资源评论

- zzff132022-10-16非常有用的资源,可以直接使用,对我很有用,果断支持!
- zhaijizhe2022-07-15实在是宝藏资源、宝藏分享者!感谢大佬~
- 长理小彦祖2022-03-11用户下载后在一定时间内未进行评价,系统默认好评。

工具盒子
- 粉丝: 36
- 资源: 1314
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
