详解React如何获取状态的旧值

 更新时间:2024年07月04日 10:14:51   作者:我是若尘  
最近刚开始接触 React,突然脑海出现一个问题,React中怎么在状态更新时获取它的旧值,特别是如果你之前用过 Vue,你可能会想知道 React 中有没有类似 Vue 的 watch 属性,那么react中怎么实现呢?本文就给大家介绍一下React如何获取状态的旧值,需要的朋友可以参考下

嘿,朋友们!我最近刚开始接触 React,突然脑海出现一个问题,React中怎么在状态更新时获取它的旧值。特别是如果你之前用过 Vue,你可能会想知道 React 中有没有类似 Vue 的 watch 属性,那么react中怎么实现呢?别担心,我们可以用一个自定义 Hook 来搞定这个问题。今天我们就来聊聊怎么实现这个小工具。

usePrevious Hook 的实现

首先,我们来写一个简单的 usePrevious Hook:

import { useRef, useEffect } from 'react';

// 记录旧值的公用hooks
export default function usePrevious(value) {
  const ref = useRef();
  useEffect(() => {
    ref.current = value;
  });
  return ref.current;
}

这段代码在干嘛?

  • 创建一个引用: 我们用 useRef 创建了一个引用对象 ref。这个引用对象在组件的整个生命周期内都不会变,它的 .current 属性会在每次渲染时保存当前的值。

  • 更新引用: 我们用 useEffect Hook 来更新 ref.currentuseEffect 是一个副作用钩子,它会在组件渲染后执行。在这个副作用函数里,我们把传进来的 value 赋值给 ref.current。这样,每次组件重新渲染时,ref.current 都会更新为最新的 value

  • 返回旧值: 最后,我们返回 ref.current 的当前值。因为 useRef 的特性,这个值其实是上一次渲染时的值,所以它就是我们想要的旧值啦。

使用示例

下面是一个使用 usePrevious Hook 的小例子:

import React, { useState } from 'react';
import usePrevious from './usePrevious';

function Example() {
  const [count, setCount] = useState(0);
  const prevCount = usePrevious(count);

  return (
    <div>
      <p>你点击了 {count} 次</p>
      {prevCount !== undefined && <p>上次你点击了 {prevCount} 次</p>}
      <button onClick={() => setCount(count + 1)}>
        点我
      </button>
    </div>
  );
}

export default Example;

在这个例子里,我们用 useState 创建了一个状态变量 count,每次点击按钮时它的值会增加。同时,我们用 usePrevious Hook 来获取 count 的旧值。这样,当组件渲染时,prevCount 就会显示上一次渲染时的 count 值。

进一步扩展

如果你想在状态变化时执行一些特定的逻辑,可以结合 useEffect 来实现类似 Vue 中 watch 的功能:

import { useEffect } from 'react';
import usePrevious from './usePrevious';

function useWatch(value, callback) {
  const prevValue = usePrevious(value);

  useEffect(() => {
    if (prevValue !== value) {
      callback(prevValue, value);
    }
  }, [value, prevValue, callback]);
}

使用 useWatch Hook

import React, { useState } from 'react';
import useWatch from './useWatch';

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

  useWatch(count, (prevCount, newCount) => {
    console.log(`Count 从 ${prevCount} 变成了 ${newCount}`);
  });

  return (
    <div>
      <p>你点击了 {count} 次</p>
      <button onClick={() => setCount(count + 1)}>
        点我
      </button>
    </div>
  );
}

export default Example;

在这个例子里,useWatch Hook 监听 count 的变化,并在变化时执行回调函数。这样你就可以在 React 中实现类似 Vue 中 watch 的功能啦。

到此这篇关于详解React如何获取状态的旧值的文章就介绍到这了,更多相关React获取状态旧值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React中的Hooks路由跳转问题

    React中的Hooks路由跳转问题

    这篇文章主要介绍了React中的Hooks路由跳转问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • React中useMemo和useCallback的使用小结

    React中useMemo和useCallback的使用小结

    本文主要介绍了深入理解React中useMemo和useCallback的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • React class和function的区别小结

    React class和function的区别小结

    Class组件和Function组件是React中创建组件的两种主要方式,本文主要介绍了React class和function的区别小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • React class 的组件库与函数组件适配集成方案

    React class 的组件库与函数组件适配集成方案

    这篇文章主要介绍了React class 的组件库与函数组件适配集成方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-05-05
  • React声明组件的方法总结

    React声明组件的方法总结

    这篇文章主要给大家介绍了react声明组件有哪几种方法,各有什么不同,文章通过代码示例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-11-11
  • React组件的生命周期深入理解分析

    React组件的生命周期深入理解分析

    组件的生命周期就是React的工作过程,就好比人有生老病死,自然界有日月更替,每个组件在网页中也会有被创建、更新和删除,如同有生命的机体一样
    2022-12-12
  • React进行路由变化监听的解决方案

    React进行路由变化监听的解决方案

    在现代单页应用(SPA)中,路由管理是至关重要的一部分,它不仅决定了用户如何在页面间切换,还直接影响到整个应用的性能和用户体验,这些看似不起眼的问题,往往会导致功能错乱和性能下降,本篇文章将深入探讨在 React 中如何高效监听路由变化,需要的朋友可以参考下
    2025-01-01
  • 基于TypeScript 的React 项目创建

    基于TypeScript 的React 项目创建

    本文介绍了如何创建基于TypeScript的React项目,使用Create React App(CRA)工具可以快速搭建开发环境,通过--template typescript参数初始化TS项目,感兴趣的可以了解一下
    2026-05-05
  • React-router v6在Class组件和非组件代码中的正确使用

    React-router v6在Class组件和非组件代码中的正确使用

    这篇文章主要介绍了React-router v6在Class组件和非组件代码中的正确使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • ReactNative列表ListView的用法

    ReactNative列表ListView的用法

    本篇文章主要介绍了ReactNative列表ListView的用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论