首页 > 其他分享 >react hooks定时器,值增1

react hooks定时器,值增1

时间:2023-10-12 15:13:19浏览次数:40  
标签:count 定时器 return 函数 值增 hooks react const useEffect

使用函数式更新的方法实现定时器的代码:
import React, { useState, useEffect } from 'react';

function App() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const timer = setInterval(() => {
      // 使用函数式更新,接收先前的state,并返回一个更新后的值
      setCount(prevCount => prevCount + 1);
    }, 1000);
    return () => clearInterval(timer);
  }, []);

  return (
    <div className="App">
      <h1>React Hooks 定时器</h1>
      <p>当前计数:{count}</p>
    </div>
  );
}

export default App;
这段代码使用了useState和useEffect两个react hook。useState用于定义一个状态变量count和一个更新函数setCount。
useEffect用于在组件挂载后执行一个副作用函数,该函数中创建了一个定时器,每隔一秒调用setCount函数,并传入一个函数作为参数。
这个函数接收先前的count值,并返回一个加一后的值。这样就可以保证定时器每次拿到的是最新的count值,而不是初始值。useEffect还返回了一个清理函数,用于在组件卸载前清除定时器。 使用useRef的方法:useRef可以创建一个可变的引用对象,该对象的current属性可以存储任何值,
并且在组件重新渲染时不会改变。我们可以使用useRef来存储定时器的id,以便在清理函数中清除定时器。
我们也可以使用useRef来存储count的当前值,并在定时器中更新它。这样就可以避免使用state和set函数,从而减少组件的渲染次数。以下是使用useRef的方法的代码: import React, { useRef, useEffect } from 'react'; function App() { const timerRef = useRef(null); // 创建一个引用对象,用于存储定时器的id const countRef = useRef(0); // 创建一个引用对象,用于存储count的当前值 useEffect(() => { timerRef.current = setInterval(() => { // 直接更新countRef.current的值,而不使用state和set函数 countRef.current = countRef.current + 1; }, 1000); return () => clearInterval(timerRef.current); // 清理函数中清除定时器 }, []); return ( <div className="App"> <h1>React Hooks 定时器</h1> <p>当前计数:{countRef.current}</p> </div> ); } export default App; 使用useReducer的方法:useReducer可以接收一个reducer函数和一个初始状态,并返回一个状态和一个分发函数。reducer函数是一个纯函数,它根据传入的action来更新状态,并返回一个新的状态。我们可以使用useReducer来定义一个计数器的reducer函数,该函数根据不同的action类型来增加或重置计数。我们也可以在useEffect中分发一个增加计数的action,从而触发reducer函数更新状态。以下是使用useReducer的方法的代码: import React, { useReducer, useEffect } from 'react'; // 定义一个计数器的reducer函数,根据不同的action类型来增加或重置计数 function counterReducer(state, action) { switch (action.type) { case 'increment': return state + 1; case 'reset': return 0; default: return state; } } function App() { const [count, dispatch] = useReducer(counterReducer, 0); // 使用useReducer,传入reducer函数和初始状态 useEffect(() => { const timer = setInterval(() => { // 分发一个增加计数的action,触发reducer函数更新状态 dispatch({ type: 'increment' }); }, 1000); return () => clearInterval(timer); // 清理函数中清除定时器 }, []); return ( <div className="App"> <h1>React Hooks 定时器</h1> <p>当前计数:{count}</p> </div> ); } export default App; 使用自定义hook的方法:自定义hook是一种复用逻辑的方式,它可以使用其他内置的hook,并返回一些值或函数。我们可以创建一个自定义hook,用于封装定时器的逻辑,并返回一个计数值和一个重置函数。我们可以在组件中调用这个自定义hook,并将计数值渲染到页面上。以下是使用自定义hook的方法的代码: import React, { useState, useEffect } from 'react'; // 创建一个自定义hook,用于封装定时器的逻辑 function useTimer(initialValue) { const [count, setCount] = useState(initialValue); // 定义一个状态变量和一个更新函数 useEffect(() => { const timer = setInterval(() => { // 使用setCount更新状态 setCount(prevCount => prevCount + 1); }, 1000); return () => clearInterval(timer); // 清理函数中清除定时器 }, []); // 定义一个重置函数,用于将计数值重置为初始值 function reset() { setCount(initialValue); } // 返回一个计数值和一个重置函数 return [count, reset]; } function App() { const [count, reset] = useTimer(0); // 调用自定义hook,传入初始值 return ( <div className="App"> <h1>React Hooks 定时器</h1> <p>当前计数:{count}</p> <button onClick={reset}>重置</button> </div> ); } export default App;

 

标签:count,定时器,return,函数,值增,hooks,react,const,useEffect
From: https://www.cnblogs.com/whlBooK/p/17759495.html

相关文章

  • react native使用zustand进行状态管理
    1.安装:#NPMnpminstallzustand#Yarnyarnaddzustand2.创建store:import{create}from"zustand";constuseStore=create((set)=>({count:0,str:"",addCount:()=>set((state)=>({count:state.count+1})......
  • React, chartGpt写的换肤方法
    constthemes={default:{backgroundColor:'white',textColor:'black',fontSize:'16px',},dark:{backgroundColor:'black',textColor:'white',fontSize:'18px'......
  • 竟然可以在一个项目中混用 Vue 和 React?
    React和Vue是前端开发中的两大热门框架,各自都有着强大的功能和丰富的生态系统。然而,你有没有想过,在一个项目中同时使用React和Vue?是的,你没有听错,可以在同一个项目中混用这两个框架!本文就来分享3个用于混合使用React和Vue的工具!#VeauryVeaury是一个基于React和Vue3的工具......
  • 【React】React.memo与useMemo的区别和联系
    概述React.memo和useMemo都是React进行性能优化的手段,它们允许我们缓存需要进行高性能计算的结果,以便下次渲染页面时,返回缓存的值而不必重新计算函数,从而确保我们的应用程序运行的更快,避免不必要的开销。React.memo详解为什么memo(memoization的简写)在React中这么重要呢?在......
  • 【React系列】React.memo() vs useMemo()
    React.memo()与useMemo()之间有什么主要区别?性能优化是一只web开发中的一个重要讨论点。对于react团队同样如此,为了实现加速组件的渲染速度,采用“备忘录”的方式。所以这个时候就React.memo()和useMemo钩子就为了解决这个问题产生了。本文将比较和对比React.memo和useMem......
  • React Hooks之useRef详解
    ReactHooks之useRef详解最新推荐文章于 2023-08-2621:32:11 发布RayShyy于2023-02-1810:23:20发布2717收藏5分类专栏:React文章标签:react.jsHookHooksuseRefref版权React专栏收录该内容4篇文章0订阅订阅专栏......
  • 前端进阶系列——理解 React Ref
    前端进阶系列——理解ReactRef秦书羽杭州@朝夕光年​关注他 17人赞同了该文章Ref是Reference(引用)的缩写。一、前言在React中通常遵循“自上而下”的“单向数据流”。父组件和子组件的通讯只能通过Props。如果要修改一个子组件,我们要修改......
  • React跨路由组件动画
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:佳岚回顾传统React动画对于普通的React动画,我们大多使用官方推荐的react-transition-group,其提供了四个基本组件Transition、CSSTr......
  • 盘点KendoReact五大功能,让JavaScript数据网格构建更轻松!
    在本文中,我们将为大家分享KendoReact DataGrid中最受欢迎的五大功能:性能、数据组织、列和行交互、编辑自定义以及导出。有了这些功能,开发者大可不必从头开始构建JavaScript数据网格了!KendoUI是带有jQuery、Angular、React和Vue库的JavaScriptUI组件的最终集合,无论选择哪种Jav......
  • 如何编写难以维护的 React 代码?耦合通用组件与业务逻辑
    在众多项目中,React代码的维护经常变得棘手。其中一个常见问题是:将业务逻辑直接嵌入通用组件中,导致通用组件与业务逻辑紧密耦合,使其失去“通用性”。这种做法使通用组件过于依赖具体业务逻辑,导致代码难以维护和扩展。示例:屎山是如何逐步堆积的让我们看一个例子:我们在业务组件Pag......