मैं प्रतिक्रिया मूल में एक अनंत स्क्रॉल को लागू करने की कोशिश कर रहा हूं। नीचे घटक का स्रोत है:प्रतिक्रिया मूल सूची देखें - rowHasChanged आग नहीं है
var React = require('react-native');
var server = require('../server');
var Post = require('./Post');
var SwipeRefreshLayoutAndroid = require('./SwipeRefreshLayout');
var backEvent = null;
var lastPostId = "";
var isLoadingMore = false;
var isLoadingTop = false;
var onEndReachedActive = false;
var {
StyleSheet,
ListView,
View,
Text,
Image,
ProgressBarAndroid,
BackAndroid
} = React;
class Stream extends React.Component {
constructor(props) {
super(props);
this.ds = new ListView.DataSource({
rowHasChanged: (row1, row2) => {
console.log("rowHasChenged FIRED!!");
return false;
}
});
this.state = {
dataSource: this.ds.cloneWithRows(['loader']),
hasStream: false,
posts: []
};
}
componentDidMount() {
BackAndroid.addEventListener('hardwareBackPress',() => {
this.props.navigator.jumpBack();
return true;
}.bind(this));
server.getStream('', '', 15).then((res) => {
lastPostId = res[res.length-1].m._id;
this.setState({
posts: res,
hasStream: true,
dataSource: this.ds.cloneWithRows(res)
},() => onEndReachedActive = true);
})
}
onRefresh() {
var posts = this.state.posts;
var firstPost = posts[0].m._id;
console.log(this.state.dataSource._rowHasChanged);
isLoadingTop = true;
server.getStream('', firstPost, 4000)
.then(res => {
console.log(posts.length);
posts = res.concat(posts);
console.log(posts.length);
this.setState({
dataSource: this.ds.cloneWithRows(posts),
posts
},() => {
this.swipeRefreshLayout && this.swipeRefreshLayout.finishRefresh();
isLoadingTop = false;
});
}).catch((err) => {
isLoadingTop = false;
})
}
onEndReached(event) {
if(!onEndReachedActive) return;
if(this.state.loadingMore || this.state.isLoadingTop)return;
isLoadingMore = true;
var posts = this.state.posts;
server.getStream(posts[posts.length-1].m._id, '', 15)
.then(res => {
console.log('received posts');
posts = posts.concat(res);
lastPostId = posts[posts.length-1].m._id;
this.setState({
dataSource: this.ds.cloneWithRows(posts),
posts
},()=>isLoadingMore = false);
})
}
renderHeader() {
return (
<View style={styles.header}>
<Text style={styles.headerText}>Header</Text>
</View>
)
}
renderRow(post) {
if(post === 'loader') {
return (
<ProgressBarAndroid
styleAttr="Large"
style={styles.spinnerBottom}/>
)
}
let hasLoader = post.m._id === lastPostId;
let loader = hasLoader ?
<ProgressBarAndroid
styleAttr="Large"
style={styles.spinnerBottom}/> : null;
return (
<View>
<Post
post={post}/>
{loader}
</View>
)
}
render() {
return (
<ListView
style={styles.mainContainer}
dataSource={this.state.dataSource}
renderRow={this.renderRow.bind(this)}
onEndReached={this.onEndReached.bind(this)}
onEndReachedThreshold={1}
pageSize={15} />
);
}
}
समस्या यह है कि जब भी मैं संलग्न (या आगे जोड़ते) नए डेटा, DataSource
की rowHasChanged
विधि आग नहीं करता है। यह सिर्फ हर पंक्ति को फिर से प्रस्तुत करता है, यहां तक कि कुछ भी नहीं बदला है (नए डेटा को छोड़कर)। कोई विचार क्यों विधि को छोड़ दिया गया है?
क्या किसी को पता है कि यह डॉक्यू है प्रतिक्रिया मूल दस्तावेज़ों में कहीं भी mented? मुझे यह विशेष रूप से उल्लेख नहीं किया जा सकता है और यह महत्वपूर्ण लगता है ... –
यदि आप राज्य को अपडेट करने के लिए वर्तमान स्थिति का उपयोग कर रहे हैं, तो आपको 'this.setState ((state) => ({dataSource: state.dataSource.cloneWithRows (पोस्ट)})); '। सेटिंग सेट एक फंक्शन एक दौड़ की स्थिति का खतरा कम कर देता है। – jtolds
@jtolds संपादित, धन्यवाद! –