Open Silencer-1984 opened 3 years ago
存在以下问题:
为什么 getDerivedStateFromProps 是静态的? 当它设置为静态函数,表明这个函数不能通过 this 访问到 class 的属性,也并不推荐直接访问属性。
哪些生命周期可以 setState? 可以在 componentDidMount 和 componentDidUpdate 中使用,此时 DOM 已经稳定下来了,可以进行数据的操作了。
有时候同步,有时候异步。
Hook 使用带来的好处:
React 其实自己实现了一套事件机制,首先我们考虑一下以下代码:
const Test = ({ list, handleClick }) => ({ list.map((item, index) => ( <span onClick={handleClick} key={index}>{index}</span> )) })
以上类似代码想必大家经常会写到,但是你是否考虑过点击事件是否绑定在了每一个标签上?事实当然不是,JSX 上写的事件并没有绑定在对应的真实 DOM 上,而是通过事件代理的方式,将所有的事件都统一绑定在了 document 上。这样的方式不仅减少了内存消耗,还能在组件挂载销毁时统一订阅和移除事件。
另外冒泡到 document 上的事件也不是原生浏览器事件,而是 React 自己实现的合成事件(SyntheticEvent)。因此我们如果不想要事件冒泡的话,调用 event.stopPropagation 是无效的,而应该调用 event.preventDefault。
那么实现合成事件的目的是什么呢?总的来说在我看来好处有两点,分别是:
合成事件首先抹平了浏览器之间的兼容问题,另外这是一个跨浏览器原生事件包装器,赋予了跨浏览器开发的能力 对于原生浏览器事件来说,浏览器会给监听器创建一个事件对象。如果你有很多的事件监听,那么就需要分配很多的事件对象,造成高额的内存分配问题。但是对于合成事件来说,有一个事件池专门来管理它们的创建和销毁,当事件需要被使用时,就会从池子中复用对象,事件回调结束后,就会销毁事件对象上的属性,从而便于下次复用事件对象。
生命周期
React 逐渐废弃的生命周期方法:
挂载阶段
存在以下问题:
为什么 getDerivedStateFromProps 是静态的? 当它设置为静态函数,表明这个函数不能通过 this 访问到 class 的属性,也并不推荐直接访问属性。
哪些生命周期可以 setState? 可以在 componentDidMount 和 componentDidUpdate 中使用,此时 DOM 已经稳定下来了,可以进行数据的操作了。
更新阶段
卸载阶段
调用 setState 之后发生了什么
setState 是同步还是异步
有时候同步,有时候异步。
组件通讯
Hook
Hook 使用带来的好处:
性能优化
事件机制
React 其实自己实现了一套事件机制,首先我们考虑一下以下代码:
以上类似代码想必大家经常会写到,但是你是否考虑过点击事件是否绑定在了每一个标签上?事实当然不是,JSX 上写的事件并没有绑定在对应的真实 DOM 上,而是通过事件代理的方式,将所有的事件都统一绑定在了 document 上。这样的方式不仅减少了内存消耗,还能在组件挂载销毁时统一订阅和移除事件。
另外冒泡到 document 上的事件也不是原生浏览器事件,而是 React 自己实现的合成事件(SyntheticEvent)。因此我们如果不想要事件冒泡的话,调用 event.stopPropagation 是无效的,而应该调用 event.preventDefault。
那么实现合成事件的目的是什么呢?总的来说在我看来好处有两点,分别是:
合成事件首先抹平了浏览器之间的兼容问题,另外这是一个跨浏览器原生事件包装器,赋予了跨浏览器开发的能力 对于原生浏览器事件来说,浏览器会给监听器创建一个事件对象。如果你有很多的事件监听,那么就需要分配很多的事件对象,造成高额的内存分配问题。但是对于合成事件来说,有一个事件池专门来管理它们的创建和销毁,当事件需要被使用时,就会从池子中复用对象,事件回调结束后,就会销毁事件对象上的属性,从而便于下次复用事件对象。