下面是一个经常使用的关于 React 的面试问题列表:javascript
不管做为一个面试者,或者招聘官,下面这些问题均可以去参考务必收藏java
React 会建立一个虚拟 DOM(virtual DOM)。当一个组件中的状态改变时,React 首先会经过 "diffing" 算法来标记虚拟 DOM 中的改变,第二步是调节(reconciliation),会用 diff 的结果来更新 DOM。react
render
函数就会很容易知道一个组件是如何被渲染的展现组件关心组件看起来是什么。展现专门经过 props 接受数据和回调,而且几乎不会有自身的状态,但当展现组件拥有自身的状态时,一般也只关心 UI 状态而不是数据的状态。webpack
容器组件则更关心组件是如何运做的。容器组件会为展现组件或者其它容器组件提供数据和行为(behavior),它们会调用 Flux actions
,并将其做为回调提供给展现组件。容器组件常常是有状态的,由于它们是(其它组件的)数据源。web
store
并维持状态props
,并将组件自身渲染到页面时,该组件就是一个 '无状态组件(stateless component)',可使用一个纯函数来建立这样的组件。这种组件也被称为哑组件(dumb components)或展现组件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 组件中,应该在 componentDidMount
中发起网络请求。这个方法会在组件第一次“挂载”(被添加到 DOM)时执行,在组件的生命周期中仅会执行一次。更重要的是,你不能保证在组件挂载以前 Ajax 请求已经完成,若是是这样,也就意味着你将尝试在一个未挂载的组件上调用 setState,这将不起做用。在 componentDidMount
中发起网络请求将保证这有一个组件能够更新了。redux
在 HTML 中,相似 <input>
, <textarea>
和 <select>
这样的表单元素会维护自身的状态,并基于用户的输入来更新。当用户提交表单时,前面提到的元素的值将随表单一块儿被发送。但在 React 中会有些不一样,包含表单元素的组件将会在 state 中追踪输入的值,而且每次调用回调函数时,如 onChange
会更新 state,从新渲染组件。一个输入表单元素,它的值经过 React 的这种方式来控制,这样的元素就被称为"受控元素"。数组
Refs 能够用于获取一个 DOM 节点或者 React 组件的引用。什么时候使用 refs 的好的示例有管理焦点/文本选择,触发命令动画,或者和第三方 DOM 库集成。你应该避免使用 String 类型的 Refs 和内联的 ref 回调。Refs 回调是 React 所推荐的。安全
高阶组件是一个以组件为参数并返回一个新组件的函数。HOC 运行你重用代码、逻辑和引导抽象。最多见的多是 Redux 的 connect
函数。除了简单分享工具库和简单的组合,HOC最好的方式是共享 React 组件之间的行为。若是你发现你在不一样的地方写了大量代码来作同一件事时,就应该考虑将代码重构为可重用的 HOC。
练习
React.Children.toArray
对传入组件的子组件进行排序的 HOCthis
值(在构造函数中是新对象;在严格模式下,函数调用中的 this
是未定义的;若是函数被称为“对象方法”,则为基础对象等),但箭头函数不会,它会使用封闭执行上下文的 this
值。this
的值由于 this.props
和 this.state
的更新多是异步的,不能依赖它们的值去计算下一个 state。
this
,还有其它方式吗你可使用属性初始值设定项(property initializers)来正确绑定回调,create-react-app 也是默认支持的。在回调中你可使用箭头函数,但问题是每次组件渲染时都会建立一个新的回调。
在组件的 render
方法中返回 null
并不会影响触发组件的生命周期方法
Keys 会有助于 React 识别哪些 items
改变了,被添加了或者被移除了。Keys 应该被赋予数组内的元素以赋予(DOM)元素一个稳定的标识,选择一个 key 的最佳方法是使用一个字符串,该字符串能唯一地标识一个列表项。不少时候你会使用数据中的 IDs 做为 keys,当你没有稳定的 IDs 用于被渲染的 items
时,可使用项目索引做为渲染项的 key,但这种方式并不推荐,若是 items
能够从新排序,就会致使 re-render
变慢。
在 super()
被调用以前,子类是不能使用 this
的,在 ES2015 中,子类必须在 constructor
中调用 super()
。传递 props
给 super()
的缘由则是便于(在子类中)能在 constructor
访问 this.props
。
JSX 是 JavaScript 语法的一种语法扩展,并拥有 JavaScript 的所有功能。JSX 生产 React "元素",你能够将任何的 JavaScript 表达式封装在花括号里,而后将其嵌入到 JSX 中。在编译完成以后,JSX 表达式就变成了常规的 JavaScript 对象,这意味着你能够在 if
语句和 for
循环内部使用 JSX,将它赋值给变量,接受它做为参数,并从函数中返回它。
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.map
,React.Children.forEach
, React.Children.count
, React.Children.only
,React.Children.toArray
。
State 和 props 相似,但它是私有的,而且彻底由组件自身控制。State 本质上是一个持有数据,并决定组件如何渲染的对象。
当你想去配置 webpack 或 babel presets。
Redux 的基本思想是整个应用的 state 保持在一个单一的 store 中。store 就是一个简单的 javascript 对象,而改变应用 state 的惟一方式是在应用中触发 actions,而后为这些 actions 编写 reducers 来修改 state。整个 state 转化是在 reducers 中完成,而且不该该有任何反作用。
Store 是一个 javascript 对象,它保存了整个应用的 state。与此同时,Store 也承担如下职责:
getState()
访问 statedispatch(action)
改变 statesubscribe(listener)
注册 listenerssubscribe(listener)
返回的函数处理 listeners 的注销Actions 是一个纯 javascript 对象,它们必须有一个 type 属性代表正在执行的 action 的类型。实质上,action 是将数据从应用程序发送到 store 的有效载荷。
一个 reducer 是一个纯函数,该函数以先前的 state 和一个 action 做为参数,并返回下一个 state。
Redux thunk 是一个容许你编写返回一个函数而不是一个 action 的 actions creators 的中间件。若是知足某个条件,thunk 则能够用来延迟 action 的派发(dispatch),这能够处理异步 action 的派发(dispatch)。
一个纯函数是一个不依赖于且不改变其做用域以外的变量状态的函数,这也意味着一个纯函数对于一样的参数老是返回一样的结果。