react-native入門之ListView-安卓開發者的第一視角
<pre class="javascript" name="code">export default class MyListView extends Component{ //構造方法,可以等同於es5的getInitialState方法 constructor(props){ super(props); var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); this.state = { dataSource: ds.cloneWithRows(this._genRows()), } }
render()</span>{ return( <ListView style={styles.sub_item} dataSource = {this.state.dataSource} renderRow = {this._renderRow.bind(this)} /> ) }<div>//系統renderRow會提供以下的引數 _renderRow(rowData: string, sectionID: number, rowID: number){ var imageSrc = IMAGES[rowID%IMAGES.length]; return( <TouchableOpacity onPress = {this._pressRow.bind(this,rowID)}> <View style={styles.item}></div><div></div><div> <Image style={styles.pic} source={imageSrc}/></div><div></div><div> <View style={styles.sub_item}> <View > <Text style = {styles.text}>ListView</Text> </View> <View> <Text style = {styles.text}> {rowData}+{sectionID}+{rowID}</Text> </View> </View> </View> </TouchableOpacity> ) }</div><div></div><div> _genRows(): Array<string> { var dataBlob = []; for (var ii = 0; ii < 100; ii++) {</div><div></div><div> dataBlob.push('Row ' + ii ); } return dataBlob; } _pressRow(x){ console.log('click'+x); }}</div><div></div><div>const styles = StyleSheet.create({ item:{ flex:1, flexDirection:'row', height:100, borderWidth:1, borderRadius:5, marginBottom:10, justifyContent: 'center', alignItems: 'center',</div><div></div><div> },</div><div></div><div> pic:{ flex:1, borderRadius:20, resizeMode: Image.resizeMode.contain</div><div></div><div> }, sub_item:{ flex:1,</div><div></div><div> }, text:{ textAlign: 'center',</div><div></div><div> }</div><div></div><div>});</div>
</pre><pre class="javascript" name="code">
上面的程式碼中,首先我們注意到export default 這個呢是表明這個類可以被外部引用,export關鍵字在安卓也出現過吧,意思其實差不多的。然後接下來看到構造方法,並不陌生吧,與java不同的是,JS不支援函式的過載。構造方法預設的書寫就是帶props引數,理解的話這個props可以理解成java當中的構造方法的引數,但嚴格的說起來,props和state都是用於描述component狀態的,就是說不管你用或不用,它都在那裡,從java的觀點來看這兩個屬性,我第一個問題都是他們是什麼型別的吧,經過我的嚴密觀察,從嚴謹的角度來講,他們是物件型別的,可以隨便新增屬性,就是你用到什麼,你就可以給他新增什麼屬性。是不是
render()這個方法就是繪製檢視,返回的檢視就是要顯示在介面的檢視啦。
ListView的基本用法的話我就簡單介紹一下。我們先看一下重要程式碼
<ListView style={styles.sub_item}
dataSource = {this.state.dataSource}
renderRow = {this._renderRow.bind(this)}
/>
</pre></p><p></p><p> ListView最簡單的用法就是這樣啦,dataSource是所有資料,renderRow是Item的檢視。還有其他的可以看<a target=_blank href="http://react-native.cn/" target="_blank">官網API</a>。有一點需要強調的是,資料的話,需要進行簡單處理一下,</p><pre class="javascript" name="code"> var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {
dataSource: ds.cloneWithRows(this._genRows())}
這裡資料片段,第一句話的意思大概是這樣的意思,r1 和 r2 是不同時刻的Item,相等則不變,不相等則變成r2,這樣的意義在於在資料發生變化重新渲染檢視時只改變有所變化的Item這一行,其他的不變。然後第三句話就是把第一句話這種格式賦給真正的資料。我這裡_genRows()這個方法返回的是100個數組,就是偽造100個數據吧。
然後基本上就實現了我們的ListView了,我猜想作為安卓開發者,這個時候一定是要問那每個Item的點選事件怎麼設定呢。好,既然這位同學你發出了這樣的問題,那麼我就簡單說明一下。
RN中有幾種點選控制元件,,Touchable,可以觸控的,就是可以點選的咯,給誰設定點選事件就用他們之一來包裹誰。這裡就是檢視的部分了,我們看一下我這裡的佈局,
<TouchableOpacity onPress = {this._pressRow.bind(this,rowID)}>
<View style={styles.item}>
<Image style={styles.pic} source={imageSrc}/>
<View style={styles.sub_item}>
<View >
<Text style = {styles.text}>ListView</Text>
</View>
<View>
<Text style = {styles.text}> {rowData}+{sectionID}+{rowID}</Text>
</View>
</View>
</View>
</TouchableOpacity>
以上是Item的佈局,最外層是TouchableOpacity,至於為什麼我選這個還不選其他的,任性。。。。。 有興趣的可以研究一下每一個的區別。 然後onPress就是設定點選事件了。至於樣式什麼的,就省略了。
好了,就到此結束了。畢竟剛學兩天,好多地方說的不對的明示一下我,免得我一直被自己誤導。