JS implements city list effect based on VUE component

JS implements city list effect based on VUE component

This article example shares the specific code for implementing the city list effect based on the VUE component for your reference. The specific content is as follows

  • The basic idea is to cache the city list data locally
  • Then use JS on the page to implement instant fuzzy query and initial letter positioning query, etc.
  • In order to protect the project, some codes were deleted

Effect

accomplish

H5:

<template>
    <div id="city">
        <div class="search-city-back">
            <div class="search-city">
                <img src="../assets/img/Shop/search.png">
                <input type="text" placeholder="Please enter the city name" v-model="citySearch">
                <a @click="citySearch=''" href="javascript:;" class="img-del" v-show="citySearch"></a>
            </div>
        </div>
        <div class="city-content">
            <div id="showCityContent"></div>
            <div class="letter-item" v-if="showCity&&sourcePageType===1">
                <div></div>
                <div @click="cityChoose('*','全国')">全国</div>
            </div>
            <div v-for="(val,key) in showCity" class="letter-item">
                <div><a :id="key">{{key}}</a></div>
                <div v-for="i in val">
                    <div :class="{'city-hide': i.Code==='*'&&sourcePageType===3}" class="item-buttom"
                         @click="cityChoose(i.Code,i.Name)">{{i.Name}}


                    </div>
                </div>
            </div>
        </div>
        <aside class="letter-aside" :style="{color: config.letterColor}" v-if="showCity">
            <ul>
                <!--<li>Positioning</li>-->
                <!--<li>Popular</li>-->
                <li v-for="(val,key) in showCity" @click="naver(key)">{{key}} </li>
            </ul>
        </aside>
        <div id="tip">{{tipString}}</div>
    </div>
</template>

JS:

<script>
    import {GetCityList} from 'service'
    import {setTitle, setSessionStore, getSessionStore} from '../utils/method'

    export default{
        name: 'CityList',
        data () {
            return {
                citysAllSSKey: 'XMall-Component-AllCityList', // Session cache of all cities cities: [],
                showCity: null,
                tipString: null,
                letter: null,
                citySearch: '',
                sourcePageType: 1
            }
        },
        props: {
            config: {
                type: Object,
                default: () => {
                    return {
                        letterColor: '#f44f0f',
                    }
                }
            },
            pageType: {
                type: Number,
                default: 1 // 1: nationwide city list},
            shopId: {
                type: String, 
                default: null
            }
        },
        watch:
            citySearch: function () {
                this.cityFilter()
            }
        },
        created: function () {
            setTitle('Select a city')
        },
        mounted: function () {
            this.into()
        },
        methods: {
            into(){
                this.sourcePageType = parseInt(this.$props.pageType)
                if (this.sourcePageType === 1) {
                    this.cities = JSON.parse(getSessionStore(this.citysAllSSKey))
                    if (this.cities) {
                        this.showCity = this.cities
                    } else {
                        this.getAllCityList()
                    }
                }
            },
            // Get the national city list getAllCityList: function () {
                // Display loading
                this.$vux.loading.show({text: 'Loading'})
                GetCityList(
                    {
                        keyword: ''
                    },
                    (res) => {
                        this.citys = res
                        this.showCity = res
                        //Hide loading
                        this.$vux.loading.hide()
                        setSessionStore(this.citysAllSSKey, res)
                    }, (err) => {
                        console.log(err)
                        //Hide loading
                        this.$vux.loading.hide()
                    })
            },
            // Position the side letters and scroll to the corresponding position naver: function (letter) {
                this.tipString = letter
                let obj = document.getElementById(letter)
                let tip = document.getElementById('tip')
                tip.setAttribute('class', 'tipAppear')
                setTimeout(function () {
                    tip.removeAttribute('class')
                }, 500)
                let oPos = obj.offsetTop
                return window.scrollTo(0, oPos - 36)
            },
            // City search cityFilter: function () {
                let nodata = true
                if (this.citySearch) {
                    // Traverse the object and select the value that meets the conditions let showCityNew = {}
                    for (let key in this.cities) {
                        let arrayNew = []
                        for (let value of this.cities[key]) {
                            if (value.Name.indexOf(this.citySearch) > -1) {
                                arrayNew.push(value)
                            }
                        }
                        if (arrayNew.length > 0) {
                            showCityNew[key] = arrayNew
                            nodata = false
                        }
                    }
                    this.showCity = showCityNew
                } else {
                    this.showCity = this.cities
                    nodata = false
                }
                if (nodata) {
                    this.showCity = null
                    let _showCityContent = document.getElementById('showCityContent')
                    _showCityContent.innerText = 'No results found'
                    _showCityContent.setAttribute('class', 'tipShow')
                } else {
                    document.getElementById('showCityContent').innerText = ''
                }
            },
            //City selection cityChoose: function (code, name) {
                this.$emit('chooseCity', {Code: code, Name: name})
            }
        }
    }
</script>

CSS:

<style lang="scss" scoped>
  #city {
    position: relative;
    background: #f6f4f5;
  }
  #city{
    .city-content {
      padding: 60px 0 0 0;
    }

    .letter-item{
      background-color: #fff;
    }

    .letter-item > div:first-child {
      color: #999;
      background: #f6f4f5;
      margin-right: 30px;
    }

    .letter-item > div {
      color: #333;
      line-height: 45px;
      font-size: 14px;
      padding: 0 30px 0 15px;
      background-color: #fff;
    }

    .letter-item .item-buttom {
      border-bottom: 1px solid #e6e6e6;
    }

    .letter-aside {
      position: fixed;
      right: 5px;
      top: 5.3rem;
    }

    .letter-aside ul {
      list-style: none;
      line-height: 1.4em;
      font-size: 14px;
      text-align: center;
    }

    #tip {
      position: fixed;
      left: 0;
      right: 0;
      top: 0;
      bottom: 0;
      margin: auto;
      border: 1px solid #333333;
      width: 100px;
      height: 100px;
      z-index: 10;
      text-align: center;
      line-height: 100px;
      font-size: 50px;
      opacity: 0;
    }

    .tipAppear {
      animation: appearTip 1 linear 0.5s;
    }

    @-webkit-keyframes appearTip {
      0% {
        opacity: 1;
      }
      80% {
        opacity: 0.5;
      }
      100% {
        opacity: 0;
      }
    }

    @keyframes appearTip {
      0% {
        opacity: 1;
      }
      80% {
        opacity: 0.5;
      }
      100% {
        opacity: 0;
      }
    }

    .search-city-back {
      width: 100%;
      position: fixed;
      background-color: #f6f4f5;
      max-width: 414px;
    }

    .search-city {
      height: 30px;
      line-height: 30px;
      padding: 0 15px;
      border-radius: 14px;
      margin: 12px 15px;
      background-color: #ffffff;
    }

    .search-city img {
      height: 18px;
      width: 18px;
    }

    .search-city input {
      width: 80%;
      margin-left: 5px;
      line-height: 24px;
      border-radius: 5px;
      outline: none;
      font-size: 15px;
    }

    .tipShow {
      text-align: center;
      line-height: 60px;
      font-size: 16px;
      color: #bbbbbb;
    }

    .city-hide {
      display: none;
    }

    .img-del {
      width: 16px;
      height: 16px;
      position: absolute;
      top: 19px;
      right: 30px;
      background-color: rgba(0, 0, 0, .2);
      border-radius: 8px;
    }

    .img-del::before, .img-del::after {
      content: ' ';
      width: 0;
      height: 50%;
      position: absolute;
      top: 4px;
      right: 7px;
      border-right: 1px solid #fff;
    }

    .img-del::before {
      transform: rotate(45deg);
    }

    .img-del::after {
      transform: rotate(-45deg);
    }
  }

</style>

The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM.

You may also be interested in:
  • Vue implements city list selection function
  • Native js to implement HTML mobile city list index selection city
  • JS implements navigation city list and input search function
  • JS implements mobile terminal to search city list by first letter with source code download

<<:  How to use regular expressions to automatically match wildcard domain names in nginx

>>:  Mybatis statistics of the execution time of each SQL statement

Recommend

js canvas implements verification code and obtains verification code function

This article example shares the specific code of ...

In-depth understanding of the implementation principle of require loader

Preface We often say that node is not a new progr...

Tomcat's class loading mechanism process and source code analysis

Table of contents Preface 1. Tomcat class loader ...

Implementing Priority Queue in JavaScript

Table of contents 1. Introduction to priority que...

Implementation of webpack code fragmentation

Table of contents background CommonsChunkPlugin s...

js to achieve simple front-end paging effect

Some projects have relatively simple business, bu...

Tutorial on importing and exporting Docker containers

background The popularity of Docker is closely re...

Convert XHTML CSS pages to printer pages

In the past, creating a printer-friendly version ...

Detailed tutorial on installing MySQL 8.0.19 in zip version on win10

Table of contents 1. After downloading, unzip it ...

MySQL Series 14 MySQL High Availability Implementation

1. MHA ​By monitoring the master node, automatic ...

HTML Tutorial: Collection of commonly used HTML tags (5)

These introduced HTML tags do not necessarily ful...

MySQL time type selection

Table of contents DATETIME TIMESTAMP How to choos...