- jsx的本质是什么?它和js之间到底有什么关系? 为什么要用jsx语法?
它其实就是一个js对象 ,用来描述dom结构。 jsx 在编译过程会被babel转换成 -> React.createElement(type,config,children)。 主要是因为转换时间长,把它提到编译过程而不是运行过程,提高性能。
为什么用jsx语法,也可以直接写js对象,只不过可读性很差。 声明式 和命令式 。
过程 : jsx ->babel-> React.createElement -> React.reactElement -> 虚拟dom->传入 ReactDom.render() ->(渲染) 真实dom
- 为什么react 16 要更改组件的生命周期?
react 15 的生命周期:
注意这里的componentWillReceiveProps 方法 父组件只要更新了他就会触发。 即使props没有发生变化,也会触发当前方法。
shouldComponentUpdate 组件更新 由组件自身触发。 返回true ,false 用来判断是否需要后续操作。
componentWillComponent 无用,鸡肋,而且容易滥用。
getDerivedStateFromProps 只有一个作用,用Props更新state. 他是一个静态方法。没有this。 需要一个对象格式返回值。
- Fiber 架构。
Fiber会把同步渲染变成异步。
render 阶段可以被打断。commit
commit 阶段同步执行 ,render阶段可以被打断。
注意
render阶段允许暂停 , 中断 , 重启。 而不是只是重新执行。
所以 生命周期可能重复执行。
componentWillMount componentWillUpdate componentWillReceiveProps。
这些生命周期很容易被打断,反复执行。 假如是一个pay支付接口,会产生灾难性的风险。
总之,改造生命周期是为了firber架构带来的异步渲染组件做铺垫。
- 数据是如何在React 组件之间传递的?
单向数据流 。 prop 由高到低。 父传子 使用函数. 跨组件通信。 redux
createContext -> (provider -consumer) 。
context API 不能取代 redux
- react-hooks
类组件和函数组件 的根本区别。
1.他的心智模型不同, 一个有this ,一个没有 。 2.类组件更加笨重。 学习成本高。生命周期。 this指向。 3.函数组件更加方便复用。 4.类组件可以用高阶组件等解决复用问题,但是很容易造成嵌套地狱不易于维护。 5. hooks 更加轻量 。摒弃了生命周期的概念,而是把一些关联变化的副作用统一到函数里管理。