Vue Nuxt.js 从LocalStorage读取数据报错

在Nuxt.js应用中,通过axios获取数据并存储在LocalStorage以优化加载速度。当从LocalStorage读取数据时遇到服务端与客户端虚拟DOM不匹配的错误。通过对数据的检查和深入研究Nuxt框架,找到了问题的解决方案,成功避免了错误的发生。

1. 场景描述

在Nuxt.js中,用axios从服务端获取数据data,为了优化本地访问速度,将data存储在locaStorage中。这样,当用户刷新页面是,优先加载本地数据,超过一定时限,删除本地data,再次从服务端获取。
实现代码如下:

  mounted () {
    // 加载函数
    this.readOrCreateLocal()
  },
  methods: {
// 请求函数
    queryAll () {
      const result = axios.get(
        'http://127.0.0.1/api/v1/queryAll'
      )
      result.then((res) => {
        console.log('Query From Server...')
        // 请求到的数据赋值
        this.hxes = res.data.message
        // 同时将请求到的数据存入localStorage
        const data = JSON.stringify(res.data.message)
        localStorage.setItem('hxes', data)
        // 同时写入时间戳
        const time = new Date().getTime()
        localStorage.setItem('hxes_time', time)
        // 回到加载函数
        this.readOrCreateLocal()
      })
    },
// 加载函数
    readOrCreateLocal () {
      const data = localStorage.getItem('hxes')
      const time = localStorage.getItem('hxes_time')
       // 如果localStorage有数据,且有时间戳,解析
      if (data && time) {
        // 计算数据的存在时间
        const period = new Date().getTime() - time
        // 如果没超过一定时间
        if (period < 5000) {
          // 正常读取
          console.log('Read From Local...')
          this.hxes = JSON.parse(data)
          // 结束
          return
          // 如果数据存在时间过长
        } else {
          // 删除本地数据,程序继续
          localStorage.removeItem('hxes')
          localStorage.removeItem('hxes_time')
          console.log('Delete Expired Data...')
        }
      }
      // 如果没有localStorage数据,运行请求函数
      this.queryAll()
    }
  }

2. 出现问题

代码没什么问题,可以正常运行。
但是当从本地读取数据时,Condole报错:

[Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.

大致的意思是说服务端与客户端的虚拟DOM树不匹配,不是很明白其中的技术细节,但是有个大概的概念,就是Nuxt.js是服务端和应用端分离的。
先是仔细比对了存进去和取出来的数据,没有发现问题。因此可以推断是Nuxt框架的问题,再经过一番艰苦的搜索,终于找到解决方案:

<template>
  <div>
    <sidebar />
    <client-only placeholder="Loading...">
      <!-- comments 组件只会在客户端被渲染 -->
      <comments />
    </client-only>
  </div>
</template>

加上<client-only>组件此组件用于仅在客户端渲染其他组件.
原理不懂,但是实践后确实解决了问题,不再报错。
参看这里 nuxtjs.cn

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值