dandanyajin
今天更新博客了吗?
<template>
  <ion-page class="container" v-theme="theme">
    <app-header :isBack="false">
        <template v-slot:start>
            <span @click="goBack">取消</span>
        </template>
        选择国家/地区
    </app-header>
    <ion-content :fullscreen="true">
      <ion-searchbar placeholder="搜索"></ion-searchbar>
      <div class="scroll-box" id="scrollbox">
        <ion-list v-for="item in Object.keys(countriesRegionsList)" :key="item" :id="item">
          <ion-list-header :id="item"> {{item}} </ion-list-header>
          <ion-item v-for="itemContent in countriesRegionsList[item]" :key="itemContent.countryCode">{{itemContent.cname}}</ion-item>
        </ion-list>

        <div class="select-city-type-line" :class="{'select-city-type-line-true':_typeSelect}" @touchstart="touchstart($event)"
          @touchmove="touchmove($event)" @touchend="touchend($event)" >
          <!-- v-if="CityList!=null&& CityList.length>0" -->
          <p
            class="letter" 
            v-for="item in countriesRegionsNavList" 
            :key="item" 
            @click="selectType(item)"
          >
            {{item}}
          </p>
        </div>
      </div>
      <div class="select-city-type-circle" :style="{'display':_showModal ? 'flex' : 'none' }">
        {{_currentIndicator}}
      </div>
    </ion-content>
  </ion-page>
</template>

<script setup>
  import {reactive,ref,onMounted,getCurrentInstance } from 'vue';
  import{useRouter} from "vue-router"
  import AppHeader from "@/components/Base/AppHeader";

  const router = useRouter()

    // 取消
  const goBack = ()=>{
    router.go(-1)
  }

  onMounted(() => {
    // 搜索国家地区
    const searchbar = document.querySelector('ion-searchbar');
    const items = Array.from(document.querySelector('ion-list').children);
    const handleInput = (event)=> {
      const query = event.target.value.toLowerCase();
      requestAnimationFrame(() => {
          items.forEach((item) => {
          const shouldShow = item.textContent.toLowerCase().indexOf(query) > -1;
          item.style.display = shouldShow ? 'block' : 'none';
          });
      });
    }
    searchbar.addEventListener('input', handleInput);
  });

  // 是否选中右侧字母表
  const _typeSelect = ref(false)

  // 在中间显示的字母
  const _currentIndicator = ref('');

  // 位置
  const _navOffsetX = ref(0)

  // 选中字母是否在中间显示
  const _showModal = ref(false)

  // 延时器
  const _indicatorTime = ref()

  // 
  // const scorll = ref()

// 点击右侧字母导航
  const selectType = (type)=> {
    _currentIndicator.value = type;
    _showModal.value = true;
    if (document.getElementById(type) != null) {
      var el = document.getElementById(type);
      // if (this.Scorll != null) {
      //     this.Scorll.setAttribute("style", "overflow-y:scroll");
      // }
      el.scrollIntoView('true');
      _indicatorTime.value = setTimeout(() => {
          _showModal.value = false;
          _currentIndicator.value = '';
      }, 500);
    }
  }

  // 右侧字母表触摸开始
  const touchstart = (event)=> {
    _navOffsetX.value = event.changedTouches[0].clientX;
    scrollList(event.changedTouches[0].clientY);
    _typeSelect.value = true;
    // if (this.Scorll != null) {
    //     this.Scorll.setAttribute("style", "overflow-y:hidden");
    // }
  }

  // 右侧字母表触摸移动
  const touchmove = (event)=> {
    event.preventDefault();
    scrollList(event.changedTouches[0].clientY);
  }

  // 右侧字母表触摸结束
  const touchend = (event)=> {
    _typeSelect.value = false;
    // if (this.Scorll != null) {
    //     this.Scorll.setAttribute("style", "overflow-y:scroll");
    // }
    _indicatorTime.value = setTimeout(() => {
        _showModal.value = false;
        _currentIndicator.value = '';
    }, 500);
  }
  
  //
  const scrollList = (y)=> {
    const currentItem = document.elementFromPoint(_navOffsetX.value, y);
    if (!currentItem || !currentItem.classList.contains('letter')) {
        return;
    }
    _currentIndicator.value = currentItem['innerText'];
    selectType(_currentIndicator.value);
  }
  
  // 请求国家地区数据
  const countriesRegionsList = ref({A:[{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},{cname:'SDFSF'},],B:[],C:[]})
  const countriesRegionsNavList = ref(['A','B','C'])
  const {proxy,appContext} = getCurrentInstance();
  const getCountriesRegions = ()=>{
    proxy.$http({
      method: "get",
      url:"/ms/serviceCountry/findCountryList",
    }).then((res)=>{
      if(res.code == 200){
        countriesRegionsList.value = res.data
        countriesRegionsNavList.value = Object.keys(res.data)
        countriesRegionsNavList.value.unshift('#')
      }
    })
  }
  // getCountriesRegions()
  
</script>

<style lang="scss" scoped>
  p{
    margin: 0;
  }
  .select-city-type-line{
    position: fixed;
    z-index: 999;
    margin-top: 9rem;
    width: 40px;
    top: 0;
    right: 0;
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: center;
    font-weight: 500;
    text-align: center;
    color: #999;
    padding: 10px 0;
  }
  .select-city-type-line-true{
    background: rgba(211, 211, 211, 0.6);
    color: white;
    border-radius: 5px 0px 0px 5px;
  }
  .select-city-type-line .letter{
    font-size: 15px;
  }
  .select-city-type-line .letter.selected{
    color: #FF5512;
  }
  .select-city-type-circle{
    position: absolute;
    top: 40%;
    left: 50%;
    -webkit-transform: translate(-50%, -50%);
    background: rgba(211, 211, 211, 0.6);;
    width: 80px;
    height: 80px;
    border-radius: 100%;
    color: white;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 23px;
    font-weight: 500;
  }

  .container {
    .scroll-box{
      height: 811px;
      overflow: scroll;
    }
    ion-searchbar{
      --border-radius: 8px;
    }
    ion-list-header{
      font-size: 12px;
    }
    ion-item{
      font-size: 15px;
    }
    .select-city-type-line{
      width: 15px;
      height: 510px;
      border-radius: 4px;
      margin-right: 14px;
      .letter{
        font-size: 12px;
      }
    }
  }

  .container[data-theme="dark"] {
    ion-searchbar{
      --background: #141414;
      color: #fff;
    }
    ion-list{
      --ion-background-color:rgba(0,0,0,0)
    }
    ion-list-header{
      --color:#fff;
    }
    ion-item{
      color: #fff;
    }
    ion-item::part(native){
      --border-color:#222;
    }
    .select-city-type-line{
      background: rgba(255,255,255,0.2);
      color: #fff;
    }
  }

</style>

 

posted on 2022-09-16 17:37  dandanyajin  阅读(47)  评论(0编辑  收藏  举报