【发布时间】:2018-01-22 16:35:15
【问题描述】:
我在我的 react native 项目中使用 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组件挂载时,调用storesetListOne()的方法。 -
setListOne()将fetchingListOne设置为 true 并进行 api 调用。 - 在组件端,当
fetchingListOne为真时,ActivityIndicator显示,而在ListHeaderComponent中它应该显示为真。 - 在商店端,响应成功/不成功后,将
fetchingListOne设置为false。 - 最后在组件方面,因为
fetchingListOne设置为false,ActivityIndicator不应该显示,而在ListHeaderComponent中应该显示为false。
但是,事实并非如此。这里当调用setListOne() 方法时,将fetchingListOne 设置为true 后,组件不会对api 调用后所做的更改做出反应。 ActivityIndicator 不断显示,在 ListHeaderComponent 中显示为 true。
我在这里做错了什么?请你帮助我好吗。谢谢
更新
我在 FlatList 之前添加了一个 Text 组件。在组件类的 render 方法中添加 Text 组件或控制台日志记录确实会使 FlatList 对更改做出反应。不过我不知道为什么会这样。
【问题讨论】:
-
您可以尝试使用
mobx.useStrict()看看它是否能解决您的问题吗?这意味着为您的可观察值使用 getter 和 setter,尤其是fetchingListOne -
@ChristopherChiche 我尝试将
mobx.useStrict(true)放在 Birds 类所在的 store.js 中。但这给了我一个错误:...如果打算进行此更改,请将代码包装在action中。尝试修改:Birds@2.listOne]。所以我把useStrict();放在@action setListOne中。它不会抛出任何错误,但它有同样的问题; FlatList 组件不会对这些更改做出应有的反应。
标签: reactjs react-native mobx mobx-react