【react面试题】不可错过的react 面试题 「务必收藏」

下面是一个经常使用的关于 React 的面试问题列表:javascript

不管做为一个面试者,或者招聘官,下面这些问题均可以去参考

务必收藏java

React 的工做原理

React 会建立一个虚拟 DOM(virtual DOM)。当一个组件中的状态改变时,React 首先会经过 "diffing" 算法来标记虚拟 DOM 中的改变,第二步是调节(reconciliation),会用 diff 的结果来更新 DOM。react

使用 React 有何优势

  • 只需查看 render 函数就会很容易知道一个组件是如何被渲染的
  • JSX 的引入,使得组件的代码更加可读,也更容易看懂组件的布局,或者组件之间是如何互相引用的
  • 支持服务端渲染,这能够改进 SEO 和性能
  • 易于测试
  • React 只关注 View 层,因此能够和其它任何框架(如Backbone.js, Angular.js)一块儿使用

展现组件(Presentational component)和容器组件(Container component)之间有何不一样

展现组件关心组件看起来是什么。展现专门经过 props 接受数据和回调,而且几乎不会有自身的状态,但当展现组件拥有自身的状态时,一般也只关心 UI 状态而不是数据的状态。webpack

容器组件则更关心组件是如何运做的。容器组件会为展现组件或者其它容器组件提供数据和行为(behavior),它们会调用 Flux actions,并将其做为回调提供给展现组件。容器组件常常是有状态的,由于它们是(其它组件的)数据源。web

类组件(Class component)和函数式组件(Functional component)之间有何不一样

  • 类组件不只容许你使用更多额外的功能,如组件自身的状态和生命周期钩子,也能使组件直接访问 store 并维持状态
  • 当组件仅是接收 props,并将组件自身渲染到页面时,该组件就是一个 '无状态组件(stateless component)',可使用一个纯函数来建立这样的组件。这种组件也被称为哑组件(dumb components)或展现组件

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

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

Props(properties 的简写)则是组件的配置。props 由父组件传递给子组件,而且就子组件而言,props 是不可变的(immutable)。组件不能改变自身的 props,可是能够把其子组件的 props 放在一块儿(统一管理)。Props 也不只仅是数据--回调函数也能够经过 props 传递。算法

指出(组件)生命周期方法的不一样

  • componentWillMount -- 多用于根组件中的应用程序配置
  • componentDidMount -- 在这能够完成全部没有 DOM 就不能作的全部配置,并开始获取全部你须要的数据;若是须要设置事件监听,也能够在这完成
  • componentWillReceiveProps -- 这个周期函数做用于特定的 prop 改变致使的 state 转换
  • shouldComponentUpdate -- 若是你担忧组件过分渲染,shouldComponentUpdate 是一个改善性能的地方,由于若是组件接收了新的 prop, 它能够阻止(组件)从新渲染。shouldComponentUpdate 应该返回一个布尔值来决定组件是否要从新渲染
  • componentWillUpdate -- 不多使用。它能够用于代替组件的 componentWillReceiveProps 和 shouldComponentUpdate(但不能访问以前的 props)
  • componentDidUpdate -- 经常使用于更新 DOM,响应 prop 或 state 的改变
  • componentWillUnmount -- 在这你能够取消网络请求,或者移除全部与组件相关的事件监听器

应该在 React 组件的何处发起 Ajax 请求

在 React 组件中,应该在 componentDidMount 中发起网络请求。这个方法会在组件第一次“挂载”(被添加到 DOM)时执行,在组件的生命周期中仅会执行一次。更重要的是,你不能保证在组件挂载以前 Ajax 请求已经完成,若是是这样,也就意味着你将尝试在一个未挂载的组件上调用 setState,这将不起做用。在 componentDidMount 中发起网络请求将保证这有一个组件能够更新了。redux

何为受控组件(controlled component)

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

在 React 中,refs 的做用是什么

Refs 能够用于获取一个 DOM 节点或者 React 组件的引用。什么时候使用 refs 的好的示例有管理焦点/文本选择,触发命令动画,或者和第三方 DOM 库集成。你应该避免使用 String 类型的 Refs 和内联的 ref 回调。Refs 回调是 React 所推荐的。安全

何为高阶组件(higher order component)

高阶组件是一个以组件为参数并返回一个新组件的函数。HOC 运行你重用代码、逻辑和引导抽象。最多见的多是 Redux 的 connect 函数。除了简单分享工具库和简单的组合,HOC最好的方式是共享 React 组件之间的行为。若是你发现你在不一样的地方写了大量代码来作同一件事时,就应该考虑将代码重构为可重用的 HOC。

练习


  • 写一个反转其输入的 HOC
  • 写一个从 API 提供数据给传入的组件的 HOC
  • 写一个实现 shouldComponentUpdate 来避免 reconciliation 的 HOC
  • 写一个经过 React.Children.toArray 对传入组件的子组件进行排序的 HOC

使用箭头函数(arrow functions)的优势是什么

  • 做用域安全:在箭头函数以前,每个新建立的函数都有定义自身的 this 值(在构造函数中是新对象;在严格模式下,函数调用中的 this 是未定义的;若是函数被称为“对象方法”,则为基础对象等),但箭头函数不会,它会使用封闭执行上下文的 this 值。
  • 简单:箭头函数易于阅读和书写
  • 清晰:当一切都是一个箭头函数,任何常规函数均可以当即用于定义做用域。开发者老是能够查找 next-higher 函数语句,以查看 this 的值

为何建议传递给 setState 的参数是一个 callback 而不是一个对象

由于 this.props 和 this.state 的更新多是异步的,不能依赖它们的值去计算下一个 state。

除了在构造函数中绑定 this,还有其它方式吗

你可使用属性初始值设定项(property initializers)来正确绑定回调,create-react-app 也是默认支持的。在回调中你可使用箭头函数,但问题是每次组件渲染时都会建立一个新的回调。

怎么阻止组件的渲染

在组件的 render 方法中返回 null 并不会影响触发组件的生命周期方法

当渲染一个列表时,何为 key?设置 key 的目的是什么

Keys 会有助于 React 识别哪些 items 改变了,被添加了或者被移除了。Keys 应该被赋予数组内的元素以赋予(DOM)元素一个稳定的标识,选择一个 key 的最佳方法是使用一个字符串,该字符串能唯一地标识一个列表项。不少时候你会使用数据中的 IDs 做为 keys,当你没有稳定的 IDs 用于被渲染的 items 时,可使用项目索引做为渲染项的 key,但这种方式并不推荐,若是 items 能够从新排序,就会致使 re-render 变慢。

(在构造函数中)调用 super(props) 的目的是什么

在 super() 被调用以前,子类是不能使用 this 的,在 ES2015 中,子类必须在 constructor 中调用 super()。传递 props 给 super() 的缘由则是便于(在子类中)能在 constructor 访问 this.props

何为 JSX

JSX 是 JavaScript 语法的一种语法扩展,并拥有 JavaScript 的所有功能。JSX 生产 React "元素",你能够将任何的 JavaScript 表达式封装在花括号里,而后将其嵌入到 JSX 中。在编译完成以后,JSX 表达式就变成了常规的 JavaScript 对象,这意味着你能够在 if 语句和 for 循环内部使用 JSX,将它赋值给变量,接受它做为参数,并从函数中返回它。

怎么用 React.createElement 重写下面的代码

Question:

const element = ( <h1 className="greeting"> Hello, rdhub.cn! </h1> );

Answer:

const element = React.createElement( 'h1', {className: 'greeting'}, 'Hello, rdhub.cn!' );

何为 Children

在JSX表达式中,一个开始标签(好比<a>)和一个关闭标签(好比</a>)之间的内容会做为一个特殊的属性props.children被自动传递给包含着它的组件。

这个属性有许多可用的方法,包括 React.Children.mapReact.Children.forEach, React.Children.count, React.Children.onlyReact.Children.toArray

在 React 中,何为 state

State 和 props 相似,但它是私有的,而且彻底由组件自身控制。State 本质上是一个持有数据,并决定组件如何渲染的对象。

什么缘由会促使你脱离 create-react-app 的依赖

当你想去配置 webpack 或 babel presets。

何为 redux

Redux 的基本思想是整个应用的 state 保持在一个单一的 store 中。store 就是一个简单的 javascript 对象,而改变应用 state 的惟一方式是在应用中触发 actions,而后为这些 actions 编写 reducers 来修改 state。整个 state 转化是在 reducers 中完成,而且不该该有任何反作用。

在 Redux 中,何为 store

Store 是一个 javascript 对象,它保存了整个应用的 state。与此同时,Store 也承担如下职责:

  • 容许经过 getState() 访问 state
  • 运行经过 dispatch(action) 改变 state
  • 经过 subscribe(listener) 注册 listeners
  • 经过 subscribe(listener) 返回的函数处理 listeners 的注销

何为 action

Actions 是一个纯 javascript 对象,它们必须有一个 type 属性代表正在执行的 action 的类型。实质上,action 是将数据从应用程序发送到 store 的有效载荷。

何为 reducer

一个 reducer 是一个纯函数,该函数以先前的 state 和一个 action 做为参数,并返回下一个 state。

Redux Thunk 的做用是什么

Redux thunk 是一个容许你编写返回一个函数而不是一个 action 的 actions creators 的中间件。若是知足某个条件,thunk 则能够用来延迟 action 的派发(dispatch),这能够处理异步 action 的派发(dispatch)。

何为纯函数(pure function)

一个纯函数是一个不依赖于且不改变其做用域以外的变量状态的函数,这也意味着一个纯函数对于一样的参数老是返回一样的结果。

相关文章
相关标签/搜索