生命周期

  • 组件将要挂载时触发的函数:componentWillMount

  • 组件挂载完成时触发的函数:componentDidMount

  • 是否要更新数据时触发的函数:shouldComponentUpdate

  • 将要更新数据时触发的函数:componentWillUpdate

  • 数据更新完成时触发的函数:componentDidUpdate

  • 组件将要销毁时触发的函数:componentWillUnmount

  • 父组件中改变了props传值时触发的函数:componentWillReceiveProps

shouldComponentUpdate 的作用?

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

React 中 keys 的作用是什么?

KeysReact 用于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识

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

(组件的)状态(state)和属性(props)之间有何不同?

  • State 是一种数据结构,用于组件挂载时所需数据的默认值。State 可能会随着时间的推移而发生突变,但多数时候是作为用户事件行为的结果

  • Props(properties 的简写)则是组件的配置。props 由父组件传递给子组件,并且就子组件而言,props 是不可变的(immutable)。组件不能改变自身的 props,但是可以把其子组件的 props 放在一起(统一管理)。Props 也不仅仅是数据--回调函数也可以通过 props 传递。

何为受控组件(controlled component)?

在 HTML 中,类似 <input/>, <select><textarea> 这样的表单元素会维护自身的状态,并基于用户的输入来更新。当用户提交表单时,前面提到的元素的值将随表单一起被发送。但在 React 中会有些不同,包含表单元素的组件将会在 state 中追踪输入的值,并且每次调用回调函数时,如 onChange 会更新 state,重新渲染组件。一个输入表单元素,它的值通过 React 的这种方式来控制,这样的元素就被称为"受控元素"。

展示组件(Presentational component)(也叫 UI 组件)和容器组件(Container component)(负责应用逻辑处理)之间有何不同

  • 展示组件(UI 组件)

    • 负责展示 UI,也就是组件如何渲染,具有很强的内聚性

    • 只关心得到数据后如何渲染

  • 容器组件(逻辑组件)

    • 负责应用逻辑处理,发送网络请求,处理返回数据,将处理过的数据传递给展示组件

    • 也提供修改数据源的方法,通过展示组件的props传递给展示组件

    • 当展示组件的状态变更引起源数据变化时,展示组件通过调用容器组件提供的方法同步这些变化

react-router的原理

  • BrowserRouterHashRouter 用来渲染Router所代表的组件

    • BrowserRouter --浏览器路由(属于后端路由) 会有一个#,通过这个# HTML 5 History进行前端跳转他的感觉像锚点

    • HasRouter --前端has路由(属于前端路由)很简洁没有#,但是需要 server 端支持

  • Route 用来匹配组件路径并且筛选需要渲染的组件

  • Switch 用来筛选需要渲染的唯一组件

  • Link 直接渲染某个页面组件

  • Redirect 类似于Link,在没有Route匹配成功时触发

何为高阶组件(HOC)?

高阶组件 其实就是一个函数而已,只不过参数是一个组件而已,返回了一个新的组件

复用组件的业务逻辑 react-redux connect 其实就是一个高阶组件

HOC 是纯函数,没有副作用 ------纯函数:输入确定,输出就一定确定

了解 redux 么,说一下 redux

  • redux 是一个应用数据流框架,主要是解决了组件间状态共享的问题,原理是集中式管理

  • 主要有三个核心方法,actionstorereducer

  • 工作流程是 view 调用 store 的 dispatch 接收 action 传入 store,reducer 进行 state 操作,view 通过 store 提供的 getState 获取最新的数据

  • 新增 state,对状态的管理更加明确,通过 redux,流程更加规范了,减少手动编码量,提高了编码效率,同时缺点时当数据更新时有时候组件不需要,但是也要重新绘制,有些影响效率。一般情况下,我们在构建多交互,多数据流的复杂项目应用时才会使用它们

redux中间件的理解,以及用过哪些中间件

  • redux-thunk:处理异步操作

  • redux-saga:处理异步操作

  • redux-promise:处理异步操作,actionCreator 的返回值是promise

Redux 遵循的三个原则是什么?

  • 单一事实来源:整个应用程序的状态存储在单个存储中的对象/状态树中

  • 状态是只读的:更改状态的惟一方法是触发一个动作

  • 使用纯函数来修改state:为了描述 action 如何改变 state tree ,你需要编写reducers

React , redux 可以运行在服务端吗?有什么优势

  1. 利于 SEO

  2. 提高首屏渲染速度

  3. 同构直出,使用同一份 JS 代码实现,便于开发和维护

react性能优化方案

  • 重写shouldComponentUpdate来避免不必要的 dom 操作

  • 使用 production 版本的react.js

  • 使用key来帮助React识别列表中所有子组件的最小变化

说说你用react有什么坑点?

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

  • 尽量不要在 componentWillReviceProps 里使用 setState,如果一定要使用,那么需要判断结束条件,不然会出现无限重渲染,导致页面崩溃

  • 遍历子节点的时候,不要用 index 作为组件的 key 进行传入

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

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

react diff 原理

  • 把树形结构按照层级分解,只比较同级元素

  • 给列表结构的每个单元添加唯一的 key 属性,方便比较

  • React 只会匹配相同 class 的 component(这里面的 class 指的是组件的名字)

  • 合并操作,调用 component 的 setState 方法的时候, React 将其标记为 dirty.到每一个事件循环结束, React 检查所有标记 dirty 的 component 重新绘制

  • 选择性子树渲染。开发人员可以重写 shouldComponentUpdate 提高 diff 的性能

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

我们必须给每一个元素添加 key 属性,大概的作用就是给每一个元素添加一个身份标识,方便react进行识别,在重渲染过程中,如果key一样,若组件属性有所变化,则react只更新组件对应的属性;没有变化则不更新,如果key不一样,则react先销毁该组件,然后重新创建该组件

react组件之间如何通信?

父子:父传子:props; 子传父:子调用父组件中的函数并传参; 兄弟:利用 redux 实现。 所有关系都通用的方法:利用PubSub.js订阅

setState 为什么是异步的

  1. 保证内部的一致性 (因为props是要等到父组件渲染过后才能拿到,也就是不能同步更新,state出于统一性设成异步更新)

  2. 性能优化 (举例说你正在一个聊天窗口输入,如果来了一条新消息又要render,那就会阻塞你的当前操作,导致延迟什么的)

  3. 支持state在幕后渲染(异步可以使state在幕后更新,而不影响你当前旧的页面的交互,提升用户体验)

react的优势以及特点

  • 优势

    • 实现对虚拟DOM的操作,使得它速度快,提高了Web性能

    • 组件化,模块化。react里每一个模块都是一个组件,组件化开发,可维护性高

    • 单向数据流,比较有序,有便于管理,它随着React视图库的开发而被 Facebook 概念化

    • 跨浏览器兼容:虚拟DOM帮助我们解决了跨浏览器问题,它为我们提供了标准化的 API,甚至在 IE8 中都是没问题的

  • 不足

    • react中只是 MVC 模式的View部分,要依赖引入很多其他模块开发

    • 当父组件进行重新渲染操作时,即使子组件的props或state没有做出任何改变,也会同样进行重新渲染

  • 特点

    • 声明式设计:React采用声明范式,可以轻松描述应用

    • 高效:React通过对DOM的模拟,最大限度地减少与DOM的交互

    • 灵活:React可以与已知的库或框架很好地配合

React面试题(超详细,附答案)的更多相关文章

  1. 29道Zookeeper面试题超详细(附答案)

    原文链接 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件 ...

  2. 数据挖掘领域十大经典算法之—C4.5算法(超详细附代码)

    https://blog.csdn.net/fuqiuai/article/details/79456971 相关文章: 数据挖掘领域十大经典算法之—K-Means算法(超详细附代码)        ...

  3. 2019新版UI设计面试题汇总(附答案)

    问题一.Android手机的常用设计尺寸有_________.怎么适配ios和安卓. 答案:安卓320 X 480是常规模拟器.但现在的开发都是用360x640做一倍率.480 X 800(1.5倍率 ...

  4. 2019 最新 阿里天猫、蚂蚁、钉钉ava 面试题汇总,附答案

    Java面试前需要做足各方面的准备工作,肯定都会浏览大量的面试题,本人也不例外,这是一些最新面试题,分享给大家. Java基础 面向对象的特征:继承.封装和多态 int 和 Integer 有什么区别 ...

  5. 总结2020最新50道Python面试题集锦(附答案)

    Python是目前编程领域最受欢迎的语言.在本文中,我将总结Python面试中最常见的50个问题.每道题都提供参考答案,希望能够帮助你在2019年求职面试中脱颖而出,找到一份高薪工作.这些面试题涉及P ...

  6. 给你准备好了——50道Python面试题集锦(附答案)

    Python是目前编程领域最受欢迎的语言.在本文中,我将总结Python面试中最常见的50个问题.每道题都提供参考答案,希望能够帮助你在2019年求职面试中脱颖而出,找到一份高薪工作.这些面试题涉及P ...

  7. 2019年JVM面试都问了什么?快看看这22道面试题!(附答案解析)

    一. Java 类加载过程? Java 类加载需要经历一下 7 个过程: 1. 加载 加载是类加载的第一个过程,在这个阶段,将完成一下三件事情: • 通过一个类的全限定名获取该类的二进制流. • 将该 ...

  8. Java高级面试题整理(附答案)

    这是我收集的10道高级Java面试问题列表.这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题.你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java ...

  9. 纯干货分享!2020阿里java岗笔试面试题总结(附答案)

    前言 2020金九银十马上结束,现为大家整理了这次金九银十面试阿里的面试题总结,都是我从朋友那拿到的面试真题,话不多说,满满的干货分享给大家! int a=10是原子操作吗? 是的.  注意点: i+ ...

  10. 数据挖掘领域十大经典算法之—SVM算法(超详细附代码)

    https://blog.csdn.net/fuqiuai/article/details/79483057

随机推荐

  1. Nginx编译与安装

    我的系统是CentOS-7,Nginx的源码可以在官网下载,网址为:http://nginx.org/en/download.html,我下载了目前的最新版本nginx-1.9.3.tar.gz 下载 ...

  2. D - 小Z的加油店 线段树+差分+GCD

    D - 小Z的加油店 HYSBZ - 5028   这个题目是一个线段树+差分+GCD 推荐一个差分的博客:https://www.cnblogs.com/cjoierljl/p/8728110.ht ...

  3. Dynamics 9.0 安装好后 公告出现 提示:出现错误。 请稍等片刻,然后重试。 如果问题仍然存在,请与管理员联系。

    此问题为系统的Bug,示例图如下: 解决方案为修改存储过程 p_RetrievePosts,将startDate参数的默认值改成 1900-01-01,endDate参数的默认值改成 9999-12- ...

  4. 004_Python的列表切片,增删改查,常用操作方法,元组,range,join

    列表 列表是Python中的基础数据类型之一,它是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = ['kevin',123,True,(1,2,3,'wusir'), ...

  5. 【Hadoop离线基础总结】伪分布模式环境搭建

    伪分布模式环境搭建 服务规划 适用于学习测试开发集群模式 步骤 第一步:停止单节点集群,删除/export/servers/hadoop-2.7.5/hadoopDatas,重新创建文件夹 停止单节点 ...

  6. OpenCV之Mat类使用总结

    #前言 Mat 是Opencv中很常用的一个图像容器类,图像在计算机中的存储形式是二进制字节流,其本质的存储形式如下图所示: 而一张图片是由很多像素点组成,单个像素点又会因为图像格式的不同而不同.例如 ...

  7. Queue-PriorityQueue源码解析

    Queue队列通常是先进先出(FIFO),但也有特殊的非FIFO,如本文也分析的PriorityQueue. Queue接口 Queue接口定义的方法: 添加元素接口: add(E e) -> ...

  8. 动手实现--AC自动机

    Trie树: 把若干个单词按前缀合并就得到一棵树,这棵树称为Trie树.Trie树是有根树,每条边表示一个字符,每个节点表示一个从根到当前节点的唯一路径上的字符依次连接得到的字符串.由于空串是任何串的 ...

  9. 03JAVA循环结构

    和JS\Python语句判断逻辑基本一致,不需要记录详细,只需要记录格式 一.for循环 for (初始化数据;判断语句:控制语句){ 循环体语句; } 二.while循环 初始化数据; while ...

  10. supersqli

    0x01 堆叠注入 1.定义与说明 在sql中,分号(;)表示一条sql语句的结束.在;结束之后继续构造下一条语句,会一起执行,因此为堆叠注入. union联合查询是将两条语句合并之后进行查询,uni ...