在vue3组合式API中使用hooks函数 返回的响应式对象无法使用是什么原因?

2023-06-12 308 0

最近在使用vue3的组合式API,参照博主@MrBigShot的建议,自己写了几个hooks。其中一个函数返回的响应式对象无法解包,目前没有找到原因。具体代码如下:

在hooks.js文件中,我们使用Vue3的reactive来创建了tableData对象,并在getTableData函数中通过异步请求API获取数据并将其赋值给tableData。同时,我们也使用了ref来记录数据是否已全部加载完成,以及getTableData函数调用次数等信息。在setup函数中,我们导入了useGetTableData函数,并使用其中的getTableData来获取数据,将获取到的数据存放在list对象中。但是,在使用tableData.value.forEach(item => { list.value.push(item) })来遍历tableData中的数组项时,遍历一直失败,控制台中明明有数据。通过查找资料,我们发现这是因为时机问题,使用console.log打印的值并不是我们要的当前值,需要通过加上await来解决。代码实现如下:

export const useGetTableData = () => {
    // 将响应式对象的定义从reactive改为ref
    const tableData = ref([])
    //记录数据是否已全部加载完成
    const hasLoadALL = ref(false)
    //记录getTableData函数调用次数 默认初始化时返回第1页数据 前十条
    let page = 1
    const getTableData = async () => {
        let pageSize = 3
        //nums用来记录从哪个位置开始加载数据 初始时从位置0开始 也就是从第一条数据开始加载
        let nums = (page - 1) * pageSize
        console.log(nums, 'weizhi')
        //每次返回数据集的条数 默认10条
        const res = await axios.get('GetRecordList', {
            params: {
                nums,
                pageSize
            }
        })
        if (res.data.success) {
            //使用tableData.value来访问响应式对象的值
            tableData.value = JSON.parse(res.data.data)
            page++
        } else {
            hasLoadALL.value = true
        }
    }
    return {
        //使用toRefs将响应式对象的值解包后返回
        ...toRefs({
            tableData,
            hasLoadALL
        }),
        getTableData
    }
}
const onLoad = async () => {
    //使用await来等待获取到tableData的数据再进行处理
    await getTableData()
    console.log(tableData.value, '表格value')
    //使用tableData.value来访问响应式对象的值
    tableData.value.forEach(item => {
        list.value.push(item)
    })
    //...
}

同时,我们还可以将reactive改为ref,在使用响应式对象时需要使用toRefs进行解包后再使用。

最近在使用vue3的组合式API,参照博主@MrBigShot的建议,自己写了几个hooks。其中一个函数返回的响应式对象无法解包,可能是时机问题导致的。我们可以将reactive改为ref,同时使用await来等待数据获取,以及使用toRefs将响应式对象的值解包后返回,再进行遍历操作即可。

相关文章

nuxt2部署静态化和ssr的时候访问首页先报404再出现首页为什么?
`clip-path` 如何绘制圆角平行四边形呢?
多线程wait方法报错?
VUE 绑定的方法如何直接使用外部函数?
vue2固定定位该怎么做?
谁有redis实现信号量的代码,希望借鉴一下?