React + MobX,用户身份验证,渲染错误

时间:2019-03-14 00:37:56

标签: javascript reactjs mobx mobx-react

我正在使用MobX进行状态管理,并且还将一些信息保存在localStorage中。

这是我的mobxStore的样子:

const hydrate = create({
    storage: localStorage, // or AsyncStorage in react-native; default: localStorage
    jsonify: false  // if you use AsyncStorage, here shoud be true; default: true
})

export class VendorStore {
    @observable vendor = {};
    @persist @observable.ref loginState = localStorage.getItem('loginState');
}

var vendorStore = new VendorStore()
hydrate('vendorStore', vendorStore).then(() => console.log('vendorStore has been hydrated'))

export default vendorStore

这个想法是控制页面在loginState上的重定向

这是我的Dashboard.js的样子:

if (vendorStore.loginState === false) { return <Redirect to='/signin' /> }
    if (vendorStore.loginState === true) {
        return (
            <div className="Dashboard">
                <h1>Dashboard</h1>
                <Main />
            </div>
        )

它要么没有按预期的方式工作,当loginStatefalse时没有重定向,或者抛出如下所示的反应渲染错误:

react-dom.development.js:57 Uncaught Invariant Violation: Dashboard(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null;

我们将不胜感激

谢谢

2 个答案:

答案 0 :(得分:0)

If else在jsx上不起作用,请尝试以下

vendorStore.loginState ?  return (
            <div className="Dashboard">
                <h1>Dashboard</h1>
                <Main />
            </div>
        ): return <Redirect to='/signin' /> 

答案 1 :(得分:0)

这里几乎没有潜在的问题。

首先,嵌套的ifs可能会导致您出现问题,请尝试更改为:

if (vendorStore.loginState) {
  return (
    <div className="Dashboard">
      <h1>Dashboard</h1>
      <Main />
    </div>
  )
} else {
  return <Redirect to='/signin' />
}

第二,如果您希望React对loginState中的更改做出响应,那么您需要使用可以提供loginState作为React的支持的东西。由于香草反应只会响应状态/道具的变化。尝试集成https://github.com/mobxjs/mobx-react