React中函数组件和类组件的区别
要点:分析出函数组件和类组件的优劣势,以及实际开发中的使用情况。
- 类组件可以定义自己的state,用来保存自己内部状态;在Hooks出现之前函数式组件不可以,因为函数每次调用都会产生新的变量
- 类组件有自己的生命周期,我们可以在生命周期中完成逻辑,比如在componentDidMount中添加订阅,在componentWillUnmout中取消订阅等;函数组件在Hooks出现之前,如果在函数组件中发送网络请求,意味着每一次重新渲染都会再发一次网络请求
- 类组件可以只在状态改变时重新执行render函数以及我们希望重新调用的生命周期函数;函数式组件在重新渲染时,整个函数都会重新执行,浪费浏览器性能。
- 复杂组件变的难以理解,实际开发中类组件很难拆分,写起来逻辑也比较混乱
- 组件复用状态很难,比如使用provider、consumer来共享一些组件状态时,如果多次使用consumer,代码会出现多层嵌套难以维护
函数组件中HOOKS的出现很好地解决了问题,useState可以维护组件内部的状态,useEffect能够完全模拟类组件中的生命周期。
React中类式组件创建的时候用class mycomponent extends React.Component这个命令 ,其中为什么要用extends,继承了React Component中的哪些方法?
- 继承React.component的组件生命周期:
挂载
- constructor()
- render()
- UNSAFE_componentWillMount()
- componentDidMount()
更新 - shouldComponentUpdate()
- render()
- componentDidUpdate()
卸载 - componentWillUnmout()
错误处理 - componentDidCatch()
- class属性
- defaultProps
- displayname
- 实例属性
- props
- state
- 其他API
- setState()
- forceUpdate
类式组件中的this的指向问题是如何去解决的?
- 通过this来直接调用函数并且返回箭头函数
- 包裹一层箭头函数
- 通过bind来改变this指向
- 通过赋值语句往实例上面添加一个箭头函数
- 在构造函数中再创建一个实例方法,和原型方法公用一个函数体
React中的新旧生命周期,函数式组件中如何模拟生命周期,useEffect可以把类似组件中的生命周期函数都模拟出来吗?
生命周期图谱useEffect能够模拟生命周期函数它跟 class 组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount 具有相同的用途,只不过被合并成了一个 API。当调用useEffect时,就是告诉react完成DOM更改后执行副作用函数,同时副作用函数用返回值,我们可以在返回中“清楚副作用”。
hooks中setState是同步的还是异步的?如果要获得最新的state该如何获取?
HOOKS中setState是异步的,如果需要获得最新的state可以通过useEffct副作用来进行处理,或者是将值作为参数传递给下一个函数。
React中fiber的原理
fiber是react 16中新的协调引擎,主要目的是使得Virtual DOM可以进行增量式渲染,能将渲染工作分成块并将其分散到多个帧上。(待补充完整)