2020-10-29 | 面试合集 | UNLOCK | 更新时间:2020-10-29 15:25

前端面试题的收集和总结(React篇)

React

讲一下你对React的理解?

react是facebook在2011年开发的的javascript框架,在2015年进行的开源,有着浓厚的社区文化;react整体是函数式的思想,把组件设计成纯函数,状态和逻辑通过参数传入,所以在react中,是单向数据流;react通过js来操控一切,设计了jsx,通过jsx来生成html,css;react更喜欢规范化用户,让用户,社区去做更多,

讲一下你对JSX的理解和认识?

JSX是JavaScript的一种语法扩展,运用于React架构中,类似一种模板语言,但是它拥有JavaScript的全部能力。由于浏览器目前不支持jsx,JSx需要通过babel进行转换,转换成javascript

类组件和函数组件有什么区别?

一个是通过ES6的class来定义组件,一个是通过函数来定义组件;类组件允许你使用更多额外的功能,如组件自身的状态和生命周期钩子,也能使组件直接访问 store 并维持状态
而函数组件则是一个存函数,通过return返回需要渲染的部分,当然随着Hooks的出现,函数组件也可以使用state和更多的类似生命周期的react特性

state 和 props有什么区别?

State 是一种数据结构,用于组件挂载时所需数据的默认值。State 可能会随着时间的推移而发生改变,但多数时候是作为用户事件行为的结果。
Props(properties 的简写)则是组件的配置。props 由父组件传递给子组件,并且就子组件而言,props 是不可变的(immutable)。组件不能改变自身的 props,但是可以把其子组件的 props 放在一起(统一管理)

展示组件和容器组件的区别?

  • 展示组件关心组件看起来是什么。展示专门通过 props 接受数据和回调,并且几乎不会有自身的状态,但当展示组件拥有自身的状态时,通常也只关心 UI 状态而不是数据的状态。
  • 容器组件则更关心组件是如何运作的。容器组件会为展示组件或者其它容器组件提供数据和行为(behavior),它们会调用 Flux actions,并将其作为回调提供给展示组件。容器组件经常是有状态的,因为它们是(其它组件的)数据源。

React 中 keys的作用是什么?

Keys 是 React 用于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识,在 React Diff 算法中 React 会借助元素的 Key 值来判断该元素是新近创建的还是被移动而来的元素,从而减少不必要的元素重渲染。此外,React 还需要借助 Key 值来判断元素与本地状态的关联关系

调用 super(props) 的目的是什么?

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

React 中 refs 的作用是什么?

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

讲一下 React 的生命周期?

constructor getDerviedStateFromProps render componentDidMount shouleComponentUpdate getSnapshotBeforeUpdate componentDidUpdate componentWillUnmount

在react16版本中,常用的生命周期有 constructor() 初始化的时候调用;render() 初始化和更新的时候都会调用;componentDidMount() 组件挂载之后立即调用;componentDidUpdate() 更新后立即调用;componentWillUnmount() 组件卸载后立即调用;

不常用的生命周期有 render之前初始化更新都用static getDerviedStateFromProps() shouldComponentUpdate() getSnapshotBeforeUpdate() static getDerviedStateFromError() componentDidCatch()

你一般在哪里执行网络请求?

class组件中,应该在 componentDidMount 生命周期执行数据请求,因为在此生命周期,dom已经挂载完毕,可以保证setState() 在数据异步处理后可以保证视图的正常加载,而函数组件则在useEffect 进行数据请求

讲讲你对 Hooks 的理解?

Hooks是React16.8新增的特性,它可以让你在不编写class组件的情况下使用state和react的其他特性;

useState

Hooks中有 useState() 它返回一个state和更新state的函数,可以用于函数组件的state管理。

useState(name,setName)=useState('初始状态')

useEffect

useEffect() 则接收一个包含命令式,且可能有副作用的函数,默认情况下,useEffect会在渲染结束后执行。

useEffect(()=>{
  ......
  return(()=>{}) //return一个函数,可以在组件卸载后执行函数
},[porps.name])  //只有在props.name改变后,才会执行,如果是一个空函数,则只执行一次

useContext

useContext() 接收一个 context 对象(React.createContext 的返回值)并返回该 context 的当前值,一般是对它所包裹组件提供全局共享数据

const them={height:{h:200}}

const useCon=React.createContext(them.height)

function App(){
  const thene=useContext(useCon) // 接受context对象,返回当前值
  return(
    <p style={{height:thene.h + 'px'}}>321</p> 
  )
}

额外的Hooks

还有一些额外的hooks 比如:useRef()作为ref在函数组件中的调用 useReducer() 作为useState的替代方案;useMemo()在组件渲染期间调用,不可以执行dom操作 useCallback()作为useMemo的语法糖,useDubugValue()可用于react开发工具中显示自定义Hook;useLayoutEffect() 作为effect的补充,在所有dom改变之后调用 useImperativeHandle()

你对HOC(高阶组件)的理解?

高阶组件是一个以组件为参数并返回一个新组件的函数。是React用于复用组件逻辑的一种方式,是基于React的组合特性形成的一种设计模式;最常用的的HOC场景有:属性代理:主要用于修改props,抽象state和调用refs等等,反向继承:通过return 参数组件的super.render,被动继承参数组件,可以调用参数组件的state,props生命周期等

讲一下 React diff 的原理

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

讲一下你对 Redux 的理解?

Redux 是javascript 的状态容器,提供可预测的状态管理。它除了可以和react进行组合之外还可以和其他开发框架进行结合。 Redux有三大原则,1:单一数据源,redux把整个应用的state存储在一个对象树中,并且整对象树存储在一个store中。2:state是只读的,唯一改变state的方法就是触发action,通过dispatch action触发reducer进行修改。3:使用纯函数进行state修改,reducer是一个存函数,他接受之前的state和action并返回新的state

Redux的属性有哪些

action reducer store
action是把数据从应用传递到store的有效载荷,reducer则指定了应用状态变化应该如何响应action并发送到store。store则是把他们联系在一起的对象;store的职责有:提供getState获取state;提供dispatch更新state;提供subscribe()注册监听器;通过sunscribe 返回函数取消监听器