2016-08-24 11 views
3

最近、反応とmobx反応ライブラリでmobxを使い始めました。Mobx - 反応:一緒に注入して観察する

機能的な反応コンポーネントを使用してビューを作成したいと考えています。

セレクタ関数とComponentを引数とし、inject(パラメータとしてセレクタ関数を使用)を呼び出し、そのコンポーネントを監視して、このコンポーネントをmobx-reactストアに効果的に接続するヘルパー関数を作成したいと思います。 )、このコンポーネントに必要なプロパティのみを提供します。

しかし、私はそれを働かせることはできません。アクションはディスパッチされていますが、ビューはこの変更に反応しません(ストア属性は変更されますが、コンポーネントはこの変更に反応しません)。

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

export function connect(selectorFunction, component) { 
    return inject(selectorFunction)(observer(component)); 
} 

は私のコンポーネントです:

import React from 'react'; 
import { connect } from 'utils'; 

const selector = (stores) => { 
    return { 
    counter: stores.counterStore.counter, 
    double: stores.counterStore.double, 
    increment: stores.counterStore.increment 
    }; 
}; 

const Counter = ({ counter, double, increment }) => { 
    return (
    <div className="counter"> 
     <p>{ counter }</p> 
     <p className="double">{ double }</p> 
     <button onClick={increment}>+1</button> 
    </div> 
); 
}; 

export default connect(selector, Counter); 

、ここで私の店です:

は、ここに私のヘルパー関数です

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

export default class Counter { 
    @observable counter = 0; 

    @action 
    increment =() => { 
    this.counter++; 
    } 

    @computed 
    get double() { 
    return this.counter * 2; 
    } 
} 

(示していないプロバイダや他の単純なもの、それ適切に設定されている)。

ありがとうございます!すべての答えは非常に高く評価されています。

答えて

3

Mobxのdocumentationを見ると、セレクタが少し間違っているようです。店舗のオブジェクト、およびの値を持つオブジェクトではないオブジェクトを返す必要があります。代わりに、実際のcounterStoreを戻してください:

const selector = (stores) => { 
    return { 
    counterStore: stores.counterStore 
    }; 
}; 

そして、あなたのコンポーネントでこのようにそれを使用します。答えを

const Counter = ({ counterStore: { counter, double, increment } }) => { 
    return (
    <div className="counter"> 
     <p>{ counter }</p> 
     <p className="double">{ double }</p> 
     <button onClick={increment}>+1</button> 
    </div> 
); 
}; 
+0

ありがとう!これは私が知りませんでした他のいくつかの問題を解決したかもしれませんが、私の以前の問題はまだ続きます:) –

+0

うーん、それは変です。あなたのコードを(私のコンピュータ上でローカルに)使用し、あなたが記述した問題に気付きました。これに更新した後、それは私のために適切に働いた。あなたは解決策を見つけることを願っています! – tobiasandersen

+0

現在の動作の背後にある理由は、 'observer'コンポーネントの' render'メソッドだけが追跡され、注入関数自体は追跡されないということです。実際には面白いかもしれません...楽しみのために、これがあなたの元の問題を解決するかどうかを試すことができます: 'return observer(inject(selectorFunction)(observer(component)))' も参照してください:https:// github。 co.jp/mobxjs/mobx-react/issues/111 – mweststrate

-2

export function connect(selectorFunction, mapToProps, component) { 
 
    return inject(selectorFunction)(observer(withProps(mapToProps)(component))); 
 
} 
 

 
export const withProps = (mapToProps: (Object) => Object) => Component => { 
 
    return class extends React.Component { 
 
    render() { 
 
     const mappedProps = mapToProps(this.props) 
 
     return <Component {...mappedProps} {...this.props}/> 
 
    } 
 
    } 
 
} 
 

 
const ConnectedCounter = connect(
 
    (stores) => ({counterStore: stores.counterStore}), 
 
    ({counterStore}) => ({ 
 
    counter: counterStore.counter, 
 
    double: counterStore.double, 
 
    increment: counterStore.increment 
 
    }), 
 
    Counter 
 
)

関連する問題