请教个有关 Vue.js 使用 Nuxt.js 服务端渲染,使用 Vuex 取数据的时候报错 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SP00F
V2EX    Vue.js

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

  •  
  •   SP00F 2018-05-02 02:07:40 +08:0 1912 次点击
    这是一个创建于 2784 天前的主题,其中的信息可能已经有所发展或是发生改变。

    查过资料没有什么结果,首先怀疑的是 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}} 就不行了。

    希望有人能解惑~ 多谢

    9 条回复    2018-05-02 03:25:27 +08:00
    noe132
        1
    noe132  
       2018-05-02 02:45:50 +08:00 via Android   1
    你的 userinfo 是 undefined。在你 beforemount 之前就调用了 userinfo。
    加个判断就行了。
    SP00F
        2
    SP00F  
    OP
       2018-05-02 02:57:00 +08:00
    @noe132 #1

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

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

    多谢回复!

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

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

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


    @ss098 #5 多谢兄弟!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2020 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 00:02 PVG 08:02 LAX 16:02 JFK 19:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86