vue3+vant4 二次封装IndexBar都会列表组件以及性能优化

打印 上一主题 下一主题

主题 650|帖子 650|积分 1950

前言

   二次封装都会列表以及对静态资源的引入做异步引入优化。
版本号: vue3.3 + vant4
  效果图


数据源

都会列表 city.json 永世网盘链接
链接:https://pan.baidu.com/s/10E-b441-4P7mjvomlJhm0g
提取码:m92c
字段大致讲解
indexList :每个字母是所属都会外层盒子唯一的key。
van-index-anchor: 是页面的每个标题,例如A、B。
van-cell:title就是A下面的每个都会
进来先用computed把都会数据源中的首个字母取出来。数据源长这个样子。

性能优化点

此组件做了一处优化
将 city.json 同步引入改为异步引入。
作用:引入的数据量较大时 页面无需因为它而加载不出来,同步的还是还是展示,数据量大的让其参加到异步队列即可,因为我们都知道,同步永远比异步优先执行。
效果:云云可达到快速加载页面、丝毫不影响用户体验,还是挺不错的。
优化前效果图

进入的时间显着要等几秒钟,因为引入方式是同步的,同步需要页面完全加载完才会展示,这是同步引入的弊端。

优化前代码
  1. <script lang="ts" setup>
  2. import { ref, computed, onMounted} from 'vue'
  3. import { useRouter } from 'vue-router'
  4. import { city } from '@/assets/json/city.json' // 同步导入 JSON 数据
  5. const router = useRouter()
  6. const cityData = city
  7. // const indexList = ['A', 'B', 'C']
  8. //获取所有城市首字母
  9. const indexList = computed(() => {
  10.         return cityData.map(item => item.initial)
  11. })
  12. </script>
复制代码
优化后效果

立马就进入,依旧优先加载同步,但是city.json改为异步了,已参加异步队列,所以永远在同步背面才执行。

优化子女码
  1. <script lang="ts" setup>
  2. import { ref, computed, onMounted } from 'vue'
  3. const cityData = ref([])
  4. // const indexList = ['A', 'B', 'C']
  5. //获取所有城市首字母
  6. const indexList = computed(() => {
  7.         return cityData.value.map(item => item.initial)
  8. })
  9. // 异步加载城市数据 性能优化
  10. async function loadCities() {
  11.         try {
  12.                 const data = await import('@/assets/json/city.json') // 动态导入 JSON 数据
  13.                 cityData.value = data.city // 更新 cities 的值
  14.                 // console.log(cityData, 'cityData.value')
  15.         } catch (error) {
  16.                 console.error('Failed to load cities:', error)
  17.         }
  18. }
  19. // 在组件挂载后加载数据
  20. onMounted(() => {
  21.         loadCities()
  22. })
  23. </script>
复制代码
完备源码

City.vue 子组件
  1. <script lang="ts">
  2. export default {
  3.         name: 'CityList',
  4. }
  5. </script>
  6. <script lang="ts" setup>
  7. import { ref, computed, onMounted, } from 'vue'
  8. import { useRouter } from 'vue-router'
  9. const router = useRouter()
  10. const cityData = ref([])
  11. // const indexList = ['A', 'B', 'C']
  12. //获取所有城市首字母
  13. const indexList = computed(() => {
  14.         return cityData.value.map(item => item.initial)
  15. })
  16. // 选择城市回首页
  17. const backHome = cityname => {
  18.         // router.push({ path: '/', query: { cityname: cityname + '市' } })
  19.         console.log(cityname + '市', '选中的城市')
  20. }
  21. // 异步加载城市数据 性能优化
  22. async function loadCities() {
  23.         try {
  24.                 const data = await import('@/assets/json/city.json') // 动态导入 JSON 数据
  25.                 cityData.value = data.city // 更新 cities 的值
  26.                 // console.log(cityData.value, 'cityData.value')
  27.         } catch (error) {
  28.                 console.error('Failed to load cities:', error)
  29.         }
  30. }
  31. // 在组件挂载后加载数据
  32. onMounted(() => {
  33.         loadCities()
  34. })
  35. </script>
  36. <template>
  37.         <div class="city-list-container">
  38.                 <div class="hotcity">所有城市</div>
  39.                 <van-index-bar :index-list="indexList" highlight-color="#1989fa">
  40.                         <div v-for="(city, idx1) in cityData" :key="idx1">
  41.                                 <van-index-anchor :index="city.initial"></van-index-anchor>
  42.                                 <van-cell v-for="(item, idx2) in city.list" :key="idx2" :title="item.name" @click="backHome(item.name)"></van-cell>
  43.                         </div>
  44.                 </van-index-bar>
  45.         </div>
  46. </template>
  47. <style scoped lang="scss">
  48. .hotcity {
  49.         padding: 30px;
  50.         font-size: 28px;
  51.         font-weight: bold;
  52. }
  53. ::v-deep(.van-index-bar) {
  54.         background-color: #fff;
  55. }
  56. ::v-deep(.van-index-bar__sidebar) {
  57.         top: 72%;
  58. }
  59. </style>
复制代码
怎样利用

以SearchList.vue 父组件为例
  1. <template>
  2.         <div>
  3.                 <CityList />
  4.         </div>
  5. </template>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表