You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
4.6 KiB
Vue
179 lines
4.6 KiB
Vue
<template>
|
|
<view class="g_p_16 container g_pt_4" style="background-color: #f5f5f5; min-height: 100vh; padding-bottom: 180px;">
|
|
|
|
<scroll-view class="cities-scroll" scroll-with-animation="true" :scroll-into-view="az" scroll-y ref="scrollViewRef">
|
|
<view class="headTxt">当前城市</view>
|
|
<view @click='selectQuanGuo' :class="{ itemCity: true, active: selectedCity === '全国' }">全国</view>
|
|
|
|
<view class="cities-list">
|
|
<block v-for="group in cities">
|
|
<view class="headTxt" :id="`letter-${group.name[0] == '热' ? 're' : group.name[0] }`">{{ group.name }}</view>
|
|
<block v-for="city in group.list">
|
|
<view @click='selectCity(city)' :class="{ itemCity: true, active: selectedCity === city.shortName }">{{ city.shortName }}</view>
|
|
</block>
|
|
</block>
|
|
</view>
|
|
</scroll-view>
|
|
|
|
<!-- 添加字母索引 -->
|
|
<view class="index-list">
|
|
<block v-for="(letter, index) in letters">
|
|
<!-- , activeIndex: currentIndex === index -->
|
|
<view :class="{ indexItem: true}" @click="scrollToLetter(letter)">
|
|
{{ letter }}
|
|
</view>
|
|
</block>
|
|
</view>
|
|
|
|
<g-panel-fixed>
|
|
<view class="g_flex_row_center">
|
|
<g-button btnText="返回" size="small" @clickBtn='back'></g-button>
|
|
<g-button btnText="确定" type='primary' class="g_ml_24" size="small" @clickBtn='setCity'></g-button>
|
|
</view>
|
|
</g-panel-fixed>
|
|
</view>
|
|
</template>
|
|
<script>
|
|
import { cityList } from '../../utils/city.js';
|
|
|
|
export default {
|
|
data() {
|
|
return {
|
|
cities: [],
|
|
cdnBaseImg: this.G.store().cdnBaseImg,
|
|
selectedCity: '全国',
|
|
currentIndex: 0,
|
|
letters: [],
|
|
az:'',
|
|
};
|
|
},
|
|
onLoad() {
|
|
this.initializeCities();
|
|
this.calculateLetters();
|
|
const cachedSelectedCity = uni.getStorageSync('selectedCity');
|
|
if (cachedSelectedCity) {
|
|
this.selectedCity = cachedSelectedCity;
|
|
} else {
|
|
this.selectedCity = '全国';
|
|
}
|
|
},
|
|
methods: {
|
|
setCity() {
|
|
uni.setStorageSync('selectedCity', this.selectedCity);
|
|
console.log(`城市 ${this.selectedCity} 已保存到缓存`);
|
|
uni.navigateBack({ delta: 1 });
|
|
},
|
|
back() {
|
|
uni.navigateBack({ delta: 1 });
|
|
},
|
|
selectQuanGuo() {
|
|
this.selectedCity = '全国';
|
|
console.log('全国被选中');
|
|
},
|
|
selectCity(city) {
|
|
this.selectedCity = city.shortName;
|
|
console.log(`城市 ${city.shortName} 被选中`);
|
|
},
|
|
initializeCities() {
|
|
const originalCities = cityList;
|
|
// const hotCities = originalCities.find(group => group.name === '热门城市');
|
|
|
|
// if (hotCities) {
|
|
// hotCities.name = '热';
|
|
// this.cities = originalCities.filter(group => group.name !== '热门城市');
|
|
// this.cities.unshift(hotCities);
|
|
// } else {
|
|
// this.cities = originalCities;
|
|
// }
|
|
this.cities = originalCities;
|
|
},
|
|
calculateLetters() {
|
|
this.letters = [];
|
|
this.cities.forEach(group => {
|
|
const firstLetter = group.name.charAt(0).toUpperCase();
|
|
if (!this.letters.includes(firstLetter)) {
|
|
this.letters.push(firstLetter);
|
|
}
|
|
});
|
|
},
|
|
scrollToLetter(letter) {
|
|
var that = this;
|
|
if(letter == '热'){
|
|
letter = 're'
|
|
}
|
|
const id = `letter-${letter}`;
|
|
console.log(id);
|
|
this.az = id;
|
|
// console.log(that.$refs.scrollViewRef);
|
|
// this.$nextTick(() => {
|
|
// this.$refs.scrollViewRef.scrollIntoView(id, 300);
|
|
// });
|
|
},
|
|
}
|
|
};
|
|
</script>
|
|
<style lang="scss">
|
|
.container {
|
|
.itemCity {
|
|
width: calc(33.33% - 10px);
|
|
float: left;
|
|
margin-right: 10px;
|
|
background: #fff;
|
|
border-radius: 16px;
|
|
font-size: 16px;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
padding: 8px 0;
|
|
color: #1d1d1d;
|
|
margin-bottom: 10px;
|
|
line-height: 20px;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
|
|
&.active {
|
|
background: #3578f6;
|
|
color: #ffffff;
|
|
}
|
|
}
|
|
|
|
.headTxt {
|
|
font-size: 18px;
|
|
font-weight: 400;
|
|
color: #999999;
|
|
line-height: 25px;
|
|
margin-top: 10px;
|
|
margin-left: 16px;
|
|
margin-bottom: 10px;
|
|
clear: both;
|
|
}
|
|
|
|
.cities-scroll {
|
|
height: calc(100vh - 100px);
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.index-list {
|
|
position: fixed;
|
|
right: 10px;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
background-color: #f5f5f5;
|
|
|
|
.indexItem {
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
border-radius: 50%;
|
|
margin: 2px;
|
|
&.activeIndex {
|
|
background: #3578f6;
|
|
color: #ffffff;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style> |