
react 18 严格模式下类组件构造函数模拟渲染的顺序问题
React 18 中,处于严格模式下的类组件会执行模拟渲染,其生命周期与通常顺序不同:
constructor -> 模拟 constructor -> componentDidMount
这种差异的一个原因是,在 React 18 中,类组件现在通过 React.memo 包装,React.memo 充当一个记忆函数,它比较 props 的变化并决定是否重新渲染组件。为了实现这一点,它会在最初渲染之前执行一次模拟渲染,该模拟渲染不会触发 componentDidMount。
这可能会导致问题,因为组件在其第一次实际渲染时将意外地访问已卸载组件的实例变量。例如,一个示例代码:
class App extends React.Component { constructor() { this.state = { value: 0 }; } componentDidMount() { this.setState({ value: 1 }); } render() { return {this.state.value}; }}
在这个例子中,组件在模拟渲染中构造了 state,并在 componentDidMount 中更新了 state。然而,由于模拟渲染不是正式渲染,因此 state 更新不会被应用,并且组件将呈现 0,而不是 1。
为了解决这个问题,有几种选择:
将初始化逻辑移动到 componentDidMount使用 React 18 的新生命周期方法,如 getDerivedStateFromProps 或 getSnapshotBeforeUpdate,它们在每次渲染前都调用
以上就是React 18 严格模式下,类组件构造函数模拟渲染的顺序问题:如何避免组件在第一次实际渲染时访问已卸载实例变量?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1558657.html
微信扫一扫
支付宝扫一扫