import React, { useState, useEffect } from 'react';
function DigitalClock() {
const[currentTime, setCurrentTime] = useState(new Date());
useEffect(()=>{
const interval = setInterval(()=>{
setCurrentTime(new Date());
},1000);
return () => clearInterval(interval);
},[]);
useEffect(()=>{
const second = currentTime.getSeconds();
if(second===0){
console.log("another minute passed");
}
},[currentTime])
const formattedTime = currentTime.toLocaleTimeString();
return(
<h2>{formattedTime}</h2>
)
}
export default DigitalClock;
在这里,我想在每一分钟过后创建一个CONSOLE.LOG,但它只打印第一分钟。
我想知道如何解决这个问题,以及useEffect钩子在Reactjs中是如何工作的。
3条答案
按热度按时间eeq64g8w1#
我相信你不需要两个useEffect就可以做到这一点。
mklgxw1f2#
你可以修改
useEffect
钩子来检查seconds
值是否能被60整除。你可以使用以下代码:qyuhtwio3#
您的代码中没有错误。请尝试关闭正在运行的服务器并重新运行它。它应该可以正常工作。以下是您的代码的沙盒结果。https://codesandbox.io/s/strange-chatterjee-y7k4pu?file=/src/App.js
专业提示:尽量不要广泛使用useEffect。
什么是useEffect?
内置的React钩子useEffect允许你在函数组件中执行副作用,比如从API获取数据,修改DOM,或者订阅事件。作为它的第一个输入,它接受一个函数,这个函数将在每个渲染周期之后被调用。
使用useEffect通知React您的组件需要在呈现后执行“附加”任务,例如从API获取数据。如果未使用useEffect,则可以尝试在组件的render方法中从API检索数据。获取数据将启动另一个呈现,这将启动另一个API调用,依此类推。创建API调用的无限循环。您可以使用useEffect来打破这种无限循环。您可以在effect函数中执行副作用(如获取数据),然后指示React使用新信息更改组件状态。
dependency数组是useEffect的第二个输入。何时重新启动效果函数由此数组指定为React。如果dependency数组为空,则效果方法将仅在组件装入时调用一次。如果dependency数组中包含任何值,则每次更改该值时都会调用效果函数。
UseEffect的基本原理就是这样!它可以帮助你避免传统类组件中处理副作用的一些问题,并且是处理函数组件中副作用的一个很好的工具。
您可以从此处了解有关useEffect的更多信息:https://reactjs.org/docs/hooks-effect.html