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

React封装localStorage自定义Hook后输入框无法输入问题

问题根因

两个核心逻辑错误共同导致输入框失效:

  • 自定义Hook中localStorage取值判断逻辑错误:localStorage.getItem(key) 在key不存在时返回null而非空字符串'',原有判断storedValues !== ''在首次加载无存储数据时,会对null执行JSON.parse(null)得到null作为初始状态值。
  • Hook调用时传入的默认值类型不匹配:预期初始状态为{name: ''}结构的对象,实际传入空字符串'',访问字符串/null值的.name属性会得到undefined,输入框绑定的value为undefined时,React会出现受控/非受控组件状态切换冲突,直接导致输入框无法响应键入、光标样式异常。
修复方案

1. 修正自定义Hook逻辑

补充空值判断和JSON解析异常捕获,避免非法值导致状态异常:

import { useState, useEffect } from 'react';

const useStateWithLocalStorage = (defaultValue, key) => {
  const [value, setValue] = useState(() => {
    const storedValues = localStorage.getItem(key);
    // 无存储值时直接返回默认值
    if (storedValues === null) {
      return defaultValue;
    }
    // 捕获JSON解析异常,避免脏数据导致页面崩溃
    try {
      return JSON.parse(storedValues);
    } catch (err) {
      console.error(`解析localStorage键[${key}]失败:`, err);
      return defaultValue;
    }
  });

  useEffect(() => {
    // 过滤null/undefined值,避免写入无效存储
    if (value != null) {
      localStorage.setItem(key, JSON.stringify(value));
    }
  }, [key, value]);

  return [value, setValue];
};

export default useStateWithLocalStorage;

2. 修正Hook调用入参

传入和业务逻辑匹配的对象类型默认值,替换原有空字符串:

// 错误写法
// const [inputValue, setInputValue] = useStateWithLocalStorage('', 'form');
// 修正写法
const [inputValue, setInputValue] = useStateWithLocalStorage({ name: '' }, 'form');

3. 清理脏数据

代码修改完成后,打开浏览器开发者工具,进入「Application」面板,找到当前域名下Local Storage中key为form的条目删除,清除之前错误逻辑写入的无效存储值后刷新页面即可正常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:18:20