React有关的一些考点总结

1,470 阅读6分钟

1.React中key值的作用

key值的作用是给同级的元素添加一个唯一标识,因为在React diff算法中,是根据key值来判断元素是否是新增还是移动等等,减少了不必要的元素重渲染。React 还需要借助 Key 值来判断元素与本地状态的关联关系。

2.shouldComponentUpdate 是做什么的,(react 性能优化是哪个周期函数?)

shouldComponentUpdate 方法是用来判断render是否需要重新渲染DOM的,因为描绘DOM是非常耗性能的,所以能在这里生命周期里面写出优化的diff算法,就可以极大的提升性能。

3.为什么虚拟 dom 会提高性能?

虚拟DOM相当于是在js和真实DOM之中增加了一个缓存,利用dom diff算法避免了一些没有必要的dom操作,从而提升性能。 用JavaScript来表示一颗DOM树的话,相当于在第一次创建的时候,就创建好了一棵DOM数,当你状态发生改变时,会重新构造一棵虚拟DOM树来跟已经渲染好的真实DOM树进行对比,得出差异后再把记录的差异应用到真实的DOM树中,这样视图就更新了,也提高了性能

4.react diff 原理

  • 把树形结构按照层级来分,进行同级之间的比较。
  • 给列表中的每个单元赋予一个key值,方便比较。
  • react只会匹配相同组件名字的component
  • 合并操作,调用component的setState方法,react将其标记一下dirty,到所有的事件循环结束之后,就会检查所有react所标记过的dirty的component,然后重新渲染。
  • 选择性子树渲染,开发人员可以重写shouldComponentUpdate提高

5.React 中 refs 的作用是什么?

refs是React给我们提供的安全访问DOM元素或实例的方法,可以直接操控元素上有ref属性的DOM,方便开发。

6.类组件(class component)和函数式组件(function component)之间有何不同?

类组件允许你使用更多的功能,例如钩子函数,自身的状态,也能直接访问store仓库并维持状态。 如果组件仅仅接收props,并且将组件自身渲染到页面上时,该组件就是一个无状态组件,可以使用一个纯函数来创建这样的组件。

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

state是一种数据结构,用于页面渲染时所使用的默认值,也是用户事件行为的结果。 props则是组件的配置,props由父传递给子组件,组件不能改变自身的props,但是可以把他的子组件的porps统一管理,props也可以传递回调函数。

8.了解 redux 么,说一下 redux 把

redux 是一个应用数据流框架,主要是解决了组件间状态共享的问题,原理是集中式管理,主要有三个核心方法,action,store,reducer,工作流程是 view 调用 store 的 dispatch 接收 action 传入 store,reducer 进行 state 操作,view 通过 store 提供的 getState 获取最新的数据,flux 也是用来进行数据操作的,有四个组成部分 action,dispatch,view,store,工作流程是 view 发出一个 action,派发器接收 action,让 store 进行数据更新,更新完成以后 store 发出 change,view 接受 change 更新视图。Redux 和 Flux 很像。主要区别在于 Flux 有多个可以改变应用状态的 store,在 Flux 中 dispatcher 被用来传递数据到注册的回调事件,但是在 redux 中只能定义一个可更新状态的 store,redux 把 store 和 Dispatcher 合并,结构更加简单清晰 新增 state,对状态的管理更加明确,通过 redux,流程更加规范了,减少手动编码量,提高了编码效率,同时缺点时当数据更新时有时候组件不需要,但是也要重新绘制,有些影响效率。一般情况下,我们在构建多交互,多数据流的复杂项目应用时才会使用它们

9.redux 有什么缺点

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

10.react-redux

提供两个对象(Connect,Provider),React-Redux 组件的作用是对 react 与 redux 进行连接,如果在 react 项目中直接使用 redux,那么需要把 redux 中的 store 数据,通过 props 属性,一层一层传递到组件中,这样做太麻烦了,所以可以借助 React-Redux 模块,可以跨层级的在任意组件中直接把 Redux 中的 store 数据取出来。

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

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

12.描述事件在 React 中的处理方式

为了解决跨浏览器兼容性问题,您的 React 中的事件处理程序将传递 SyntheticEvent 的实例,它是 React 的浏览器本机事件的跨浏览器包装器

13.简述flux思想

Flux的最大特点,就是数据的‘单向流动’。 用户访问view,view视图层发送用户的action,dispatch收到action之后,申请store进行更新,store更新后,发出一个‘change’事件,view收到‘change’事件之后事件发生改变。

14.jsx如何解析的

jsx需要转化为AST语法树,先通过babel将jsx转换为react的createElement函数调用

const a=<h1 style={{"color":"red"}}>123<div>test</div></h1>
经过编译之后=>

"use strict";

var a = React.createElement("h1", {
  style: {
    "color": "red"
  }
}, "123", React.createElement("div", null, "test"));

最后AST树的样子

{
    $$typeof: Symbol(react.element)
    key: null
    props: {className: "red", children: "Click Me"}
    ref: null
    type: "div"
    _owner: null
    _store: {validated: false}
    _self: null
    _source: null
}

调用render方法渲染

  • 将ast树转换为真实的dom
  • 挂载到页面上

15 react-router

  • <browserRouter />
    http://127.0.0.1:3000/info 处于二级路由刷新时会向服务端发请求,需要服务端做下修改:收到请求的url不是功能性的,而是前端路由时,重新加载入口html文件,nginx重定向

  • <hashRouter />
    http://127.0.0.1:3000/#/info
    browserHistory使用的是HTML5的History API,浏览器提供相应的接口修改浏览器的历史记录。hashHistory是通过改变地址后面的hash来改变浏览器的历史记录。

    History API提供了pushState和replaceState增加替换历史记录,但是hash没有替换历史记录功能。

  • <memoryRouter />
    至于MemoryRouter,就是没有URL的情况,一般来说,”路由“指的就是URL和网页之间的映射,在某些环境(比如React Native)下,根本没有URL,只能靠Memory默默记住就好。

16 jsBridge

  • JsBridge之所以能实现Native与Js相互调用的功能,其核心实现其实就是
  1. 拦截Url
  2. load url("javascript:js_method()");

17.pureComponent 和 component 区别

浅比较(shallowEqual):是react源码中的一个函数,它代替了shouldComponentUpdate的工作, 只比较外层数据结构,只要外层相同,则认为没有变化,不会深层次比较数据。