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

Class in front-end JavaScript

Table of contents 1. Class 1.1 constructor() 1.2 ...

In-depth analysis of MySQL query interception

Table of contents 1. Query Optimization 1. MySQL ...

Singleton design pattern in JavaScript

Table of contents 1. What is a design pattern? 2....

Summary of using the exclamation mark command (!) in Linux

Preface Recently, our company has configured mbp,...

CSS implementation code for drawing triangles (border method)

1. Implement a simple triangle Using the border i...

Analyze MySQL replication and tuning principles and methods

1. Introduction MySQL comes with a replication so...

How to solve the DOS window garbled problem in MySQL

The garbled code problem is as follows: The reaso...

Mysql varchar type sum example operation

Some friends, when learning about databases, acci...

How to import Tomcat source code into idea

Table of contents 1. Download the tomcat code 2. ...

Solution to the problem of repeated triggering of functions in Vue project watch

Table of contents Problem description: Solution 1...

WeChat applet implements login interface

The login interface of WeChat applet is implement...

Introduction and usage of Angular pipeline PIPE

Preface PIPE, translated as pipeline. Angular pip...

Setting up shadowsocks+polipo global proxy in Linux environment

1. Install shadowsocks sudo apt-get install pytho...

Example of compiling LNMP in Docker container

Table of contents 1. Project Description 2. Nginx...