vant-list的使用总结

249 阅读1分钟

最近在做一个移动端H5的项目,使用vue3+vant4,遇到了列表的渲染问题,并封装成一个完善的hook

基本使用

<template>
  <van-nav-bar :title="title" left-arrow @click-left="handleBack" />
  <van-list
    style="height: 100vh"
    v-model:loading="loading"
    :error="error"
    error-text="请求失败,点击重新加载"
    :finished="finished"
    finished-text="没有更多了"
    @load="getList"
  >
    <div class="list-wrapper">
      ***
    </div>
  </van-list>
</template>
<script lang="ts" setup>
import { useList } from './hook'
/******************************** hooks *********************************************/
const { title, handleBack, loading, error, finished, list, getList } = useList()
/******************************** hooks end *********************************************/
</script>
<style lang="scss" scoped>

</style>

hook 文件

import { xxApi } from '@/api/xxApi'

type IList = {
  ent_id: string
  ent_name: string
  fa_ren: string
  logo: string
  reg_cap: number
}[]

export const useList = () => {
  const route = useRoute()
  const router = useRouter()
  const loading = ref(false)
  const error = ref(false)
  const finished = ref(false)
  const list = ref<IList>([])
  const title = ref(route.meta!.title as string)
  const queryParams = reactive({
    code: route.query.code,
    region: '500000',
    current: 1,
    size: 10,
  })

  /**获取列表 */
  const getList = () => {
    xxApi(queryParams)
      .then((res) => {
        const { total, records } = res.data
        // 判断是否没有数据了
        if (list.value.length >= total) {
          finished.value = true
        } else {
          list.value = list.value.concat(records)
          queryParams.current += 1
        }
      })
      .finally(() => {
        loading.value = false
      })
      .catch((e) => {
        error.value = true
      })
  }

  /**返回上一级 */
  const handleBack = () => {
   
    router.go(-1)
  }
  
  return {
    title,
    loading,
    error,
    finished,
    list,
    handleBack,
    getList,
  }
}

遇到的问题

1.一直触发请求

解决:添加样式 style="height: 100vh"

2.请求接口,后端报错,一直触发请求

解决:添加样式 :error="error"

ok!