Vue組件-極簡的地點選擇器

一、媒介

本文用Vue完成一個極簡的所在挑選器,我們接下來帶人人完成這個。固然个中也有一些值得進修與注重的處所。話不多說,我們先上demo圖。因為每個人的須要不一樣,我這邊就不在完成更多的功用,所以留有更大的空間供人人增編削。

《Vue組件-極簡的地點選擇器》

GitHub地點Vue-location_Select

二、須要進修的處所

(1)數據更新Vue沒法監控

起首要說一下的就是這個點,我們在Vue中有個優點就是能夠不必操縱dom,直接操縱數據。然則這實在也有Vue沒法監控的數據。如數組和對象。固然這裏只是指一小部份操縱罷了,大部份操縱都是沒缺點的。接下來說說哪些數據操縱Vue沒法監控

1、數組

因為 JavaScript 的限定,Vue 不能檢測以下更改的數組

  • 當你應用索引直接設置一個項時,比方:vm.items[indexOfItem] = newValue
  • 當你修正數組的長度時,比方:vm.items.length = newLength

意義就是下面的狀況都不能監控到,因而如許轉變數組是不會革新視圖的

var vm = new Vue({
  data: {
    items: ['a', 'b', 'c']
  }
})
vm.items[1] = 'x' // 不是相應性的,
vm.items.length = 2 // 不是相應性的

實際上要處理這兩者的要領也簡樸:

//處理第一類題目

vm.$set(vm.items, indexOfItem, newValue)

//為了處理第二類題目,你能夠運用 splice:

vm.items.splice(newLength)

如許就能夠使得Vue監控到數組操縱的變化。固然另有以下的操縱Vue也能夠監控到的

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

2.對象

因為 JavaScript 的限定,Vue不能檢測對象屬性的增加或刪除! 這個是重點,假如動態的增加對象屬性的話,那末請注重你增加對象屬性的體式格局是不是為$set,不然的話視圖很有可能不更新。

var vm = new Vue({
  data: {
    userProfile: {
      name: 'Anika'
    }
  }
})

vm.userProfile.age = 27;    //看着沒題目,實際上Vue沒法監控

因而處理辦法也是老辦法,用
vm.$set(vm.userProfile, 'age', 27);

運用Object.assign()增加多個屬性也要注重一下用法

//毛病
Object.assign(vm.userProfile, {
  age: 27,
  favoriteColor: 'Vue Green'
})

//準確
vm.userProfile = Object.assign({}, vm.userProfile, {
  age: 27,
  favoriteColor: 'Vue Green'
})

(2)V-for的用法

1.遍曆數組

這裏直接擼碼,一看就懂

v-for = "(val,index) in arr" 
//獲得的就是值和數組下標

//習慣性用法
<div v-for="(val,index) in arr" :key="index">
</div>

2.遍歷對象

v-for = "(val,key,index) in object" 
//獲得的就是鍵值對另有下標

//習慣性用法
<div v-for = "(val,key,index) in object" :key="index">
</div>

CSS3款式

固然這裏就不多說了。這個直接給出傳送門:css3用scale完成下劃線動畫

完成極簡所在挑選

這裏就放重要的代碼吧,雖然總代碼也不多

  • html部份
<div class="siteBox" id="siteBox"  v-if="isShow">
    <header>
        <ul class="classify">
            <li :class="{active:isClassify===key}" v-for="(arr,key,index) in this.locationName" :key="index" @click="isClassify=key">
                <a class="classify-a" href="#">{{key}}</a>
            </li>
        </ul>
    </header>
    <main class="site-name">
        <dl v-for="value of isClassify">
            <dt>{{value}}</dt>
            <div class="list-dd">
                <dd v-for="(val,index) in locationName[isClassify][value]" :key="index" @click="site=val;isShow=false">
                    <a class="list-a" href="#">{{val}}</a>
                </dd>
            </div>
        </dl>
    </main>
</div>
  • js
methods:{
    getData(){
        let xhr = new XMLHttpRequest();                     //原生ajax
        xhr.open('get','http://127.0.0.1:3001/read');       //要求mock
        xhr.send();
        xhr.onreadystatechange = ()=> {
            if (xhr.readyState === 4 && xhr.status === 200) {
                let locationN = JSON.parse(xhr.responseText);       //獵取數據,所在json
                for (let key of Object.keys(locationN)) {           //遍歷掏出數據,獲得鍵值
                    for(let key2 of Object.keys(this.locationName)){        //遍歷data中locationName,為了分類
                        let pattern = new RegExp("["+key2.toString()+"]");      
                        if(pattern.test(key)){                              //正則婚配,假如找到就進入對應的分類對象中
                            
                            //推斷該類中是不是存在該字母這地名鳩合,如A,B,C
                            if (Array.isArray(this.locationName[key2][key.charAt(0)])) {
                                //假如存在則直接推入地名
                                this.locationName[key2][key.charAt(0)].push(locationN[key]);
                                
                                //沒有則先建立再推入地名
                            } else {
                                this.$set(this.locationName[key2],key.charAt(0),[]);
                                this.locationName[key2][key.charAt(0)].push(locationN[key]);
                            }
                            break;
                        }
                    }
                }
            }
        }
    },
}

后話

到這裏,我們就已完成了該Vue組件,假如想細看代碼或許運用的話,請點擊Vue-location_Select,固然假如喜好就不要慳吝你的star哦!

    原文作者:bb7bb
    原文地址: https://segmentfault.com/a/1190000015080084
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞