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

Angular中localStorage存储已读文章数组控制台输出null问题

Angular文章已读标记功能null报错问题修复

问题场景

实现3篇文章的已读标记逻辑,预期规则:

  • 用户打开文章时,将对应文章名称存入localStorage
  • 用户再次访问页面时,校验文章名称是否存在于localStorage存储的数组中,存在则自动勾选对应已读复选框
    运行问题代码时控制台输出null,原有实现代码如下:
public arraySuccess = [];

  ngOnInit(): void {
    this.arraySuccess = JSON.parse(localStorage.getItem('success'));
  }
  openDialog(String) {
    this.dialog.open(RecommendationsDialog);

    if(this.arraySuccess != null && 
       this.arraySuccess.includes(String)) {
      return
    } else if (this.arraySuccess != null) {
      this.arraySuccess.push(String);
    }

    localStorage.setItem('success', JSON.stringify(this.arraySuccess));
    console.log(this.arraySuccess);

  }

核心错误点

  • 初始化逻辑漏洞:首次访问页面时localStorage中不存在success键,localStorage.getItem('success')返回null,JSON.parse(null)结果仍为null,直接把初始定义的空数组arraySuccess覆盖为null
  • 存储逻辑漏洞:当arraySuccess为null(即首次访问场景),两个判断分支都要求arraySuccess != null才会执行,导致第一次打开文章时不会执行push操作,最后执行JSON.stringify(this.arraySuccess)存入localStorage的还是null,后续每次加载读取到的永远是null,形成死循环
  • 命名不规范:方法入参直接使用String作为参数名,和JavaScript内置字符串构造函数重名,存在隐性bug风险

修复后代码

// 明确数组类型为字符串数组
public arraySuccess: string[] = [];

ngOnInit(): void {
  // 读取localStorage时增加兜底逻辑,无对应存储值时默认赋值为空数组,从根源避免null值
  this.arraySuccess = JSON.parse(localStorage.getItem('success') || '[]');
}

// 入参改为语义化命名,避免和内置构造函数冲突
openDialog(articleName: string) {
  this.dialog.open(RecommendationsDialog);

  // 因为arraySuccess初始化时已经兜底为数组,不需要额外判空
  // 已存在于已读列表直接返回,不重复存储
  if (this.arraySuccess.includes(articleName)) {
    return;
  }

  // 不存在则加入已读列表,同步存入localStorage
  this.arraySuccess.push(articleName);
  localStorage.setItem('success', JSON.stringify(this.arraySuccess));
  console.log(this.arraySuccess);
}

复选框绑定提示

模板中已读复选框直接绑定判断逻辑即可实现自动勾选:

<!-- 单篇文章复选框示例,article为当前循环的文章对象 -->
<input type="checkbox" [checked]="arraySuccess.includes(article.name)" disabled>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:06:17