| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | 
							- <template>
 
- 	<view>
 
- 		<scroll-view class="scroll-list"
 
- 		:scroll-top="1"
 
- 		scroll-y="true"
 
- 		:scroll-with-animation="scrollAnimationOFF" 
 
- 		:scroll-into-view="scrollViewId" 
 
- 		:style="{height:winHeight + 'px'}" 
 
- 		@scroll="handleScroll">
 
- 			<view class="phone-list">
 
- 				<view class="list-item" 
 
- 				v-for="(item, key) of phones" 
 
- 				:key="key" 
 
- 				:id="key">
 
- 					<view class="list-item-title">{{key}}</view>
 
- 					<view class="list-item-phone" 
 
- 					@click="handleClick"
 
- 					hover-class="commonly-hover" 
 
- 					:hover-start-time="20" 
 
- 					:hover-stay-time="70" 
 
- 					v-for="innerItem in item"
 
- 					:key="innerItem.id"
 
- 					:data-name="innerItem.name"
 
- 					:data-id="innerItem.id"
 
- 					:data-phoneNumber="innerItem.phoneNumber"
 
- 					>
 
- 					{{innerItem.name}}
 
- 					</view>
 
- 				</view>
 
- 			</view>
 
- 		</scroll-view>
 
- 	</view>
 
- </template>
 
- <script>
 
- 	export default {
 
- 		name:"phone-list",
 
- 		props:{
 
- 			phones:Object,
 
- 			letter:String,
 
- 			scrollAnimationOFF:Boolean
 
- 		},
 
- 		data () {
 
- 			return {
 
- 				winHeight:0,
 
- 				scrollTop:0,
 
- 				letterDetails:[],
 
- 				timer:null
 
- 			}
 
- 		},
 
- 		computed:{
 
- 			scrollViewId () {
 
- 				return this.letter
 
- 			}
 
- 		},
 
- 		mounted(){
 
- 			// #ifndef APP-PLUS
 
- 			this.winHeight = uni.getSystemInfoSync().windowHeight - 49.50
 
- 			//#endif
 
- 			
 
- 			//#ifdef APP-PLUS
 
- 			this.winHeight = uni.getSystemInfoSync().windowHeight - 100
 
- 			//#endif
 
- 		},
 
- 		methods:{
 
- 			handleClick (e) {
 
- 				this.$emit('handleClick',e.target.dataset)
 
- 			},
 
- 			handleScroll (e){
 
- 				if(this.letterDetails.length === 0){
 
- 					let view = uni.createSelectorQuery().selectAll('.list-item')
 
- 					view.boundingClientRect(data=>{
 
- 						let top = data[0].top
 
- 						data.forEach((item,index)=>{
 
- 							item.top = item.top - top
 
- 							item.bottom  = item.bottom - top
 
- 							this.letterDetails.push({
 
- 								id:item.id,
 
- 								top:item.top,
 
- 								bottom:item.bottom
 
- 							})
 
- 						})
 
- 					}).exec()	
 
- 				}
 
- 				
 
- 				const scrollTop = e.detail.scrollTop
 
- 				this.letterDetails.some((item,index)=>{
 
- 					if(scrollTop>=item.top && scrollTop <= item.bottom - 5){
 
- 						this.$emit('change',item.id)
 
- 						this.$emit('reset',true)
 
- 						return true
 
- 					}
 
- 				})
 
- 			}
 
- 		}
 
- 			
 
- 	}
 
- </script>
 
- <style>
 
- 	
 
- 	.commonly-hover{
 
- 		background-color: #eee;
 
- 	}
 
- 	
 
- 	.scroll-list{
 
- 		flex: 1;
 
- 		height: 100vh;
 
- 		overflow-y: hidden;
 
- 	}
 
- 	.phone-list{
 
- 		display: flex;
 
- 		background-color: #fff;
 
- 		flex-direction:column;
 
- 		position:relative;
 
- 		width: 100%;
 
- 	}
 
- 	
 
- 	.list-item {
 
- 		width: 100%;
 
- 		display: flex;
 
- 		align-items: center;
 
- 		flex-wrap:wrap;
 
- 		height: 92upx;
 
- 		background-color: #fff;
 
- 		height: 100%;
 
- 		
 
- 	}
 
- 	
 
- 	.list-item >.list-item-phone{
 
- 		font-weight: normal;
 
- 	}
 
- 	
 
- 	.list-item-title{
 
- 		background-color: #eee;
 
- 	}
 
- 	
 
- 	.list-item-title,.list-item-phone{
 
- 		width: 100%;
 
- 		height: 92upx;
 
- 		line-height: 92upx;
 
- 		font-size: 32upx;
 
- 		font-weight: bold;
 
- 		padding: 0 20upx;
 
- 		border-bottom: 1px solid #e5e5e5;
 
- 	}
 
- 	
 
- 	
 
- </style>
 
 
  |