2016-08-26 12 views
3

私はReactをMobXと組み合わせて使用​​しています。私は観測可能な配列(会話)を持つストアを使用し、この配列のソートされたバージョンを計算されたプロパティとして提供したいと考えています。新しい会話を追加する場合、会話が配列に追加される前に、計算されたプロパティsortedConversationsが評価されます。以下の小さな例では、「会話の並べ替え」は常に「追加された会話」の前に記録されます。私は何か間違っているのですか?実際に配列に項目が挿入される前にMobX計算が実行される

class Store { 

    ... 

    @observable conversations = []; 

    addConversation(conversation) { 
     this.conversations.push(conversation); 
     console.log('Added conversation'); 
    } 

    @computed 
    get sortedConversations() { 
     console.log('Reordering conversations'); 
     return _.orderBy(this.conversations.slice(), ['lastUpdated'], ['asc']); 
    } 
} 
+0

観察者が変更されたときに観察者が同期して更新されるため、 '会話の並べ替え 'は'会話の追加'の前に記録されます。あなたのコンポーネントは再レンダリングされませんか?あなたは '@ observer'でそれを飾ったことがありますか? – Tholle

+0

答えはありませんが、 'addConversation'を' action'として設定すると、ログが '正しい'順番で表示されます( '会話の追加'、 '会話の並べ替え') – Komo

+1

Tholleの答え、 1.アイテムがコレクションに追加されます。2.そのために計算されたアイテムが更新されます。 3.「追加された会話」が記録されます。別の見方をすると、ソートされた会話を最初のログステートメントに記録すると、計算結果がすぐに更新されるため、正しい出力が表示されます。 (他の多くのフレームワークとは異なり、一時的に古いデータを残す) – mweststrate

答えて

1

あなたは間違ったことはしていません。 MobX APIは通常のJavaScriptのように見えますが、監視対象が更新されるたびに、その監視対象はすべて監視対象内で同期的に更新されます。これは、このケースで問題になりませんが、transactionaddConversationの内容をラップすることができます:

addConversation(conversation) { 
    transaction(() => { 
    this.conversations.push(conversation); 
    console.log('Added conversation'); 
    }); 
} 

ます。また、もtransactionあるactionaddConversationを作ることができる:

@action 
addConversation(conversation) { 
    this.conversations.push(conversation); 
    console.log('Added conversation'); 
} 
+0

私が理解しているように、 'トランザクション'は複数の '観測可能な'突然変異が連続して行われる場合にのみ必要ですが、 'observers'反応する成分)を1回通知する。それは '会話 'が一度だけ突然変異しているので、ここではそうではありません。しかし、「行動」勧告は理にかなっている。 – Komo

+0

@Komoあなたは正しいです。私は 'Reordering conversations'の前に' Reordering conversations'がなぜ記録されたのかを説明しようとしていました。 – Tholle

関連する問題