javascript 为什么我的控制台没有在每分钟后打印消息,useEffect钩子只运行一次吗?

vlf7wbxs  于 2023-03-11  发布在  Java
关注(0)|答案(3)|浏览(94)
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中是如何工作的。

eeq64g8w

eeq64g8w1#

我相信你不需要两个useEffect就可以做到这一点。

function DigitalClock() {
  const [currentTime, setCurrentTime] = React.useState(null);

  React.useEffect(() => {
    const interval = setInterval(() => {
      const date = new Date();
      const formattedTime = date.toLocaleTimeString();
      
      setCurrentTime(formattedTime);
    }, 1000);

    return () => clearInterval(interval);
  }, []);

  return <h2>{currentTime}</h2>;
}
mklgxw1f

mklgxw1f2#

你可以修改useEffect钩子来检查seconds值是否能被60整除。你可以使用以下代码:

function DigitalClock() {
  const [currentTime, setCurrentTime] = React.useState(new Date());

  React.useEffect(() => {
    const interval = setInterval(() => {
      setCurrentTime(new Date());
    }, 1000);

    return () => clearInterval(interval);
  }, []);

  React.useEffect(() => {
    const seconds = currentTime.getSeconds();
    if (seconds % 60 === 0 && seconds !== 0) {
      console.log('Another minute passed');
    }
  }, [currentTime]);

  const formattedTime = currentTime.toLocaleTimeString();

  return <h2>{formattedTime}</h2>;
}

ReactDOM.render(<DigitalClock />, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>
qyuhtwio

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

相关问题