2017-08-13 53 views
0

我在我的反應原生項目中使用axiosmobx。其中一個安裝組件(Home)需要從其他所有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'只能在React組件上使用,而不能在像'api'這樣的常規對象上使用。還可以嘗試更改'Home「上的裝飾器的順序。 '@inject(「BirdStore」)@ observer' – Tholle

+1

@Tholle好的。感謝您的領導! –

回答

0

這個錯誤很神祕。他們說:「必須依附......」。鑑於此,我會說,是的。您需要將裝飾器附加到類中。但更重要的是,否則您將無法訪問this.props

+0

啊!是的,'this.props'。任何方式,我希望有一種方式。 –

+0

爲什麼不在商店中定義你的'''getBirds()'''api作爲@action調用?我就是這麼做的 – archae0pteryx

+0

是的。我認爲這樣好多了。但是,如何將錯誤從catch()傳遞到Home組件。或者我應該讓另一個可觀察的變量來保存錯誤?任何想法? –

相關問題