真正了解React-native,但在将getInitialState转换为构造函数时遇到了一些问题。我在可滑动行的ListView上工作。它与getInitialState一起使用,但不适用于构造函数。
转换后的代码:
'use strict';
var React = require('react-native');
var {
StyleSheet,
ListView,
Text,
View,
} = React;
var styles = StyleSheet.create({
container: {
backgroundColor: '#f2f2f2',
flex: 1,
},
listview: {
flex: 1,
},
li: {
backgroundColor: '#fff',
borderBottomColor: '#eee',
borderColor: 'transparent',
borderWidth: 1,
paddingLeft: 16,
paddingTop: 14,
paddingBottom: 16,
},
liText: {
color: '#333',
fontSize: 16,
},
statusbar: {
backgroundColor: '#fff',
height: 22,
}
})
var btnsTypes = [
{text: 'Primary', type: 'primary',},
{text: 'Secondary', type: 'secondary',},
{text: 'Delete', type: 'delete',}
]
var rows = [
{
text: "Buttons swipe left",
right: btnsTypes,
},
{
text: "Buttons swipe left",
right: btnsTypes,
}
]
// include react-native-swipeout
var Swipeout = require('react-native-swipeout')
// example swipout app
class swipeoutExample extends React.Component {
constructor(){
super()
var ds = new ListView.DataSource({rowHasChanged: (row1, row2) => true})
this.state = {
dataSource: ds.cloneWithRows(rows),
scrollEnabled: true
};
}
// set scrolling to true/false
_allowScroll (scrollEnabled) {
this.setState({ scrollEnabled: scrollEnabled })
}
// set active swipeout item
_handleSwipeout (rowID) {
for (var i = 0; i < rows.length; i++) {
console.log(rowID)
if (i != rowID) rows[i].active = false
else rows[i].active = true
}
this._updateDataSource(rows)
}
_updateDataSource (data) {
this.setState({
dataSource: this.state.dataSource.cloneWithRows(data)
})
}
_renderRow (rowData: string, sectionID: number, rowID: number) {
return <Swipeout
left={rowData.left}
right={rowData.right}
rowID={rowID}
sectionID={sectionID}
autoClose={rowData.autoClose}
backgroundColor={rowData.backgroundColor}
close={!rowData.active}
onOpen={(sectionID, rowID) => this._handleSwipeout(rowID)}
scroll={event => this._allowScroll(event)}>
<View style={styles.li}>
<Text style={styles.liText}>{rowData.text}</Text>
</View>
</Swipeout>
}
render () {
return (
<View style={styles.container}>
<View style={styles.statusbar}/>
<ListView
scrollEnabled={this.state.scrollEnabled}
dataSource={this.state.dataSource}
renderRow={this._renderRow}
style={styles.listview}/>
</View>
)
}
}
module.exports = swipeoutExample;
错误信息:
有效的getInitialState:
var swipeoutExample = React.createClass({
getInitialState: function() {
// datasource rerendered when change is made (used to set swipeout to active)
var ds = new ListView.DataSource({rowHasChanged: (row1, row2) => true})
return {
dataSource: ds.cloneWithRows(rows),
scrollEnabled: true
}
}
我已经尝试了所有内容,并且所有内容都应该相同,但一如既往。希望任何人都能提供帮助。尝试了一切。
您的问题与无关getInitalState
。问题是在ES6类中,React不会将您的方法绑定到this
。因此_renderRow
,在错误的上下文中调用了您的方法。
您可以通过在以下内容中添加以下内容来修复此问题: constructor
constructor() {
super()
var ds = new ListView.DataSource({rowHasChanged: (row1, row2) => true})
this.state = {
dataSource: ds.cloneWithRows(rows),
scrollEnabled: true
};
this._renderRow = this._renderRow.bind(this); // <- now your method always save context of this class
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句