clearInterval 不起作用(已按照其他问题中的步骤操作)
clearInterval isn't working (have followed the steps in the other questions)
我知道这个问题很常见,我已经按照那里列出的解决方案进行操作,但没有成功,这就是为什么我提出了一个新问题。
我正在尝试在 React Native 上创建一个时间/时钟(如果有人有一个可以做到这一点的库,那也将不胜感激)并且目前正在这样创建它:
const [time, setTime] = useState(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
function TimeView() {
setTime(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
}
const timeVar = setInterval(TimeView, 60000);
我试过 const, var, let for timeVar, 都没有成功
并在用户移动到下一个屏幕时关闭计时器,如下所示:
<Button
onPress={{
// navigation code here
clearInterval(timeVar);
}}
>
Take
</Button>
我不确定我在这里做错了什么,我们将不胜感激。谢谢!
编辑: 根据 Uğur Eren 的建议,我改为定义了这个函数,但是定时器不能通过这个方法工作。
function Interval(fn, time) {
const timer = useRef();
this.start = function () {
if (!this.isRunning()) {
timer.current = setInterval(fn, time);
}
};
this.stop = function () {
clearInterval(timer);
timer.current = false;
};
this.isRunning = function () {
return timer !== false;
};
}
试试这个。您应该在组件挂载时使用 setInterval。
const [time, setTime] = useState(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
const [timeVar, setTimeVar] = useState<any>();
useEffect(() => {
const interval = setInterval(() => {
setTime(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
}, 60000);
setTimeVar(interval);
}, []);
对于按钮,你必须传递一个函数来清除timeVar。
<Button
onPress={() => {
// navigation code here
if(timeVar) {
clearInterval(timeVar);
}
}}
>
Take
</Button>
如果您在这里偶然发现了答案,我希望这个对您有所帮助(对我有用)。
首先创建定时器useState变量,连同函数运行:
const [time, setTime] = useState(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
function TimeView() {
setTime(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
}
const timeVar = useRef();
接下来,设置一个 useEffect 挂钩,以在首次加载页面时开始间隔:
useEffect(() => {
if (isFocused) {
timeVar.current = setInterval(TimeView, 60000);
}
}, []);
然后将你的 clearInterval 放在你的按钮中:
<Button onPress={()=>clearInterval(timeVar.current)} title="Stop" />
就是这样,您的计时器已设置完毕!
我知道这个问题很常见,我已经按照那里列出的解决方案进行操作,但没有成功,这就是为什么我提出了一个新问题。
我正在尝试在 React Native 上创建一个时间/时钟(如果有人有一个可以做到这一点的库,那也将不胜感激)并且目前正在这样创建它:
const [time, setTime] = useState(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
function TimeView() {
setTime(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
}
const timeVar = setInterval(TimeView, 60000);
我试过 const, var, let for timeVar, 都没有成功
并在用户移动到下一个屏幕时关闭计时器,如下所示:
<Button
onPress={{
// navigation code here
clearInterval(timeVar);
}}
>
Take
</Button>
我不确定我在这里做错了什么,我们将不胜感激。谢谢!
编辑: 根据 Uğur Eren 的建议,我改为定义了这个函数,但是定时器不能通过这个方法工作。
function Interval(fn, time) {
const timer = useRef();
this.start = function () {
if (!this.isRunning()) {
timer.current = setInterval(fn, time);
}
};
this.stop = function () {
clearInterval(timer);
timer.current = false;
};
this.isRunning = function () {
return timer !== false;
};
}
试试这个。您应该在组件挂载时使用 setInterval。
const [time, setTime] = useState(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
const [timeVar, setTimeVar] = useState<any>();
useEffect(() => {
const interval = setInterval(() => {
setTime(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
}, 60000);
setTimeVar(interval);
}, []);
对于按钮,你必须传递一个函数来清除timeVar。
<Button
onPress={() => {
// navigation code here
if(timeVar) {
clearInterval(timeVar);
}
}}
>
Take
</Button>
如果您在这里偶然发现了答案,我希望这个对您有所帮助(对我有用)。
首先创建定时器useState变量,连同函数运行:
const [time, setTime] = useState(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
function TimeView() {
setTime(moment(new Date()).format('hh:mm A (DD/MM/YYYY)'));
}
const timeVar = useRef();
接下来,设置一个 useEffect 挂钩,以在首次加载页面时开始间隔:
useEffect(() => {
if (isFocused) {
timeVar.current = setInterval(TimeView, 60000);
}
}, []);
然后将你的 clearInterval 放在你的按钮中:
<Button onPress={()=>clearInterval(timeVar.current)} title="Stop" />
就是这样,您的计时器已设置完毕!