React的生命周期(新版)
挂载阶段(Mount)
-
constructor
-
getDerivedStateFromProps
-
render
-
componentDidMount
更新过程(Update)
-
getDerivedStateFromProps
-
shouldComponentUpdate
-
render
-
getSnapshotBeforeUpdate
-
componentDidUpdate
卸载过程(Unmount)
-
componentWillUnmount
React的事件和普通的HTML事件有什么不同?
区别:
-
对于事件名称命名方式,原生事件为全小写,react 事件采用小驼峰;
-
对于事件函数处理语法,原生事件为字符串,react 事件为函数;
-
react 事件不能采用 return false 的方式来阻止浏览器的默认行为,而必须要地明确地调用
preventDefault()
来阻止默认行为。
合成事件是 react 模拟原生 DOM 事件所有能力的一个事件对象,其优点如下:
-
兼容所有浏览器,更好的跨平台;
-
将事件统一存放在一个数组,避免频繁的新增与删除(垃圾回收)。
-
方便 react 统一管理和事务机制。
事件的执行顺序为原生事件先执行,合成事件后执行,合成事件会冒泡绑定到 document 上,所以尽量避免原生事件与合成事件混用,如果原生事件阻止冒泡,可能会导致合成事件不执行,因为需要冒泡到document 上合成事件才会执行
react中state和props的区别
-
state是组件自己管理数据
,控制自己的状态,可变 -
props是外部传入的数据参数
,不可变; -
没有state的叫做无状态组件,有state的叫做有状态组件
-
多用props,少用state。也就是多写无状态组件
Redux的实现流程
用户页面行为触发一个Action,然后Store调用Reducer,并且传入两个参数:当前State和收到的Action。Reducer会返回新的State。每当state更新之后,view会根据state触发重新渲染。
关键词是发出action、reducer返回新的state,页面重新渲染。
setState是同步还是异步的
setState
本身代码的执行肯定是同步的,这里的异步是指是多个 state 会合成到一起进行批量更新。 同步还是异步取决于它被调用的环境。
-
如果
setState
在 React 能够控制的范围被调用,它就是异步的。比如合成事件处理函数,生命周期函数, 此时会进行批量更新,也就是将状态合并后再进行 DOM 更新。 -
如果
setState
在原生 JavaScript 控制的范围被调用,它就是同步的。比如原生事件处理函数,定时器回调函数,Ajax 回调函数中,此时setState
被调用后会立即更新 DOM 。
useEffect 与 useLayoutEffect 的区别
(1)共同点
-
运用效果: useEffect 与 useLayoutEffect 两者都是用于处理副作用,这些副作用包括改变 DOM、设置订阅、操作定时器等。在函数组件内部操作副作用是不被允许的,所以需要使用这两个函数去处理。
-
使用方式: useEffect 与 useLayoutEffect 两者底层的函数签名是完全一致的,都是调用的 mountEffectImpl方法,在使用上也没什么差异,基本可以直接替换。
(2)不同点
-
使用场景: useEffect 在 React 的渲染过程中是被异步调用的,用于绝大多数场景;而 useLayoutEffect 会在所有的 DOM 变更之后同步调用,主要用于处理 DOM 操作、调整样式、避免页面闪烁等问题。也正因为是同步处理,所以需要避免在 useLayoutEffect 做计算量较大的耗时任务从而造成阻塞。
-
使用效果: useEffect是按照顺序执行代码的,改变屏幕像素之后执行(先渲染,后改变DOM),当改变屏幕内容时可能会产生闪烁;useLayoutEffect是改变屏幕像素之前就执行了(会推迟页面显示的事件,先改变DOM后渲染),不会产生闪烁。useLayoutEffect总是比useEffect先执行。
在未来的趋势上,两个 API 是会长期共存的,暂时没有删减合并的计划,需要开发者根据场景去自行选择。React 团队的建议非常实用,如果实在分不清,先用 useEffect,一般问题不大;如果页面有异常,再直接替换为 useLayoutEffect 即可
useMemo和useCallback的区别及使用场景
useMemo
和useCallback
都是reactHook提供的两个API,用于缓存数据,优化性能;两者接收的参数都是一样的,第一个参数表示一个回调函数,第二个表示依赖的数据。
共同作用 在依赖数据发生变化的时候,才会调用传进去的回调函数去重新计算结果,起到一个缓存的作用
两者的区别
-
useMemo
缓存的结果是回调函数中return回来的值,主要用于缓存计算结果的值,应用场景如需要计算的状态。useMemo
返回值是memoized
值 -
useCallback
缓存的结果是函数,主要用于缓存函数,应用场景如需要缓存的函数,因为函数式组件每次任何一个state发生变化,会触发整个组件更新,一些函数是没有必要更新的,此时就应该缓存起来,提高性能,减少对资源的浪费;另外还需要注意的是,useCallback应该和React.memo配套使用,缺了一个都可能导致性能不升反而下降。useCallback
返回一个memoized
回调函数。
React不是主用,题比较少