我正在使用mobX为我的反应原生项目。请考虑这家店类:React组件不响应mobx可观察数据
class Birds {
@observable listOne = [];
@observable fetchingListOne = false;
@observable fetchErrorOne = '';
@action setListOne =() => {
this.fetchingListOne = true;
api.getList()
.then((data) => {
this.listOne.replace(data);
this.fetchingListOne = false;
})
.catch((error) => {
this.fetchingListOne = false;
this.fetchErrorOne = error;
});
};
}
而且这个反应成分:
@inject('BirdStore') @observer
export default class Flat extends React.Component {
componentDidMount() {
this.props.BirdStore.setListOne();
}
_renderHeader =() => {
return <Text style={styles.listHeaderText}>
Hello {this.props.BirdStore.listOne.length} is {this.props.BirdStore.fetchingListOne.toString()}
</Text>;
};
_renderItem = ({item}) => {
return <Text style={styles.item}>{item.name}</Text>
};
_renderFooter =() => {
if (this.props.BirdStore.fetchingListOne) {
return <ActivityIndicator/>
}
else {
return null
}
};
render() {
const dataSource = this.props.BirdStore.listOne.slice();
return (
<View style={styles.container}>
<Text>Fetching: {this.props.BirdStore.fetchingListOne.toString()}</Text>
<FlatList
style={styles.listContainer}
ListHeaderComponent={this._renderHeader}
data={dataSource}
renderItem={this._renderItem}
keyExtractor={(item, i) => item.id}
ListFooterComponent={this._renderFooter}
/>
</View>
)
}
}
从上面看起来对我说:
- 当
Flat
组件坐骑,它调用该方法的店面setListOne()
。 setListOne()
将fetchingListOne
设置为true并进行api调用。- 在组件侧,当
fetchingListOne
为真时,ActivityIndicator显示器,以及在ListHeaderComponent它应该显示真实的。 - 在商店方面,成功/不成功的回应后,它将
fetchingListOne
设置为false。 - 最后上的元件侧,因为
fetchingListOne
被设置为假,ActivityIndicator不应显示和在ListHeaderComponent它应该显示假。
但是,这不是发生了什么事情。在调用setListOne()
方法时,在将fetchingListOne
设置为true后,该组件不会对api调用后所做的更改作出反应。而ActivityIndicator不断显示,并在ListHeaderComponent其显示为真。
我在这里做错了什么?你可以帮我吗。谢谢
更新
我已在FlatList前添加一个文本组件。在组件类的render方法中添加一个Text组件或控制台日志记录会使FlatList对这些更改做出反应。我不知道为什么会发生这种情况。
你能尝试使用'mobx.useStrict()',看看是否能解决您的问题?这意味着使用getters和setter来获得可观察值,特别是'fetchingListOne' –
@ChristopherChiche我试着将'mobx.useStrict(true)'放在** Birds **类所在的store.js中。但是那给了我一个错误:* ...如果这个改变是有意的,请把代码包装在一个'action'中。试图修改:[email protected]] *。所以我把'useStrict();'放在'@action setListOne'中。它不会抛出任何错误,但它有同样的问题; ** FlatList **组件不会像它们应该那样对这些更改做出反应。 –