[React] Stop Memory Leaks with componentWillUnmount Lifecycle Method in React
In this lesson we'll take a stopwatch component we built in another lesson and identify and fix a memory leak.
<body> <script src="https://unpkg.com/react@16.0.0/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@16.0.0/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script> <div id="root"></div> <script type="text/babel"> class StopWatch extends React.Component { state = {lapse: 0, running: false} handleRunClick = () => { this.setState(state => { if (state.running) { clearInterval(this.timer) } else { const startTime = Date.now() - this.state.lapse this.timer = setInterval(() => { this.setState( { lapse: Date.now() - startTime, }, () => { console.log(this.state.lapse) }, ) }) } return {running: !state.running} }) } handleClearClick = () => { clearInterval(this.timer) this.setState({lapse: 0, running: false}) } componentWillUnmount() { clearInterval(this.timer) } render() { const {lapse, running} = this.state const buttonStyles = { border: '1px solid #ccc', background: '#fff', fontSize: '2em', padding: 15, margin: 5, width: 200, } return ( <div style={{textAlign: 'center'}}> <label style={{ fontSize: '5em', display: 'block', }} > {lapse}ms </label> <button onClick={this.handleRunClick} style={buttonStyles} > {running ? 'Stop' : 'Start'} </button> <button onClick={this.handleClearClick} style={buttonStyles} > Clear </button> </div> ) } } class App extends React.Component { state = {showStopWatch: true} render() { const {showStopWatch} = this.state return ( <div> <label> Show Stop Watch{' '} <input type="checkbox" checked={showStopWatch} onChange={() => this.setState(s => ({ showStopWatch: !s.showStopWatch, }))} /> </label> <hr /> {showStopWatch ? <StopWatch /> : null} </div> ) } } const element = <App /> ReactDOM.render( element, document.getElementById('root'), ) </script> </body>
Tow things to notice here is that:
1. this.setState(), we can pass an update function, which take param 'state' and return a new state
this.setState((state) => ({newState}))
2. Pass a second param to setState() as a callback:
this.setState(newState, callback)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具