美文网首页js css html
Nuxt3从入门到实战之数据获取

Nuxt3从入门到实战之数据获取

作者: 硅谷干货 | 来源:发表于2023-04-09 13:50 被阅读0次

    前言

    上一篇写了组件自动导入,通过nuxt的组件系统,我们使用组件时不需要导入和注册组件,用就完了,开发体验杠杠的!但我突然想到,我们平时开发还需要用到第三方组件库,那么组件库能自动导入吗?

    相关的文档参见:http://v3.nuxtjs.org/docs/directory-structure/components#library-authors

    所以如果严格按照nuxt要求定义我们组件库并添加nuxt.js文件,自动引入自然没有问题。然而在我尝试的两个组件库:vue-devuinaive-ui中,都不是很贴合它的要求,所以均以失败告终!希望有识之士可以折腾一下,如果你有解决方案,还请不吝赐教!

    那么如何引入它们哪?其实通过插件体系获取app实例就能手动注册,所以这并不是大问题。

    本篇我们写一写组件逻辑,首先想到的是获取数据。

    nuxt3中提供的数据获取函数有以下四个:

    • useFetch
    • useLazyFetch
    • useAsyncData
    • useLazyAsyncData

    注意:它们都必须在setup生命周期钩子中使用

    useAsyncData

    在页面、组件或插件中都可以使用useAsyncData获取那些异步数据。比如:

    const {
      data: Ref<DataT>, // 返回的数据
      pending: Ref<boolean>, // 加载状态指示器
      refresh: (force?: boolean) => Promise<void>, // 强制刷新函数
      error?: any // 请求失败的错误信息
    } = useAsyncData(
      key: string,// 唯一键用于多次请求结果去重
      fn: () => Object,// 返回数值的异步函数
      // lazy - 是否在路由之后才请求数据,server - 是否在服务端请求数据
      options?: { lazy: boolean, server: boolean } 
    )
    

    获取待办事项数据,index.vue:

    <template>
      <div>
        <!-- 待办列表 -->
        <div v-for="todo in todos" :key="todo.id">
          <input type="checkbox" v-model="todo.completed">
          <strong>{{todo.title}}</strong>
        </div>
      </div>
    </template>
    <script setup lang="ts">
    const { data: todos } = await useAsyncData(
      'count', () => $fetch('/api/todos'))
    </script>
    

    $fetch使用参考ohmyfetch

    useLazyAsyncData

    该方法等效于useAsyncData,仅仅设置了lazy选项为true,也就是它不会阻塞路由导航,这意味着我们需要处理data为null的情况(或者通过default选购给data设置一个默认值)

    useFetch

    页面、组件或者插件中可以使用useFetch获取任意URL资源。

    useFetch是对useAsyncData包装,自动生成key同时推断响应类型,用起来更简单。

    看下面方法签名,基本完全相同:

    const {
      data: Ref<DataT>,
      pending: Ref<boolean>,
      refresh: (force?: boolean) => Promise<void>,
      error?: any
    } = useFetch(url: string, options?)
    

    useLazyFetch

    该方法等效于useFetch,仅设置了lazy选项为true,所以它不会阻塞路由导航,这意味着我们需要处理data为null的情况(或者通过default选购给data设置一个默认值)

    最佳实践

    只选取需要的数据

    由于请求回来的数据会存储在页面payload中,甚至包括那些没有用到的字段,所以文档中明确建议大家只选择那些组件用到的数据,我们可以设置$fetch的pick选项。

    比如,下面的用法:

    const { data: mountain } = await useFetch('/api/mountains/everest', { 
      pick: ['title', 'description'] 
    })
    

    相关文章

      网友评论

        本文标题:Nuxt3从入门到实战之数据获取

        本文链接:https://www.haomeiwen.com/subject/cwceddtx.html