【问题标题】:Flux(Alt): ReferenceError: localStorage is not definedFlux(Alt): ReferenceError: localStorage 未定义
【发布时间】:2015-10-14 20:59:55
【问题描述】:

我正在尝试将会话数据存储到 localStorage,但收到错误消息。 "ReferenceError: localStorage 未定义"

这里是代码。

import alt from '../alt';
import UserActions from '../actions/UserActions.js';

// To Do: Inplement LocalStorage Polyfill

class UserStore {
  constructor() {
    this.initialize();
    this.bindListeners({
      onLoginSucceeded: UserActions.LOGIN_SUCCEEDED
    });
  }
  initialize() {
    this.setState({
      // There's an error here.
      _loggedIn: localStorage.getItem('loggedIn'),
      _authToken: localStorage.getItem('authToken'),
      _userId: localStorage.getItem('userId'),
      _profile: localStorage.getItem('profile')
    });
  }
  onLoginSucceeded(data) {
    this.setState({
      _loggedIn: true,
      _authToken: data.authToken,
      _userId: data.userId,
      _profile: data.profile,
      _user: data.user
    });
    // There's no error here.
    localStorage.setItem('authToken', data.authToken);
    localStorage.setItem('loggedIn', data.loggedIn);
    localStorage.setItem('userId', data.userId);
    localStorage.setItem('profile', data.profile);
  }

  getCurrentUser() {
    return this.state._user;
  }

  isLoggedIn() {

  }

}

export default alt.createStore(UserStore, 'UserStore');

我是 es6 的新手,所以我可能会错过一些东西,但我找不到任何东西,比如我不能在类中调用全局对象。 如果您对此错误有任何想法,将会很有帮助。

[编辑] 这适用于 es6fiddle http://www.es6fiddle.net/ichmbt0e/

class UserStore {
  constructor() {
    this.initialize();
  }

  initialize() {
    this.setState({
      _loggedIn: localStorage.getItem('loggedIn'),
      _authToken: localStorage.getItem('authToken'),
      _userId: localStorage.getItem('userId'),
      _profile: localStorage.getItem('profile')
    });
  }

  isLoggedIn() {

  }

}

【问题讨论】:

  • 你试过window.localstorage吗?
  • 是的,我试过了,还有一个错误提示“ReferenceError: window is not defined”
  • 你能不能把它的缩小版变成es6fiddle
  • 嗨,它在 es6fiddle 中工作,当我从构造函数中删除“this.initialize()”时,它也工作了。
  • 这是一个同构应用吗?我会检查 if (typeof window !== "undefined") 以确保您在浏览器中运行此代码。这肯定是服务器尝试在 JS 使其/在客户端上运行之前执行它

标签: javascript reactjs flux react-alt


【解决方案1】:

我发现从localStorage中检索数据时需要使用Alt.bootstrap。

// 客户端.js

import 'es6-shim';
import 'whatwg-fetch';
import Iso from 'iso';
import Router from 'react-router';
import React from 'react';
import routes from './client/routes';
import alt from './client/alt';

Iso.bootstrap(function(state, _, container) {
  var userStoreData = {
    UserStore: {
      _loggedIn: localStorage.getItem('loggedIn'),
      _authToken: localStorage.getItem('authToken'),
      _userId: localStorage.getItem('userId'),
      _profile: localStorage.getItem('profile')
    }
  }
  var new_state = Object.assign(JSON.parse(state), userStoreData)
  alt.bootstrap(JSON.stringify(new_state));

  Router.run(routes, Router.HistoryLocation, function(Handler) {
    var node = React.createElement(Handler);
    React.render(node, container);
  });
});

【讨论】:

  • 简而言之,我认为thumn的一般规则是不要在商店的构造函数中做事。我也为它给我带来的不同错误而苦苦挣扎。我想知道为什么会这样。
猜你喜欢
  • 2018-02-14
  • 1970-01-01
  • 2012-08-24
  • 2021-09-12
  • 1970-01-01
  • 2015-10-04
  • 2017-04-10
相关资源
最近更新 更多