javascript - mobx @inject 不创建新的(装饰的)组件

标签 javascript reactjs mobx mobx-react

我正在尝试使用 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;

console.log(this.props)componentDidMount()显示有空 Prop 。

不仅如此,检查<Provider> React-dev-tools 中的子项显示 @inject没有创建新组件(它显示 <App> 而不是预期的 <inject-App-with-ApplicationStore>

我不明白

最佳答案

问题出在 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);
...

现在它正在按预期工作。

关于javascript - mobx @inject 不创建新的(装饰的)组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53561376/

相关文章:

javascript - Jquery 每个按值排序

javascript - 简单的 JavaScript rng

javascript - 具有多个模块的路由和内联 View 不起作用 - $http 拦截器可能会导致错误

javascript - 当 redux 的 props 更新后,React 组件应该如何重新渲染自身?

javascript - 根据 React 中不同字段的不同文本输入进行过滤

javascript - 尽管等待 promise ,但 promise 并未同步解决

Javascript 调整背景图像的大小,但图像首先加载全尺寸 - 有解决办法吗?

javascript - 一旦 promise 得到解决,如何在 catch 中传递错误?

javascript - 在 observabel 数组中添加的元素不可观察 + ReactJs

javascript - 上下文在不同用户之间共享