mobx装饰者不能使用Typescript

时间:2017-07-04 05:03:25

标签: typescript decorator mobx mobx-react

我刚刚开始开发一个新项目,在这个项目中,我使用mobx作为反应式Web应用程序和反应原生移动应用程序之间的共享状态管理核心模块。

核心模块使用typescript,它由两个应用程序项目编译和使用。

我的问题是,当商店中的@observable属性(来自核心模块)发生变化时,两个项目中的组件都不会重新呈现。

当我在每个项目中创建具有相同定义和逻辑的商店时,组件会按预期重新呈现。我也将核心模块的一部分转换为用babel-cli编译的javascript ES6,它也按预期工作。

我认为这个问题与将从Typescript编译的商店导入非打字稿项目有关,但我无法克服它!

其他信息:

.ts商店文件:

import { observable, action } from 'mobx'

export class UserStore {
    @observable loading = false;

    @action login() {
        this.loading = true;
        setTimeout(() => {this.loading = false},1000)
    }
}
export const userStore = new UserStore();

.tsconfig文件:

{"compilerOptions": {
    "lib": ["es6", "dom", "es2015"],
    "module": "commonjs",
    "target": "es5",
    "moduleResolution": "node",
    "declaration": false,
    "outDir": "lib",
    "experimentalDecorators": true
  },
  "include": ["index.ts", "src" ]}

打字稿版本:2.4.1

所有项目都使用最新的mobxmobx-react版本。

反应和反应原生项目都使用普通的巴贝尔。

使用商店的组件(我已经配置了Provider ..):

@inject('userStore')
@observer
class Loading extends Component {

  componentWillMount() {
    this.props.userStore.login();
  }

  render() {
    return (
        this.props.userStore.loading ? <div>loading...</div> : <div>loaded...</div>
) }}

1 个答案:

答案 0 :(得分:-3)

而不是@inject('userStore')只需使用import {userStore} from "./foo/userStore"即可。

简而言之:

@observer
class Loading extends Component {

  componentWillMount() {
    userStore.login();
  }

  render() {
    return (
        userStore.loading ? <div>loading...</div> : <div>loaded...</div>
) }}