简单聊聊React

1 React 中 keys 的作⽤是什么?

Keys 是 React ⽤于追踪哪些列表中元素被修改、
被添加或者被移除的辅助标识。

在开发过程中,我们需要保证某个元素的 key 在其同级元素中具有唯⼀性。在 React Diff 算法中 React 会借助元素的 Key 值来判断该元素是新近创建的还是被移动⽽来 的元素,从⽽减少不必要的元素重渲染。此外,React 还需要借助 Key 值来判断元素与 本地状态的关联关系,因此我们绝不可忽视转换函数中 Key 的重要性。

2 传⼊ setState 函数的第⼆个参数的作⽤是什么?

该函数会在 setState 函数调⽤完成并且组件开始重渲染的时候被调⽤,我们 可以⽤该函数来监听渲染是否完成:
this.setState(
{ username: 'tylermcginnis33' },
() => console.log('setState has finished and the component has re-rendere
)
this.setState((prevState, props) => {return {streak: prevState.streak + props.count
} })

3 React 中 refs 的作⽤是什么?

Refs 是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄 可以为元素添加 ref 属性然后在回调函数中接受该元素在 DOM 树中的句柄,该值会作为回调函数的第⼀个参数返回。

4 在⽣命周期中的哪⼀步你应该发起 AJAX 请求。

我们应当将AJAX 请求放到 componentDidMount 函数中执⾏,
主要原因有下。

React 下⼀代调和算法 Fiber 会通过开始或停⽌渲染的⽅式优化应⽤性能,其会影响到 componentWillMount 的触发次数。对于 componentWillMount 这个⽣命周期函数 的调⽤次数会变得不确定, React 可能会多次频繁调⽤ componentWillMount 。如果我 们将 AJAX 请求放到 componentWillMount 函数中,那么显⽽易⻅其会被触发多次,⾃ 然也就不是好的选择。 如果我们将 AJAX 请求放置在⽣命周期的其他函数中,我们并不能保证请求仅在组件挂载 完毕后才会要求响应。如果我们的数据请求在组件挂载之前就完成,并且调⽤了setState 函数将数据添加到组件状态中,对于未挂载的组件则会报错。⽽在componentDidMount 函数中进⾏ AJAX 请求则能有效避免这个问题。

5 shouldComponentUpdate 的作⽤

shouldComponentUpdate 允许我们⼿动地判断是否要进⾏组件更新,根据组 件的应⽤场景设置函数的合理返回值能够帮我们避免不必要的更新。

6 如何告诉 React 它应该编译⽣产环境版

通常情况下我们会使⽤ Webpack 的 DefinePlugin ⽅法来将 NODE_ENV
变量值设置为 production 。编译版本中 React 会忽略propType 验证以 及其他的告警信息,同时还会降低代码库的⼤⼩, React 使⽤了 Uglify插件来移除⽣产环境下不必要的注释等信息。

7 概述下 React 中的事件处理逻辑

为了解决跨浏览器兼容性问题, React 会将浏览器原⽣事件( BrowserNative Event )封装为合成事件( SyntheticEvent )传⼊设置的事件处理 器中。这⾥的合成事件提供了与原⽣事件相同的接⼝,不过它们屏蔽了底层浏 览器的细节差异,保证了⾏为的⼀致性。另外有意思的是, React 并没有直 接将事件附着到⼦元素上,⽽是以单⼀事件监听器的⽅式将所有的事件发送到 顶层进⾏处理。这样 React 在更新 DOM 的时候就不需要考虑如何去处理附 着在 DOM 上的事件监听器,最终达到优化性能的⽬的。

8 createElement 与 cloneElement 的区别是什么?

createElement 函数是 JSX 编译之后使⽤的创建 React Element 的函 数,⽽ cloneElement 则是⽤于复制某个元素并传⼊新的 Props。

9 redux中间件

中间件提供第三⽅插件的模式,⾃定义拦截 action -> reducer 的过程。 变为 action -> middlewares -> reducer 。这种机制可以让我们改变数 据流,实现如异步 action , action 过滤,⽇志输出,异常报告等功能。
redux-logger :提供⽇志输出
redux-thunk :处理异步操作
redux-promise :处理异步操作, actionCreator 的返回值是 promise

10 redux有什么缺点

⼀个组件所需要的数据,必须由⽗组件传过来,⽽不能像 flux 中直接从 store 取。 当⼀个组件相关数据更新时,即使⽗组件不需要⽤到这个组件,⽗组件还是会重新
render ,可能会有效率影响,或者需要写复杂的 shouldComponentUpdate 进⾏判断。

11 react组件的划分业务组件技术组件?

根据组件的职责通常把组件分为UI组件和容器组件。
UI 组件负责 UI 的呈现,容器组件负责管理数据和逻辑。
两者通过 React-Redux 提供 connect ⽅法联系起来。

12 react⽣命周期函数(大多数面试官会问)

挂载 更新、渲染 卸载(一句话就是这个,具体的看下文)

初始化阶段

getDefaultProps :获取实例的默认属性。
getInitialState :获取每个实例的初始化状态。
componentWillMount :组件即将被装载、渲染到⻚⾯上。
render :组件在这⾥⽣成虚拟的 DOM 节点。
omponentDidMount :组件真正在被装载之后。
运⾏中状态
componentWillReceiveProps :组件将要接收到属性的时候调⽤。
shouldComponentUpdate :组件接受到新属性或者新状态的时候(可以返回false,接收数。
据后不更新,阻⽌ render 调⽤,后⾯的函数不会被继续执⾏了)。
componentWillUpdate :组件即将更新不能修改属性和状态。
render :组件重新描绘。
componentDidUpdate :组件已经更新。
销毁阶段
componentWillUnmount :组件即将销毁

13 react性能优化是哪个周期函数?

shouldComponentUpdate 这个⽅法⽤来判断是否需要调⽤render⽅法重新描。
绘dom。因为dom的描绘⾮常消耗性能,如果我们能在shouldComponentUpdate⽅ 法中能够写出更优化的 dom diff 算法,可以极⼤的提⾼性能。

14 为什么虚拟dom会提⾼性能?

虚拟 dom 相当于在 js 和真实 dom 中间加了⼀个缓存,利⽤ dom diff 算 法避免了没有必要的 dom 操作,从⽽提⾼性能。(一句话:虚拟dom比真实dom节省资源。)
具体实现步骤如下
⽤ JavaScript 对象结构表示 DOM 树的结构;然后⽤这个树构建⼀个真正的 DOM 树, 插到⽂档当中。
当状态变更的时候,重新构造⼀棵新的对象树。然后⽤新的树和旧的树进⾏⽐较,记录两棵树差异。
把2所记录的差异应⽤到步骤1所构建的真正的 DOM 树上,视图就更新。

15 diff算法?

把树形结构按照层级分解,只⽐较同级元素。
给列表结构的每个单元添加唯⼀的 key 属性,⽅便⽐较。
React 只会匹配相同 class 的 component (这⾥⾯的 class 指的是组件的名字)。
合并操作,调⽤ component 的 setState ⽅法的时候, React 将其标记为 - dirty .
到每⼀个事件循环结束, React 检查所有标记 dirty 的 component 重新绘制. 选择性⼦树渲染。开发⼈员可以重写 shouldComponentUpdate 提⾼ diff 的性能

16 react性能优化⽅案

重写 shouldComponentUpdate 来避免不必要的dom操作。
使⽤ production 版本的 react.js
使⽤ key 来帮助 React 识别列表中所有⼦组件的最⼩变化。

17简述flux 思想

Flux 的最⼤特点,就是数据的"单向流动"。
⽤户访问 View
View 发出⽤户的 Action
Dispatcher 收到 Action ,要求 Store 进⾏相应的更新。
Store 更新后,发出⼀个 “change” 事件。
View 收到 “change” 事件后,更新⻚⾯。

18 说说你⽤react有什么坑点?

1. JSX做表达式判断时候,需要强转为boolean类型

如果不使⽤ !!b 进⾏强转数据类型,会在⻚⾯⾥⾯输出 0 。

render() {const b = 0;
return <div>
{!!b && <div>这是⼀段⽂本</div>
}
</div> }

2. 尽量不要在 componentWillReviceProps ⾥使⽤ setState,如果⼀定要使⽤,那么需要判 断结束条件,不然会出现⽆限重渲染,导致⻚⾯崩溃。
3. 给组件添加ref时候,尽量不要使⽤匿名函数,因为当组件更新的时候,匿名函数会被当做 新的prop处理,让ref属性接受到新函数的时候,react内部会先清空ref,也就是会以null为回 调参数先执⾏⼀次ref这个props,然后在以该组件的实例执⾏⼀次ref,所以⽤匿名函数做ref 的时候,有的时候去ref赋值后的属性会取到null
4. 遍历⼦节点的时候,不要⽤ index 作为组件的 key 进⾏传⼊。

19 我现在有⼀个button,要⽤react在上⾯绑定点击事件,要怎么 做?

class Demo {render() {return <button onClick={(e) => {alert('我点击了按钮')
}}>
按钮
</button>
} }

面试官可能会问:你觉得你这样设置点击事件会有什么问题吗?
由于 onClick 使⽤的是匿名函数,所有每次重渲染的时候,会把该onClick 当做⼀个新的 prop 来处理,会将内部缓存的 onClick 事件进⾏ 重新赋值,所以相对直接使⽤函数来说,可能有⼀点的性能下降。
修改

class Demo {onClick = (e) => {alert('我点击了按钮')
}
render() {return <button onClick={this.onClick}>
按钮
</button>
}

20 react 的虚拟dom是怎么实现的?

⾸先说说为什么要使⽤ Virturl DOM ,因为操作真实 DOM 的耗费的性能代价太⾼,所以 react 内部使⽤ js 实现了⼀套dom结构,在每次操作在和真实 dom之前,使⽤实现好的diff算法,对虚拟dom进⾏⽐较,递归找出有变化的 dom节点,然后对其进⾏更新操作。为了实现虚拟 DOM ,我们需要把每⼀种 节点类型抽象成对象,每⼀种节点类型有⾃⼰的属性,也就是prop,每次进 ⾏ diff 的时候, react 会先⽐较该节点类型,假如节点类型不⼀样,那么react 会直接删除该节点,然后直接创建新的节点插⼊到其中,假如节点类 型⼀样,那么会⽐较 prop 是否有更新,假如有 prop 不⼀样,那么 react会判定该节点有更新,那么重渲染该节点,然后在对其⼦节点进⾏⽐较,⼀层 ⼀层往下,直到没有⼦节点。
**

21 react 的渲染过程中,兄弟节点之间是怎么处理的?也就是key值 不⼀样的时候

**

通常我们输出节点的时候都是map⼀个数组然后返回⼀个 ReactNode ,为了⽅便 react 内部进⾏优化,我们必须给每⼀个 reactNode 添加 key ,这 个 key prop 在设计值处不是给开发者⽤的,⽽是给react⽤的,⼤概的作⽤ 就是给每⼀个 reactNode 添加⼀个身份标识,⽅便react进⾏识别,在重渲染 过程中,如果key⼀样,若组件属性有所变化,则 react 只更新组件对应的属 性;没有变化则不更新,如果key不⼀样,则react先销毁该组件,然后重新创 建该组件。

每天一句中文式外语

巴西葡萄牙语

你好,你说英语吗?
哦一,发蜡,英国来续?(联想记忆:发蜡是英国来的,再续一点发蜡)
我不是很懂
闹,贡布里安肚,摸一肚(联想记忆:闹呢?贡布里安的肚子很好,你就摸你的小肚子了)
早上好!
波翁 跌
下午好!
波阿 大
晚上好!
波阿 闹一得

ATT:(巴西语跟葡语类似于英式英语与美式英语一样,他们都能听得懂)

React简单聊聊【面试】相关推荐

  1. 【工作感悟】——聊聊面试那些事

    前一阵子写年终总结的时候,小乖问我怎么不提工作那的事.后来我也想了想,为什么呢?是懒?是没感触?应该都不是吧.我算出去比较久的了,既然工作中遇到那么多人那么多事,也从中收获了不少体会,为什么不写出来分 ...

  2. 简单聊聊C/C++中的左值和右值

    文章目录 前言 问题 历史渊源 认识左值和右值 具体的示例 最简单的赋值语句 自增自减运算 前置自增 后置自增 自增表达式赋值 函数表达式 总结 前言 为什么标题要写成简单聊聊,而不是写成什么&quo ...

  3. 数据结构算法 简单的面试思考题

    目录 简单的面试思考题 思考题一 思考题二 思考题三 简单的面试思考题 思考题一 有64瓶疫苗, 其中一瓶不小心混入了有害物质, 现在要利用小白鼠找出那一瓶! 注意:小白鼠只要喝一点点混入有害物质的在 ...

  4. java简单的面试题目_简单的面试题目,大跌眼镜的结果

    原标题:简单的面试题目,大跌眼镜的结果 大老远跑来面试,总不能聊几句就走人吧.碍于情面,起码也得聊上十几分钟.招聘高峰这种情况尤甚,浪费你我时间.所以越来越多的组织会采用电话面试的方式,进行初步筛选. ...

  5. 简单聊聊Python协程

    往期好文推荐 学习Python不需要程基础? 0基础不用怕,从0到1轻松教你入门Python python系统学习流线图,教你一步一步学会python 成为一名做大数据开发的女程序员,并不是二狗进入大 ...

  6. python 打印皮卡丘_来简单聊聊python的装饰器呀~

    原文链接 来简单聊聊python的装饰器呀~​mp.weixin.qq.com 导语 之前很多小伙伴留言给我说看别人写的代码经常会感觉云里雾里的,完全看不懂,其实那些代码无非就是用了些python语法 ...

  7. 简单聊聊HDFS RBF第二阶段工作近期的一些进展

    前言 前些时间Apache Hadoop 3.1.0版本正式发布,里面新增了很多feature以及一些bug fix,improvement改进.因为笔者本人最近几个月一直跟进,参与的是HDFS RB ...

  8. react 简单的表格导出

    react 简单的表格导出 js-export-excel(纯js 支持中文) ES6 module 当页面需要导出简单的excel时,如果需要纯前端实现,可以使用js-export-excel 首先 ...

  9. 红米k30 android10 go,小米10/红米K30至尊纪念版:真有那么香吗?简单聊聊它们的优缺点...

    小米10/红米K30至尊纪念版:真有那么香吗?简单聊聊它们的优缺点 2020-08-12 20:00:45 201点赞 197收藏 199评论 创作立场声明:说说真香机的缺点,帮助大家做更全面的购买决 ...

最新文章

  1. 谷歌、脸书、微软、亚马逊、苹果、百度等AI巨头发展路径探析
  2. ORA-00904 的解决
  3. 计算机二级日期格式,09年计算机二级辅导:指定格式的日期字符串转化成java.util.Date类型日期对象...
  4. 【CyberSecurityLearning 7】AD域
  5. repeater 的解释说明 用法
  6. SUN JAVA面试笔试题
  7. 考研还是直接工作?嵌入式or前端
  8. JMETER分布式部署注意事项
  9. python斐波那契递归_Python递归斐波那契示例
  10. 使用jquery为table动态添加行的实现代码
  11. 2023年数据结构考研知识梳理视频哪里有
  12. 程序人生之常见术语与名词解释
  13. 【manjaro安装最新的搜狗输入法】2022年1月4号有效测试
  14. 谷歌学术搜索 2019
  15. [转]现代密码学实践指南
  16. java 5分钟_java计算下一个整5分钟时间点
  17. ROS机器人的远程启动和控制过程
  18. 被遗忘的设计模式——空对象模式(Null Object Pattern)
  19. vue init webpack缺少标识符_Vue脚手架热更新技术探秘
  20. 【前端笔记】js计算两个日期差多少天

热门文章

  1. 【车联网】一文了解5G在车联网中的应用
  2. python列表排序方法-python list排序的两种方法及实例讲解
  3. AITO问界 M5正式交付:搭载华为鸿蒙系统 24.98万元起
  4. 又一主播逃税被罚!快手主播“驴嫂平荣”被追缴并罚款6200.3万元
  5. 极兔速递完成17.35亿美元融资?回应:不实消息
  6. 特斯拉部分车型将逐渐搭载磷酸铁锂电池,比亚迪有望成为其电池供应商
  7. 消息透露苹果新款MacBook Pro预计将在第三季度或第四季度发布
  8. 看过各地的方言标语,才明白什么叫文字的力量
  9. 微信Windows版本升级 可以浏览朋友圈了
  10. 腾讯股价创新高:总裁刘炽平减持40万股 套现2.5亿港元