Codesandbox我有一个应用程序,可以在应用程序内的页面上记录用户屏幕时间。但是,当我在导航栏选项卡(“关于”和“时间”)之间单击时,计时器会重置。
我不希望它重置。我希望它在我更改导航栏选项卡后暂停,并在我返回到同一选项卡时恢复。我尝试使用 setInterval 而不是 setTimeout 但没有任何变化。
关于.js
import React, { useState, useEffect } from 'react';
const About = () => {
const [time, setTime] = useState({
seconds: 0,
minutes: 0,
hours: 0,
});
useEffect(() => {
let isCancelled = false;
const advanceTime = () => {
setInterval(() => {
let nSeconds = time.seconds;
let nMinutes = time.minutes;
let nHours = time.hours;
nSeconds++;
if (nSeconds > 59) {
nMinutes++;
nSeconds = 0;
}
if (nMinutes > 59) {
nHours++;
nMinutes = 0;
}
if (nHours > 24) {
nHours = 0;
}
!isCancelled && setTime({ seconds: nSeconds, minutes: nMinutes, hours: nHours });
}, 1000);
};
advanceTime();
return () => {
//final time:
console.log(time);
isCancelled = true;
};
}, [time]);
return (
<div>
<p>
{`
${time.hours < 10 ? '0' + time.hours : time.hours} :
${time.minutes < 10 ? '0' + time.minutes : time.minutes} :
${time.seconds < 10 ? '0' + time.seconds : time.seconds}
`}
</p>
</div>
);
}
export default About;
时间.js
import React, { useState, useEffect } from 'react';
const Time = () => {
const [time, setTime] = useState({
seconds: 0,
minutes: 0,
hours: 0,
});
useEffect(() => {
let isCancelled = false;
const advanceTime = () => {
setInterval(() => {
let nSeconds = time.seconds;
let nMinutes = time.minutes;
let nHours = time.hours;
nSeconds++;
if (nSeconds > 59) {
nMinutes++;
nSeconds = 0;
}
if (nMinutes > 59) {
nHours++;
nMinutes = 0;
}
if (nHours > 24) {
nHours = 0;
}
!isCancelled && setTime({ seconds: nSeconds, minutes: nMinutes, hours: nHours });
}, 1000);
};
advanceTime();
return () => {
//final time:
console.log(time);
isCancelled = true;
};
}, [time]);
return (
<div>
<p>
{`
${time.hours < 10 ? '0' + time.hours : time.hours} :
${time.minutes < 10 ? '0' + time.minutes : time.minutes} :
${time.seconds < 10 ? '0' + time.seconds : time.seconds}
`}
</p>
</div>
);
}
export default Time;
应用程序.js
import React from 'react';
import logo from './logo.svg';
import './App.css';
import Nav from './component/Nav';
import About from './component/About';
import {BrowserRouter as Router, Switch, Route} from 'react-router-dom';
import Time from './component/Time';
function App() {
return (
<Router>
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<div>
<Nav />
<Switch>
<Route path = "/about" exact component = {About}/>
<Route path = "/time" exact component = {Time}/>
</Switch>
</div>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
</Router>
);
}
export default App;