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

React自定义usePrevious Hook:值非空时如何保留历史状态

解决React自定义usePrevious Hook保留有效历史状态的问题

你当前的usePrevious Hook会记录所有状态变化,包括输入框清空时的空值(或null),导致后续输入新值时,上一次状态不是之前的有效数值(比如示例中的3),而是空值。要解决这个问题,只需在Hook中添加判断,仅当传入的value为有效状态时才更新历史记录。

修改后的usePrevious Hook

import { useEffect, useRef } from 'react';

export const usePrevious = (value) => {
  const ref = useRef();
  useEffect(() => {
    // 仅当value不为空、不为null时更新历史状态,可根据业务需求调整判断条件
    if (value != null && value !== '') {
      ref.current = value;
    }
  }, [value]);
  return ref.current;
};

逻辑说明

通过if (value != null && value !== '')过滤空值和null,只有当传入的value是有效内容时,才更新ref保存的历史状态。如果你的业务中要求quantity必须是正整数,还可以进一步强化判断,比如:

if (!isNaN(value) && value > 0) {
  ref.current = value;
}

调整后的组件代码

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

export const ArticleQuantity = () => {
  const [quantity, setQuantity] = useState(1);
  const prevQuantity = usePrevious(quantity);

  useEffect(() => {
    // 避免初始渲染时prevQuantity为undefined的情况
    if (prevQuantity !== undefined) {
      console.log(`上一次数量:${prevQuantity},当前数量:${quantity}`);
    }
  }, [quantity, prevQuantity]);

  return (
    <div>
      <input
        type="number"
        value={quantity}
        onChange={(e) => {
          const val = e.target.value;
          // 空输入时设置为默认值1,也可根据业务需求保留空值(配合Hook判断不更新历史)
          setQuantity(val === '' ? 1 : Number(val));
        }}
      />
    </div>
  );
};

组件优化点

  • 将input改为受控组件(用value绑定状态),避免状态与输入框内容不一致
  • onChange时统一将输入值转为数字,空输入时设置默认值1,保证状态始终为有效数值
  • useEffect中增加判断,跳过初始渲染时prevQuantity为undefined的输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:05:16