请教个有关 Vue.js 使用 Nuxt.js 服务端渲染,使用 Vuex 取数据的时候报错

2018-05-02 02:07:40 +08:00
 SP00F

查过资料没有什么结果,首先怀疑的是 SSR 的问题,但是简单的测试感觉不是 SSR 的问题。没有找到原因,希望在这里能得到解惑!

使用 Nuxt.js 做服务端渲染,前后端分离,Token 存储在 localStorage 里,也包含了一些一般不会改动用户信息。

因为需要读 localStorage 存储的用户信息,在服务端是无法操作的,所以在 beforeMount() 的时候用 Vuex 将 localStorage 的 Token 给读出来,以及包含一些用户信息。

存储的用户信息是 JSON,在组件或页面中使用 mapState 或者是 mappGetters 映射到 computed 后,在 template 中使用 userinfo.nickname 的时候报 Cannot read property nickname

没有找到原因,console.log() 或者是 <template>{{userinfo}}</template> 是正常输出,并且是 Object 没问题,但是如果用 <template>{{userinfo.nickname}}</template>的时候直接就 Cannot read property nickname 没有找到原因,查过 Google 没有什么收获。

感觉上不是 SSR 的问题,我用循环这个 object 或者直接调都可以全部输出,但是用 {{userinfo.nickname}} 就不行了。

希望有人能解惑~ 多谢

1630 次点击
所在节点    Vue.js
9 条回复
noe132
2018-05-02 02:45:50 +08:00
你的 userinfo 是 undefined。在你 beforemount 之前就调用了 userinfo。
加个判断就行了。
SP00F
2018-05-02 02:57:00 +08:00
@noe132 #1

多谢回复, 意味着在 beforemount 的时候需要再次调用 Vuex 获取 localStorage 存储 userinfo 吗?

但是刷新加载页面后输出整个 userinfo 是没问题的,调用 userinfo.nickname 就会报错。
POPOEVER
2018-05-02 03:05:38 +08:00
localStorage 里是字符串吧,读成对象要 JSON.parse() 的吧
SP00F
2018-05-02 03:06:53 +08:00
@POPOEVER #3

多谢回复!

我在 Vuex 读取出来的时候就 `JSON.parse(localStorage.getItem('userinfo'))` 读出来了
ss098
2018-05-02 03:12:59 +08:00
你要把 userinfo 的默认值设为 {}。
POPOEVER
2018-05-02 03:17:22 +08:00
console.log 出来的结果在开发工具里是会异步更新的,所以你得用 vue 的开发工具来调试,看 localStorage 的数据读取是否是在 template 加载前完成,再不济就用 callback 调呗

P.S, 不好意思,我玩 Angular 的,不过道理应该一样的吧 :P
SP00F
2018-05-02 03:20:34 +08:00
@ss098 #5 我尝试一下多谢!

@POPOEVER #6 beforemount 里面 console.log 的,调试工具现在也是有点捉急。我看下楼上的方案试试
POPOEVER
2018-05-02 03:22:30 +08:00
@SP00F 嗯嗯,我也就瞎出主意,五楼可能说出了真相,因为想起微信小程序里就是的,必须在 data 里声明空对象,跟 vue 一个调性,哈哈
SP00F
2018-05-02 03:25:27 +08:00
@POPOEVER #8 5 楼解决我的问题了。。。 我想起来我设置就是 null 导致的


@ss098 #5 多谢兄弟!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/451316

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX