2017-08-13 5 views
0

私は反応するネイティブプロジェクトでaxiosmobxを使用しています。マウント時のコンポーネント(Home)の1つは、すべてのAPIメソッドが編成されている別のファイルからメソッド(getBirds())を呼び出します。反応のクラスなしでmobx observerを使用する方法

store.js:

class BirdStore { 
    @observable birdList = []; 

    @action setBirdList = (birds) => { 
     this.birdList = birds; 
    }; 
} 

Home.js:

@observer @inject("BirdStore") 
export default class Home extends React.Component {  
    componentDidMount() { 
     api.getBirds() 
     ... 
    } 
} 

api.js:

@inject('BirdStore') @observer 
const api = {  
    getBirds() { 
     const url = website + '/api/birds/'; 
     return axios.get(url) 
      .then((response) => { 
       this.props.BirdStore.setBirdList(response.data) 
      }) 
      .catch((error) => { 
       console.log(error); 
      }) 
    }, 
}; 

しかし、これは私にエラー与える:

Leading decorator must be attached to a class declaration

getBirds()から返されたサーバーのデータをHomeコンポーネントに使用してからsetBirdList()というアクションを呼び出すことができますが、私はAPI関連のものを別に保存したいと考えていました。とにかくクラスなしでmobxを使用するようになっているので、クラスコンポーネント以外のすべてのAPI関連の処理を行うことができますか?

+0

'@inject( 'BirdStore')@ observer'は、あなたの' api'のような通常のオブジェクトではなく、Reactコンポーネントでのみ使うべきです。 'Home'でデコレータの順番を変更しようとします。 '@inject(" BirdStore ")@ observer' – Tholle

+1

@Tholle Ok。ヘッドアップをありがとう! –

答えて

0

このエラーはかなりわかりにくいです。彼らは「つけなければならない」と言います。これに照らして、私はそう言うでしょう。デコレータをクラスに取り付ける必要があります。しかし、もっと重要なことに、this.propsにアクセスすることはできません。

+0

ああ!はい、 'this.props'です。私は方法があったと思うどんな方法。 –

+0

あなたの '' 'getBirds()' '' api呼び出しをあなたの店の@actionとして定義してみませんか?それは私がそれを行う方法です – archae0pteryx

+0

はい。私はそれがはるかに良いと思う。しかし、どのようにエラーを 'catch()'からHomeコンポーネントに渡すことができますか?あるいは、エラーを保持するために別の観測変数を作成する必要がありますか?何か案が? –

関連する問題