vue3 hooks碰到的问题

根据项目的需求,需要将获取报表id的方法写成一个hooks,在hooks是否使用监听watch,碰到了一系列的问题。在写hooks的时候,在hooks里面写了监听watch,写了一个响应式的数据,但是在页面上调用找个hooks的,响应式的数据写在setup内一直拿不到。
在此之前需要搞清楚一个问题:

  • watch在vue3中是什么时候执行的。
vue2生命周期与vue3生命周期相对比
vue2vue3
beforeCreatesetup()
createdsetup()
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestroyonBeforeUnmount
destroyedonUnmounted
activatedonActivated
deactivatedonDeactivated
errorCapturedonErrorCaptured

监听watch在被触发的时候,是在beforeCreatecreated 之间被触发,进行初始化的,而setup在创建组件的时候是在beforeCreatecreated 之前执行的。

最初的写法:

export default async function useReport(busTypeId: any) {
  const route = useRoute();
  const report = ref();
  watch(
    () => busTypeId,
    async () => {
      if (isEmpty(busTypeId) || busTypeId == undefined) {
        busTypeId = route.path.split('/').slice(-1)[0];
      }
      const { createMessage } = useMessage();
      if (busTypeId?.length >= 19) {
        await getReportByBustypeId({ busTypeId })
          .then((res) => {
            report = res.id;
          })
          .catch((err) => {
            createMessage.error('获取信息失败' + err);
          });
      }
    },
    { immediate: true,deep: true },
  );
  return { report };
}

页面引用:

<script lang="ts" setup>
  import useReport from '/@/views/busModel/report/useReport';
  
  const { report } = useReport ();
  console.log(report , 'report report 1');
  /**查询 */
  async function handleQuery() {
    try {
      console.log(report , 'report report 2');
    } catch (e) {
      console.log(e);
    }
  }

</script>

这个时候写的看着也没有问题,但是就是在页面调用的时候无法获取到return出来的数据。在查询事件外边写的打印,打印的时候显示无数据,但是在查询里面写的就有数据。并且将监听事件直接写到页面上时,只有在监听事件内能拿到需要的数据,在外边就拿不到。这就是因为setup的执行是在beforeCreatecreated 之前执行的,而监听watch是在beforeCreatecreated 之间执行的,所以一直拿不到数据。

更改后的写法:

export default async function useReport(busTypeId: any) {
  const route = useRoute();
  const report = ref();
  if (isEmpty(busTypeId) || busTypeId == undefined) {
    busTypeId = route.path.split('/').slice(-1)[0];
  }
  const { createMessage } = useMessage();
  if (busTypeId?.length >= 19) {
    await getReportByBustypeId({ busTypeId })
      .then((res) => {
        report.value = res.id;
      })
      .catch((err) => {
        createMessage.error('获取报表信息失败' + err);
      });
  }
  return { report };
}

页面调用:

<script lang="ts">
  import useReport from '/@/views/busModel/report/useReport';

  const report = ref();
  onMounted(async () => {
    await useReport().then((res) => {
      report.value = res.report.value;
    });
  });
</script>

将监听watch去掉之后,这样就可以拿到想要的数据了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中的hooks是一种函数的写法,类似于封装公共方法的js文件,用于实现功能的重复利用。与Vue2中的mixin相比,hooks更清楚复用功能代码的来源,更清晰易懂。通过使用hooks函数,可以提高代码的复用性,并在不同的组件中都能够利用这些hooks函数。Hooks函数可以与mixin连用,但不建议这样做。总的来说,Vue3中的hooks是一种更加灵活和清晰的方式来实现组件功能的复用。 #### 引用[.reference_title] - *1* [vue3 hooks使用](https://blog.csdn.net/weixin_42776111/article/details/126095393)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vue3中hooks的介绍及用法](https://blog.csdn.net/JaneLittle/article/details/127127644)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [vue3中的hooks](https://blog.csdn.net/qq_39029949/article/details/130248477)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值