<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
        主站蜘蛛池模板: 欧美在线看片A免费观看| 2015日韩永久免费视频播放 | 亚洲AV无码一区二区三区久久精品 | 中文字幕永久免费| 国内精品99亚洲免费高清| 国产精品免费久久久久影院| 亚洲日本中文字幕天堂网| 一级做a爱片特黄在线观看免费看 一级做a爱过程免费视 | 亚洲国产综合专区在线电影| 91精品国产免费网站| 亚洲区精品久久一区二区三区| 免费v片在线观看视频网站| 亚洲国产最大av| 日韩一区二区三区免费体验| 黄色一级免费网站| 亚洲精品中文字幕乱码三区| 无码国产精品一区二区免费vr| 亚洲成a人片在线观| 成人黄页网站免费观看大全| 亚洲国产成人AV网站| 91麻豆国产自产在线观看亚洲| 无码国产精品一区二区免费16| 亚洲国产成人久久77| 四虎永久免费观看| a级特黄毛片免费观看| 亚洲国产成人资源在线软件| 国产免费变态视频网址网站| 在线视频网址免费播放| 亚洲三级中文字幕| 男人的天堂亚洲一区二区三区| 暖暖免费中文在线日本| 亚洲AV无码精品色午夜果冻不卡| 成人黄色免费网站| 国产亚洲福利一区二区免费看| 亚洲成av人影院| 午夜免费福利影院| a在线观看免费网址大全| 亚洲精品亚洲人成在线播放| 全黄a免费一级毛片人人爱| 99视频免费播放| 综合一区自拍亚洲综合图区|