关于 vue3.0 ref,reactive 与 typescript 的问题?求大佬解答疑惑

2020-11-25 17:41:23 +08:00
 miloooz

新手才开始写 vue3.0 。 着手在编一个自己用的 hook 文件, 可是在 typescript 定义上出了问题, 拜托有大佬能解答一下~

import { ref, reactive, watch, onMounted, readonly, toRefs } from 'vue';
import { IRes } from '@/utils/axios';

export type REQUEST_DATA_ALL<T extends object> = {
  pageSize: number,
  pageIndex: number,
} | T

function useGetList<LIST_ITEM_PROPS, REQUEST_DATA extends object>(request: (data: REQUEST_DATA_ALL<REQUEST_DATA>) => Promise<IRes<{
  list: LIST_ITEM_PROPS[],
  count: number,
  pageCount: number
}>>, requestData: Partial<REQUEST_DATA>, errorHandle?: (res: IRes<unknown>) => void): {
} {
  const pageIndex = ref(1) // 当前页数
  const pageSize = ref(10) // 单页条数
  const pageCount = ref(0) // 总页数
  const dataCount = ref(10) // 总条数
  const getListLoading = ref(false) // 请求加载表示
  let localRequestData = reactive<Partial<REQUEST_DATA>>(requestData) // 请求的其他参数
  const dataList = reactive<LIST_ITEM_PROPS[]>([])
  // 获取列表
  const getList = async () => {
    try {
      getListLoading.value = true
      const requestData: REQUEST_DATA_ALL<REQUEST_DATA> = { pageIndex: pageIndex.value, pageSize: pageSize.value, ...toRefs(localRequestData as object) } // 这里这个 展开的合并 我不会
      console.log(requestData)
      const res = await request(requestData)
      dataList.concat(reactive(res.data.list))
      pageCount.value = res.data.pageCount
      dataCount.value = res.data.count
      getListLoading.value = false
    } catch (e) {
      console.log(e)
      errorHandle && errorHandle(e)
    }
  }

  // 设置单页条数
  const setPageSize = (newPageSize: number) => {
    pageSize.value = newPageSize
  }
  watch(pageSize, (val, oldVal) => {
    setPageIndex(1)
  })

  // 设置当前页数
  const setPageIndex = (newPageIndex: number) => {
    pageIndex.value = newPageIndex
  }
  watch(pageIndex, (_val, _oldVal) => {
    getList()
  })

  // 设置请求参数
  const setRequestData = (requestData: Partial<REQUEST_DATA>) => {
    Object.keys(requestData).forEach(item => {
      localRequestData[item] = requestData[item as keyof Partial<REQUEST_DATA>]
    })
  }

  // 初始化 use
  const initUse = () => {
    getList()
  }

  onMounted(() => initUse())
  // watch
  return {
    pageIndex,
    pageSize,
    pageCount,
    dataCount,
    getListLoading,
    dataList: readonly(dataList),
    setPageSize,
    setPageIndex,
    setRequestData
  }
}

export default useGetList;

问题 1: const requestData: REQUEST_DATA_ALL<REQUEST_DATA> = { pageIndex: pageIndex.value, pageSize: pageSize.value, ...toRefs(localRequestData as object) } 我想把存储起来的localRequestData和固定会存在于请求参数的pageIndexpageSize保存在一起,可是localRequestData的类型推导是UnwrapNestedRefs<Partial<REQUEST_DATA>> ,这里我就混不来了。。。,用 as object混过去了。

问题 2:setRequestData函数,这里我只是有个疑问所以用这种方式写,这种我想要改reactive定义的部分字段,要怎么写呀。

可能我只有一个问题就是,当我定义一个reactive传入的是类型变量而不是具体类型的变量时,接下来这个变量的类型是 UnwrapNestedRefs<T> ,我要怎么在后面的代码中正确的去展开,合并。

1015 次点击
所在节点    前端开发
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/729192

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX