【问题标题】:mobx @inject not creating new (decorated) componentmobx @inject 不创建新的(装饰的)组件
【发布时间】:2018-11-30 16:27:34
【问题描述】:

我正在尝试使用 mobx 设置 React 应用程序进行状态管理。

我已经这样定义了一个商店:

ApplicationStore.js

import { observable, action, reaction } from 'mobx';

class ApplicationStore {

  @observable appName = 'App';
  @observable currentRoute = '/';
  @observable appLoaded = false;

  @action setAppLoaded() {
      this.appLoaded = true;
  }
}

export default new ApplicationStore();

Root.js 中使用它来收集商店/调试工具并将其传递给主应用程序组件:

Root.js

import React, { Component } from 'react';

import { Provider } from 'mobx-react';

import App from './App.js';

import './Root.css';

import ApplicationStore from './stores/ApplicationStore';

const stores = { ApplicationStore }

class Root extends Component {
  render() {
    return (
      <Provider {...stores}>
        <App />
      </Provider>
    );
  }
}

export default Root;

App.js

import React, { Component } from 'react';

import Login from './views/login/Login'
import Dashboard from './views/dashboard/Dashboard'

import { observer, inject } from 'mobx-react';

import { Switch, Route, BrowserRouter, Redirect } from 'react-router-dom'

@inject('ApplicationStore')
@observer
class App extends Component {

    componentDidMount() {
        console.log(this.props)
    };

   render() {

    var loggedIn = false;        

    return (
      <div className="App">
        <BrowserRouter>
          <Switch>
            <Route exact path="/" render={() => (
              loggedIn ? (
                <Redirect to="/dashboard" />
              ) : (
                <Redirect to="/login" />
              )
              )} />
            <Route exact path="/login" component={Login} />
            <Route exact path="/dashboard" component={Dashboard} />
          </Switch>
        </BrowserRouter>
      </div>
    );
  }
}

export default App;

componentDidMount() 中的console.log(this.props) 表示有空道具。

不仅如此,在 React-dev-tools 中检查 &lt;Provider&gt; 的子组件表明 @inject 没有创建新组件(它显示 &lt;App&gt; 而不是预期的 &lt;inject-App-with-ApplicationStore&gt;

我不明白啊啊啊啊

【问题讨论】:

  • 由于您的代码看起来正确,我只是猜测一下:尝试将 &lt;Provider {...stores}&gt; 替换为 &lt;Provider applicationStore={ApplicationStore}&gt; 然后 @inject('applicationStore')(注意小写参考)
  • 想出了答案。目前正在回答问题。是我的 babel 配置有问题。

标签: javascript reactjs mobx mobx-react


【解决方案1】:

问题出在 babel 配置上。我正在使用react-app-rewired 方法将装饰器功能添加到create-react-app which can be seen here...

在我拥有的config-overrides.js 文件中:

const { injectBabelPlugin } = require("react-app-rewired");

module.exports = function override(config, env) {

    config = injectBabelPlugin(['@babel/plugin-proposal-decorators', {decoratorsBeforeExport: false}], config);

    return config;
} 

我改成:

...
     config = injectBabelPlugin(['@babel/plugin-proposal-decorators', {"legacy": true}], config);
...

它现在按预期工作。

【讨论】:

  • 老兄,谢谢你!在过去的 2 个小时里,我一直在努力理解为什么一个完美的实现(根据他们的示例和其他在线模型)不能与 @inject 一起使用,即使它正在与 inject(...) 一起使用。希望有一天这能帮助另一个可怜的灵魂。 :)
  • @AlexFlorin 没问题,很高兴它可以提供帮助! :)
猜你喜欢
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2017-03-21
  • 2021-02-02
  • 2018-07-11
  • 2018-07-06
  • 1970-01-01
相关资源
最近更新 更多