踩坑:uniapp写hooks时,响应式丢失

场景: 一般项目中会有多个地方需要用到列表,且列表一般都有上拉刷新和下拉加载更多的交互,所以我接下来要做得就是,封装一个hooks,来让全局的列表只需要传一个api进来就可以使用,提高代码开发效率,代码如下:

import { ref, reactive, computed, watch, onMounted } from 'vue'

/**
 * @function 全局列表hooks
 * @param  dataListApi 请求数据的api
 * @param  options 需要额外传入的参数
 * @param {Boolean} needLoading 是否需要使用loading效果
 */
export default (dataListApi, options = {}, needLoading = true) => {

  const pageInfo = reactive({
    offset: 1,
    limit: 10,
    minId: '',
    total: 0
  })

  const dataList = ref([])
  const isLoading = ref(false)
  const isNoMore = ref(false)//没有更多

  async function getDataList () {
    if (isNoMore.value) return
    showLoading()
    try {
      const { data } = await dataListApi({ ...pageInfo, ...options })
      console.log('hooks res', data);
      pageInfo.minId = data.records[data.records.length - 1].id
      pageInfo.total = data.total
      dataList.value = dataList.value.concat(data.records).slice(0,10)
      console.log('dataList',dataList);
      hideLoading()
      // 判断是否显示更多,如果要显示则增加页数
      isNoMore.value = pageInfo.offset * pageInfo.limit >= pageInfo.total
      if (isNoMore.value) return
      pageInfo.offset++

    } catch (error) {
      console.log(error);
      hideLoading()
    }
  }

  async function reset () {
    Object.assign(pageInfo, {
      offset: 1,
      limit: 10,
      minId: '',
      total: 0
    })
    getDataList()
  }

  function showLoading () {
    if (!needLoading) return
    isLoading.value = true
    uni.showLoading({
      title: '加载中'
    });
  }
  function hideLoading () {
    if (!needLoading) return
    isLoading.value = false
    uni.hideLoading();
  }



  return {
    pageInfo,
    dataList,
    getDataList,
    reset
  }
}

下面是使用实例:

import useGetList from '@/hooks/useGetList'
const { pageInfo,dataList, getDataList, reset } = useGetList(pickUpApi.insideListPageMinId)
console.log('dataList-------------',dataList.value);

出现问题!!!
拿到数据时,可以打印,但是页面没更新!!
在这里插入图片描述
然后想通过监听,来看看是不是ref的响应丢失了

watch(()=>dataList.value,(val)=>{
  console.log(1111,val);
})

但从上图发现,watch是可以监听到变化的,那是啥子原因???

突然,发现了编辑器出现了一行小字,黄色警告

setData 数据传输长度为 1076 KB,存在有性能问题!

我想,我一行代码咋会有16kb呢,难道是接口数据的问题?
然后瞅了一眼接口返回的数据,好家伙,五万多条!
在这里插入图片描述

破案了,就是数据太大的原因,到时页面由于性能问题无法响应,页面遭不住,数据太多了

解决方法

  1. 使用splice将长数组给他截断(治标不治本)
  2. 让后端将测试数据删掉
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易风有点疯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值