You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何捕获并存储上一个悬停元素的状态?

解决悬停元素数据的当前与历史状态存储问题

你当前的代码只更新了当前悬停元素的状态,但没有对上一个悬停状态进行保存。问题出在你声明了prevNodeDetails这个ref但从未给它赋值,同时state也只维护了单一的当前值。下面提供两种可行的解决方案:

方案一:用State同时维护当前与上一个状态

把state设计成包含current(当前悬停数据)和previous(上一个悬停数据)的对象,每次hovered变化时,将旧的current值作为新的previous,再更新current为新的悬停数据:

import { useState, useEffect } from 'react';

// 初始化state为包含current和previous的对象
const [nodeDetails, setNodeDetails] = useState({ current: null, previous: null });

useEffect(() => {
  if (!hovered) return; // 处理hovered为空的边界情况

  // 深拷贝hovered,避免引用类型的浅拷贝问题
  // 如果hovered是简单对象,{...hovered}也可以;嵌套对象建议用JSON方法或自定义深拷贝
  const clonedHovered = JSON.parse(JSON.stringify(hovered));

  setNodeDetails(prevState => ({
    current: clonedHovered,
    previous: prevState.current // 将旧的当前值转为上一个值
  }));
}, [hovered]);

// 使用示例
console.log('当前悬停数据:', nodeDetails.current);
console.log('上一个悬停数据:', nodeDetails.previous);

方案二:用useRef单独存储上一个状态

如果只需要state维护当前值,上一个值用ref来保存(ref的更新不会触发组件重新渲染):

import { useState, useEffect, useRef } from 'react';

const [currentNode, setCurrentNode] = useState(null);
const prevNodeRef = useRef(null); // 用ref存储上一个状态

useEffect(() => {
  if (!hovered) return;

  const clonedHovered = JSON.parse(JSON.stringify(hovered));
  // 先将当前state的值存入ref,作为上一个状态
  prevNodeRef.current = currentNode;
  // 再更新当前state为新的悬停数据
  setCurrentNode(clonedHovered);
}, [hovered, currentNode]);

// 使用示例
console.log('当前悬停数据:', currentNode);
console.log('上一个悬停数据:', prevNodeRef.current);

关于深拷贝的补充说明

  • 如果hovered是单层简单对象,{...hovered}的浅拷贝足够用;
  • 如果hovered是嵌套对象、包含数组或函数,浅拷贝会导致新旧对象共享引用,修改新对象会影响原数据,此时建议用JSON.parse(JSON.stringify(hovered))(注意:该方法无法序列化函数、Symbol等类型),或者自定义递归深拷贝函数。

内容的提问来源于stack exchange,提问作者deadant88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:45:47