2017-10-19 15 views
2

内の反応ですかオートランとが動作するためにコンストラクタ内である必要はあり反応? コンストラクタなしでこの簡単な例を書くことはできますか?MobXの自動実行とコンストラクタ

オートランのコードも正常に動作しますが、console.log(this.expenses)に変更しても動作しません。何故ですか?

import { observable, action, computed, useStrict, autorun, reaction } from 'mobx' 
useStrict(true) 

class ExpensesStore { 

    @observable.shallow expenses = [] 

    @action addExpense = (expense) => { 
    this.expenses.push(expense) 
    } 

    @computed get getExpense() { 
    if(this.expenses.length > 0) { 
     return `This is computed from ${this.expenses[0] + this.expenses[1]}` 
    } 

    } 


    constructor() { 
    autorun(() => { 
     console.log(`${this.expenses}`) 
    }) 

    reaction(
    ()=>this.expenses.map(expense => expense), expense => console.log(expense) 
    ) 
    } 


} 

const store = window.store= new ExpensesStore() 

export default store 

答えて

1

オートラン反応はコンストラクタである必要はありません。希望する場合には、例えばこれを行うことができます:

class ExpensesStore { 
    @observable.shallow expenses = [] 

    @action addExpense = (expense) => { 
    this.expenses.push(expense) 
    } 

    @computed get getExpense() { 
    if(this.expenses.length > 0) { 
     return `This is computed from ${this.expenses[0] + this.expenses[1]}` 
    } 
    } 
} 

const store = new ExpensesStore() 

autorun(() => { 
    console.log(`${store.expenses}`) 
}) 

reaction(
() => store.expenses.map(expense => expense), expense => console.log(expense) 
) 

あなたがthis.expensesを書くとき、あなたの浅い配列には何も逆参照されていないため、console.log(`${this.expenses}`)作品やconsole.log(this.expenses)ではないん理由。

あなたが書く...

`${this.expenses}` 

...あなたは、暗黙のうちにthis.expensestoString()を呼んでいます。

例(JSBin

class ExpensesStore { 
    @observable.shallow expenses = [] 

    @action addExpense = (expense) => { 
    this.expenses.push(expense) 
    } 

    @computed get getExpense() { 
    if(this.expenses.length > 0) { 
     return `This is computed from ${this.expenses[0] + this.expenses[1]}` 
    } 
    } 
} 

const store = new ExpensesStore() 

autorun(() => { 
    // store.expenses.slice() works just as well 
    console.log(toJS(store.expenses)) 
}) 

reaction(
() => store.expenses.map(expense => expense), expense => console.log(expense) 
) 

setTimeout(() => { 
    store.addExpense(1000) 
}, 1000) 
+1

ThxをTholle:あなたは、文字列でそれを入れないで同じ効果を得るためにtoJSまたはsliceを使用することができます。私はconsole.logを考えて間違いを見ます。 自動実行と反応がデコレータを必要とせず、ExpensesStoreクラスの外で暮らすことができれば、それらを取り出して他のコンポーネントに入れてそこから実行することができます。行動を取って外に出て行く方法はありますか?私はreduxに似た構造を作りたいと思います。ここで私は1つのファイルにアクションを持ち、別のファイルに格納しますか? –

+0

@ Igor-Vuk問題はありません!もちろん、MobXは非常に柔軟です。私は個人的に計算結果をそのクラスに保存しますが、アクションを移動します。私はずっと前からプロジェクトでこれをやっていましたが、Reduxの素晴らしい、可変なバージョンのように感じました。 – Tholle

+0

どうすればいいですか?アクションを取り出して別のファイルからディスパッチしますか?あなたが参加したいのですか他に質問がありました。 https://stackoverflow.com/questions/46840028/structure-mobx-project-like-redux 私はこの答えを私の最初の質問の解決策として受け入れます。どうも。 –

関連する問題