要求:
点击右边索引栏时,会自动跳转到对应的索引位置
大体解决方案:
利用vantUI框架引入indexBar索引栏
利用axios拿到后台城市数据,定义两个数据,一个为右边索引栏的字母数组(大写),一个为索引和城市的对象数组
先将右侧索引栏字母定义出来,遍历数据的拼音,取出首字母,排序,转大写
再定义第二个数组,做一个双for循环,先循环索引的字母,将字母以对象的形式插入到空数组中,再循环数据中拼音的首字母大写,若找出数据中的首字母大写与索引的字母一样的话就进行插入,以对象的形式插入到刚刚的数组中,最后用v-for遍历将数据渲染到桌面上
详细城市渲染步骤:
<template
>
<div
>
<!-- 循环右侧索引栏字母
-->
<van
-index
-bar
:index
-list
="indexList">
<!-- 建立一个空div进行循环,给索引和城市添加数据,渲染页面
-->
<div v
-for="(item,index) in cityIndex" :key
="index">
<van
-index
-anchor
:index
="item.letter" />
<van
-cell
:title
="item.name" />
</div
>
</van
-index
-bar
>
</div
>
</template
>
<script
>
import Vue
from 'vue';
import instance1
from '@/utils/http'
import { IndexBar
, IndexAnchor
,Cell
} from 'vant';
Vue
.use(IndexBar
);
Vue
.use(IndexAnchor
);
Vue
.use(Cell
);
export default {
data () {
return {
cityIndex
:[],
indexList
: [],
}
},
methods
: {
cities(data
){
var a
= data
.map(item
=>Array
.from(item
.pinyin
).splice(0,1))
var UpperCase
= Array
.from(new Set(Array
.from(a
.toString()))).map(item
=>item
.toUpperCase())
this.indexList
= UpperCase
.sort().slice(1)
let cityarr
= []
for(var i
= 0; i
< this.indexList
.length
; i
++){
cityarr
.push({letter
:this.indexList
[i
]})
for(var j
= 0; j
< data
.length
; j
++){
if(this.indexList
[i
] === data
[j
].pinyin
.slice(0,1).toUpperCase()){
cityarr
.push({
name
:data
[j
].name
})
}
}
}
this.cityIndex
= cityarr
},
},
created(){
instance1
.get("/gateway?k=353128",{
headers
:{
'X-Host': 'mall.film-ticket.city.list'
}
}).then(res
=>{
this.cities(res
.data
.data
.cities
)
})
}
}
</script
>
<style lang
="scss" scoped
>
</style
>