<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        react native帶索引的城市列表組件的實例代碼

        來源:懂視網 責編:小采 時間:2020-11-27 22:33:14
        文檔

        react native帶索引的城市列表組件的實例代碼

        react native帶索引的城市列表組件的實例代碼:城市列表選擇是很多app共有的功能,比如典型的美圖app。那么對于React Native怎么實現呢? 要實現上面的效果,首先需要對界面的組成簡單分析,界面的數據主要由當前城市,歷史訪問城市和熱門城市組成,所以我們在提供Json數據的時候就需要將數據分為至少3
        推薦度:
        導讀react native帶索引的城市列表組件的實例代碼:城市列表選擇是很多app共有的功能,比如典型的美圖app。那么對于React Native怎么實現呢? 要實現上面的效果,首先需要對界面的組成簡單分析,界面的數據主要由當前城市,歷史訪問城市和熱門城市組成,所以我們在提供Json數據的時候就需要將數據分為至少3

        城市列表選擇是很多app共有的功能,比如典型的美圖app。那么對于React Native怎么實現呢?

        這里寫圖片描述

        要實現上面的效果,首先需要對界面的組成簡單分析,界面的數據主要由當前城市,歷史訪問城市和熱門城市組成,所以我們在提供Json數據的時候就需要將數據分為至少3部分。

        const ALL_CITY_LIST = DATA_JSON.allCityList;
        const HOT_CITY_LIST = DATA_JSON.hotCityList;
        const LAST_VISIT_CITY_LIST = DATA_JSON.lastVisitCityList;

        而要實現字母索引功能,我們需要自定義一個控件,實現和數據的綁定關系,自定義組件代碼如下:

        CityIndexListView.js

        'use strict';
        import React, {Component} from 'react';
        import {
         StyleSheet,
         View,
         Text,
         TouchableOpacity,
         ListView,
         Dimensions,
        } from 'react-native';
        
        import Toast, {DURATION} from './ToastUtil'
        
        const SECTIONHEIGHT = 30;
        const ROWHEIGHT = 40;
        const ROWHEIGHT_BOX = 40;
        var totalheight = []; //每個字母對應的城市和字母的總高度
        
        const {width, height} = Dimensions.get('window');
        
        var that;
        
        const key_now = '當前';
        const key_last_visit = '最近';
        const key_hot = '熱門';
        
        export default class CityIndexListView extends Component {
        
         constructor(props) {
         super(props);
        
         var getSectionData = (dataBlob, sectionID) => {
         return sectionID;
         };
         var getRowData = (dataBlob, sectionID, rowID) => {
         return dataBlob[sectionID][rowID];
         };
        
         let ALL_CITY_LIST = this.props.allCityList;
         let CURRENT_CITY_LIST = this.props.nowCityList;
         let LAST_VISIT_CITY_LIST = this.props.lastVisitCityList;
         let HOT_CITY_LIST = this.props.hotCityList;
        
         let letterList = this._getSortLetters(ALL_CITY_LIST);
        
         let dataBlob = {};
         dataBlob[key_now] = CURRENT_CITY_LIST;
         dataBlob[key_last_visit] = LAST_VISIT_CITY_LIST;
         dataBlob[key_hot] = HOT_CITY_LIST;
        
         ALL_CITY_LIST.map(cityJson => {
         let key = cityJson.sortLetters.toUpperCase();
        
         if (dataBlob[key]) {
         let subList = dataBlob[key];
         subList.push(cityJson);
         } else {
         let subList = [];
         subList.push(cityJson);
         dataBlob[key] = subList;
         }
         });
        
         let sectionIDs = Object.keys(dataBlob);
         let rowIDs = sectionIDs.map(sectionID => {
         let thisRow = [];
         let count = dataBlob[sectionID].length;
         for (let ii = 0; ii < count; ii++) {
         thisRow.push(ii);
         }
        
         let eachheight = SECTIONHEIGHT + ROWHEIGHT * thisRow.length;
         if (sectionID === key_hot || sectionID === key_now || sectionID === key_last_visit) {
         let rowNum = (thisRow.length % 3 === 0)
         ? (thisRow.length / 3)
         : parseInt(thisRow.length / 3) + 1;
        
         console.log('sectionIDs===>' + sectionIDs + ", rowNum=====>" + rowNum);
        
         eachheight = SECTIONHEIGHT + ROWHEIGHT_BOX * rowNum;
         }
        
         totalheight.push(eachheight);
        
         return thisRow;
         });
        
        
         let ds = new ListView.DataSource({
         getRowData: getRowData,
         getSectionHeaderData: getSectionData,
         rowHasChanged: (row1, row2) => row1 !== row2,
         sectionHeaderHasChanged: (s1, s2) => s1 !== s2
         });
        
         this.state = {
         dataSource: ds.cloneWithRowsAndSections(dataBlob, sectionIDs, rowIDs),
         letters: sectionIDs
         };
        
         that = this;
         }
        
         _getSortLetters(dataList) {
         let list = [];
        
         for (let j = 0; j < dataList.length; j++) {
         let sortLetters = dataList[j].sortLetters.toUpperCase();
        
         let exist = false;
         for (let xx = 0; xx < list.length; xx++) {
         if (list[xx] === sortLetters) {
         exist = true;
         }
         if (exist) {
         break;
         }
         }
         if (!exist) {
         list.push(sortLetters);
         }
         }
        
         return list;
         }
        
         _cityNameClick(cityJson) {
         // alert('選擇了城市====》' + cityJson.id + '#####' + cityJson.name);
         this.props.onSelectCity(cityJson);
         }
        
         _scrollTo(index, letter) {
         this.refs.toast.close();
         let position = 0;
         for (let i = 0; i < index; i++) {
         position += totalheight[i]
         }
         this._listView.scrollTo({y: position});
         this.refs.toast.show(letter, DURATION.LENGTH_SHORT);
         }
        
         _renderRightLetters(letter, index) {
         return (
         <TouchableOpacity key={'letter_idx_' + index} activeOpacity={0.6} onPress={() => {
         this._scrollTo(index, letter)
         }}>
         <View style={styles.letter}>
         <Text style={styles.letterText}>{letter}</Text>
         </View>
         </TouchableOpacity>
         );
         }
        
         _renderListBox(cityJson, rowId) {
         return (
         <TouchableOpacity key={'list_item_' + cityJson.id} style={styles.rowViewBox} onPress={() => {
         that._cityNameClick(cityJson)
         }}>
         <View style={styles.rowdataBox}>
         <Text style={styles.rowDataTextBox}>{cityJson.name}</Text>
         </View>
         </TouchableOpacity>
         );
         }
        
         _renderListRow(cityJson, rowId) {
         console.log('rowId===>' + rowId + ", cityJson====>" + JSON.stringify(cityJson));
         if (rowId === key_now || rowId === key_hot || rowId === key_last_visit) {
         return that._renderListBox(cityJson, rowId);
         }
        
         return (
         <TouchableOpacity key={'list_item_' + cityJson.id} style={styles.rowView} onPress={() => {
         that._cityNameClick(cityJson)
         }}>
         <View style={styles.rowdata}>
         <Text style={styles.rowdatatext}>{cityJson.name}</Text>
         </View>
         </TouchableOpacity>
         )
         }
        
         _renderListSectionHeader(sectionData, sectionID) {
         return (
         <View style={styles.sectionView}>
         <Text style={styles.sectionText}>
         {sectionData}
         </Text>
         </View>
         );
         }
        
         render() {
         return (
         <View style={styles.container}>
         <View style={styles.listContainner}>
         <ListView ref={listView => this._listView = listView}
         contentContainerStyle={styles.contentContainer} dataSource={this.state.dataSource}
         renderRow={this._renderListRow} renderSectionHeader={this._renderListSectionHeader}
         enableEmptySections={true} initialListSize={500}/>
         <View style={styles.letters}>
         {this.state.letters.map((letter, index) => this._renderRightLetters(letter, index))}
         </View>
         </View>
         <Toast ref="toast" position='top' positionValue={200} fadeInDuration={750} fadeOutDuration={1000}
         opacity={0.8}/>
         </View>
         )
         }
        }
        
        const styles = StyleSheet.create({
         container: {
         // paddingTop: 50,
         flex: 1,
         flexDirection: 'column',
         backgroundColor: '#F4F4F4',
         },
         listContainner: {
         height: Dimensions.get('window').height,
         marginBottom: 10
         },
         contentContainer: {
         flexDirection: 'row',
         width: width,
         backgroundColor: 'white',
         justifyContent: 'flex-start',
         flexWrap: 'wrap'
         },
         letters: {
         position: 'absolute',
         height: height,
         top: 0,
         bottom: 0,
         right: 10,
         backgroundColor: 'transparent',
         // justifyContent: 'flex-start',
         // alignItems: 'flex-start'
         alignItems: 'center',
         justifyContent: 'center'
         },
         letter: {
         height: height * 4 / 100,
         width: width * 4 / 50,
         justifyContent: 'center',
         alignItems: 'center'
         },
         letterText: {
         textAlign: 'center',
         fontSize: height * 1.1 / 50,
         color: '#e75404'
         },
         sectionView: {
         paddingTop: 5,
         paddingBottom: 5,
         height: 30,
         paddingLeft: 10,
         width: width,
         backgroundColor: '#F4F4F4'
         },
         sectionText: {
         color: '#e75404',
         fontWeight: 'bold'
         },
         rowView: {
         height: ROWHEIGHT,
         paddingLeft: 10,
         paddingRight: 10,
         borderBottomColor: '#F4F4F4',
         borderBottomWidth: 0.5
         },
         rowdata: {
         paddingTop: 10,
         paddingBottom: 2
         },
        
         rowdatatext: {
         color: 'gray',
         width: width
         },
        
         rowViewBox: {
         height: ROWHEIGHT_BOX,
         width: (width - 30) / 3,
         flexDirection: 'row',
         backgroundColor: '#ffffff'
         },
         rowdataBox: {
         borderWidth: 1,
         borderColor: '#DBDBDB',
         marginTop: 5,
         marginBottom: 5,
         paddingBottom: 2,
         marginLeft: 10,
         marginRight: 10,
         flex: 1,
         justifyContent: 'center',
         alignItems: 'center'
         },
         rowDataTextBox: {
         marginTop: 5,
         flex: 1,
         height: 20
         }
        
        });
         
        
        

        然后在頭部還需要實現一個搜索框。

        SearchBox.js

        'use strict';
        import React, {Component} from 'react';
        import {
         View,
         TextInput,
         StyleSheet,
         Platform,
        } from 'react-native';
        
        export default class SearchBox extends Component {
         constructor(props) {
         super(props);
         this.state = {
         value: ''
         };
        
         }
        
         onEndEditingKeyword(vv) {
         console.log(vv);
         }
        
         onChanegeTextKeyword(vv) {
         console.log('onChanegeTextKeyword', vv);
        
         this.setState({value: vv});
         this.props.onChanegeTextKeyword(vv);
         }
        
         render() {
         return (
         <View style={styles.container}>
         <View style={styles.inputBox}>
         <View style={styles.inputIcon}>
         </View>
         <TextInput ref="keyword" autoCapitalize="none" value={this.props.keyword}
         onChangeText={this.onChanegeTextKeyword.bind(this)} returnKeyType="search" maxLength={20}
         style={styles.inputText} underlineColorAndroid="transparent"
         placeholder={'輸入城市名或拼音查詢'}/>
         </View>
         </View>
         )
         }
        }
        
        const styles = StyleSheet.create({
         container: {
         marginTop: 5,
         marginBottom: 5,
         backgroundColor: '#ffffff',
         flexDirection: 'row',
         height: Platform.OS === 'ios'
         ? 35
         : 45,
         borderBottomWidth: StyleSheet.hairlineWidth,
         borderBottomColor: '#cdcdcd',
         paddingBottom: 5
         },
         inputBox: {
         height: Platform.OS === 'ios'
         ? 30
         : 40,
         marginLeft: 5,
         marginRight: 5,
         flex: 1,
         flexDirection: 'row',
         backgroundColor: '#E6E7E8'
         },
         inputIcon: {
         margin: Platform.OS === 'ios'
         ? 5
         : 10
         },
         inputText: {
         alignSelf: 'flex-end',
         marginTop: Platform.OS === 'ios'
         ? 0
         : 0,
         flex: 1,
         height: Platform.OS === 'ios'
         ? 30
         : 40,
         marginLeft: 2,
         marginRight: 5,
         fontSize: 12,
         lineHeight: 30,
         textAlignVertical: 'bottom',
         textDecorationLine: 'none'
         }
        });
        
        

        最終效果:

        這里寫圖片描述 

        這里寫圖片描述 

        最后是界面的繪制,這里就不多說了,大家可以下載源碼自行查看。源碼地址:react-native-city_jb51.rar

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        react native帶索引的城市列表組件的實例代碼

        react native帶索引的城市列表組件的實例代碼:城市列表選擇是很多app共有的功能,比如典型的美圖app。那么對于React Native怎么實現呢? 要實現上面的效果,首先需要對界面的組成簡單分析,界面的數據主要由當前城市,歷史訪問城市和熱門城市組成,所以我們在提供Json數據的時候就需要將數據分為至少3
        推薦度:
        標簽: 城市 re 的代碼
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产免费av一区二区三区| 情侣视频精品免费的国产| 最近免费中文字幕MV在线视频3| 18禁在线无遮挡免费观看网站| 国产一级高清视频免费看| 亚洲国产精品无码久久九九大片| 成人免费的性色视频| 婷婷久久久亚洲欧洲日产国码AV | 亚洲色一区二区三区四区| 在线精品自拍亚洲第一区| 黄+色+性+人免费| 亚洲色欲或者高潮影院| 久久精品毛片免费观看| 国产大片线上免费看| 亚洲国产精品网站在线播放 | 久久精品国产亚洲Aⅴ香蕉| 国产亚洲精品美女久久久久| 国产美女无遮挡免费视频网站| 亚洲高清一区二区三区电影| 成全视频免费高清| 亚洲精品无码人妻无码 | 亚洲精品国产va在线观看蜜芽| 老司机亚洲精品影院在线观看 | 最近中文字幕国语免费完整| 久久久久亚洲Av片无码v| 狼群影院在线观看免费观看直播| 亚洲美女激情视频| 女人毛片a级大学毛片免费| 亚洲国产另类久久久精品| 亚洲精品久久无码| 全部免费a级毛片| 久久一区二区免费播放| 久久久久亚洲AV成人无码网站| 久久99热精品免费观看牛牛| 免费jlzzjlzz在线播放视频| 新最免费影视大全在线播放| 亚洲国产精品无码一线岛国| 在线永久看片免费的视频| 色欲色欲天天天www亚洲伊| 国产成人精品免费午夜app| 亚洲综合一区二区三区四区五区|