zoukankan      html  css  js  c++  java
  • React进阶

    定时器、网络请求、事件监听,在组件被销毁前都应该得到相应的处理

    App.js

    import React from 'react';
    import Demo1 from './components/Demo1/parent';
    import Home from './components/Home';
    import { HashRouter, Route, Switch } from 'react-router-dom';
    
    function App() {
    	return (
    		<HashRouter>
    			<Switch>
    				<Route exact path="/" component={Home}></Route>
    				<Route path="/demo1" component={Demo1}></Route>
    			</Switch>
    		</HashRouter>
    	);
    }
    
    export default App;
    

    src\components\Home.jsx

    import React from 'react';
    
    function Home() {
    	return <div>Home</div>;
    }
    
    export default Home;
    

    src\components\Demo1\parent.jsx

    import React from 'react';
    
    /**
     * 计数例子
     *
     * 定时器
     * 网络请求
     * 事件监听
     *    在组件被销毁前都应该得到相应的处理
     *
     */
    
    const MyAPI = {
    	count: 0,
    	subscribe(cb) {
    		this.intervalId = setInterval(() => {
    			this.count += 1;
    			cb(this.count);
    		}, 1000);
    	},
    	unSubscribe() {
    		clearInterval(this.intervalId);
    	},
    	reset() {
    		this.count = 0;
    	},
    };
    
    export default class parent extends React.Component {
    	state = {
    		count: 0,
    	};
    
    	componentDidMount() {
    		MyAPI.subscribe((currentCount) => {
    			this.setState({
    				count: currentCount,
    			});
    		});
    	}
    
    	render() {
    		console.log(this.state.count);
    		return <div>Parent: {this.state.count}</div>;
    	}
    }
    

    现象:

    解决方案:
    在componentWillUnmount处理相应的事件

    src\components\Demo1\parent.jsx

    import React from 'react';
    
    /**
     * 计数例子
     *
     * 定时器
     * 网络请求
     * 事件监听
     *    在组件被销毁前都应该得到相应的处理
     *
     */
    
    const MyAPI = {
    	count: 0,
    	subscribe(cb) {
    		this.intervalId = setInterval(() => {
    			this.count += 1;
    			cb(this.count);
    		}, 1000);
    	},
    	unSubscribe() {
    		clearInterval(this.intervalId);
                    this.reset();
    	},
    	reset() {
    		this.count = 0;
    	},
    };
    
    export default class parent extends React.Component {
    	state = {
    		count: 0,
    	};
    
    	componentDidMount() {
    		MyAPI.subscribe((currentCount) => {
    			this.setState({
    				count: currentCount,
    			});
    		});
    	}
    
    	componentWillUnmount() {
    		MyAPI.unSubscribe();
    	}
    
    	render() {
    		console.log(this.state.count);
    		return <div>Parent: {this.state.count}</div>;
    	}
    }
    

    效果:

  • 相关阅读:
    Billing Invoice Split Rule
    From ProjectMagazine
    Link to PMP
    测试发现数据库性能问题后的SQL调优
    被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
    解决'将 expression 转换为数据类型 nvarchar 时出现算术溢出错误。'
    几年来ASP.NET官方站点首次改版,意味着MVC时代全面到来?
    Collection was modified; enumeration operation may not execute.的异常处理
    解决Sandcastle Help File Builder报错问题
    如何查看Windows服务所对应的端口?
  • 原文地址:https://www.cnblogs.com/lhongsen/p/14466774.html
Copyright © 2011-2022 走看看