Follow

封装了一个vue 的 navigation hook:

import type { AxiosResponse } from 'axios'
import { reactive } from 'vue'
import { ElMessage } from 'element-plus'
import type { Pagination, PaginationModel } from '@/model/rootObject'
import type { PaginationRequestBase } from '@/apis/requestType'

export const usePagination = <Q extends PaginationRequestBase, T>(
  AxiosRequest: (query: Q) => Promise<AxiosResponse<PaginationModel<T>, any>>,
  queryOptions: Parameters<typeof AxiosRequest>[0]
) => {
  const state = reactive({
    fetchingError: false,
    fetching: true,
    list: [] as T[],
    pagination: { current: queryOptions.current || 1, pages: NaN, total: NaN, size: queryOptions.size || 10 } as Pagination
  })

  const fetchList = async () => {
    // @ts-ignore
    delete queryOptions.current
    // @ts-ignore
    delete queryOptions.size

    AxiosRequest({
      ...queryOptions,
      current: state.pagination.current,
      size: state.pagination.size
    })
      .then((res) => {
        state.list = res.data.data.records as typeof state.list

        state.pagination.current = res.data.data.current
        state.pagination.pages = res.data.data.pages
        state.pagination.total = res.data.data.total
        state.pagination.size = res.data.data.size
        state.fetchingError = false
      })
      .catch((err) => {
        state.fetchingError = true
        ElMessage.error(err.message)
      })
      .finally(() => {
        state.fetching = false
      })
  }

  const handlePageSizeChange = (val: number) => {
    state.pagination.size = val
    fetchList()
  }

  const handlePageCurrentChange = (val: number) => {
    state.pagination.current = val
    fetchList()
  }

  const handlePagePrevClick = () => {
    state.pagination.current--
    state.pagination.current = Math.max(state.pagination.current, 0)
    fetchList()
  }

  const handlePageNextClick = () => {
    state.pagination.current++
    state.pagination.current = Math.min(state.pagination.current, state.pagination.pages)
    fetchList()
  }

  return { state, methods: { fetchList, handlePageSizeChange, handlePageCurrentChange, handlePagePrevClick, handlePageNextClick } }
}
· · Web · 0 · 0 · 1
Sign in to participate in the conversation
小森林

每个人都有属于自己的一片森林,也许我们从来不曾走过,但它一直在那里,总会在那里。迷失的人迷失了,相逢的人会再相逢。愿这里,成为属于你的小森林。