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>;
    	}
    }
    

    效果:

  • 相关阅读:
    【Feature】使用Feature导入WebPart
    千万别动SharePoint数据库
    【PS】使用PowerShell创建WinForm程序(转载)
    【WebServices】调用 SharePoint WebServices 注意事项
    【转载】十一种Web网站程序性能测试工具介绍
    【List Event Receivers】区分自定义“事件处理”功能的两种部署方式
    [转] SharePoint Server 2007 页面模型
    第一天 从此在这记录学习C++的点点滴滴
    《C++ Primer》第7章 函数
    Emacs 自动填充头文件
  • 原文地址:https://www.cnblogs.com/lhongsen/p/14466774.html
Copyright © 2011-2022 走看看