新的组合 API

Nuxt Bridge 实现与 Nuxt 3 兼容的组合函数。

通过将 @nuxtjs/composition-api 迁移到与 Nuxt 3 兼容的 API,迁移到 Nuxt 3 时将减少重写。

ssrRefshallowSsrRef

这两个函数已经被一个新组合函数替代,该组合函数在底层的工作方式非常相似:useState

主要区别在于您必须为该状态提供一个 key(Nuxt 会为 ssrRefshallowSsrRef 自动生成),并且它只能在 Nuxt 3 插件(由 defineNuxtPlugin 定义)或组件实例内部调用。(换句话说,您不能在全局/环境上下文中使用 useState,因为这会导致请求之间的状态共享风险。)

- import { ssrRef } from '@nuxtjs/composition-api'

- const ref1 = ssrRef('initialData')
- const ref2 = ssrRef(() => 'factory function')
+ const ref1 = useState('ref1-key', () => 'initialData')
+ const ref2 = useState('ref2-key', () => 'factory function')
  // 访问状态
  console.log(ref1.value)

由于状态是有键的,因此只要使用相同的键,您可以从多个位置访问相同的状态。

有关如何使用该组合函数的更多信息,请参阅 Nuxt 3 文档

ssrPromise

此函数已被移除,如果您之前使用过,您需要找到替代实现。如果您有 ssrPromise 的用例,请通过讨论与我们联系。

onGlobalSetup

此函数已被移除,但其用例可以通过在 defineNuxtPlugin 内部使用 useNuxtAppuseState 来满足。您也可以在布局的 setup() 函数中运行任何自定义代码。

- import { onGlobalSetup } from '@nuxtjs/composition-api'

- export default () => {
-   onGlobalSetup(() => {
+ export default defineNuxtPlugin((nuxtApp) => {
+   nuxtApp.hook('vue:setup', () => {
      // ...
    })
- }
+ })

useStore

为了访问 Vuex 存储实例,您可以使用 useNuxtApp().$store

- import { useStore } from '@nuxtjs/composition-api`
+ const { $store } = useNuxtApp()

useContextwithContext

您可以使用 useNuxtApp 访问注入的助手。

- import { useContext } from '@nuxtjs/composition-api`
+ const { $axios } = useNuxtApp()
useNuxtApp() 还提供一个名为 nuxt2Context 的键,包含您通常从 Nuxt 2 上下文访问的所有相同属性,但建议 直接使用此项,因为它在 Nuxt 3 中不存在。相反,请查看是否有其他方式可以访问您需要的内容。(如果没有,请提出功能请求或讨论。)

wrapProperty

这个助手函数不再提供,但您可以用以下代码替换它:

const wrapProperty = (property, makeComputed = true) => () => {
  const vm = getCurrentInstance().proxy
  return makeComputed ? computed(() => vm[property]) : vm[property]
}

useAsyncuseFetch

这两个组合函数可以使用 useLazyAsyncDatauseLazyFetch 替代,它们的文档可以在 Nuxt 3 文档 中找到。与之前的 @nuxtjs/composition-api 组合函数一样,这些组合函数不会在客户端阻止路由导航(因此称为“延迟”)。

请注意,尽管名字类似,API 完全不同。重要的是,您不应尝试更改组合函数外部的其他变量值(如您可能之前在使用 useFetch 时所做的)。
useLazyFetch 必须已为 Nitro 配置。

useAsync 迁移到新组合函数:

<script setup>
- import { useAsync } from '@nuxtjs/composition-api'
- const posts = useAsync(() => $fetch('/api/posts'))
+ const { data: posts } = useLazyAsyncData('posts', () => $fetch('/api/posts'))
+ // 或,更简单!
+ const { data: posts } = useLazyFetch('/api/posts')
</script>

useFetch 迁移到新组合函数:

<script setup>
- import { useFetch } from '@nuxtjs/composition-api'
- const posts = ref([])
- const { fetch } = useFetch(() => { posts.value = await $fetch('/api/posts') })
+ const { data: posts, refresh } = useLazyAsyncData('posts', () => $fetch('/api/posts'))
+ // 或,更简单!
+ const { data: posts, refresh } = useLazyFetch('/api/posts')
  function updatePosts() {
-   return fetch()
+   return refresh()
  }
</script>

useMeta

为了与 vue-meta 交互,您可以使用 useNuxt2Meta,该函数将工作于 Nuxt Bridge (但不支持 Nuxt 3),并允许您以与 vue-meta 兼容的方式操作元标签。

<script setup>
- import { useMeta } from '@nuxtjs/composition-api'
  useNuxt2Meta({
    title: 'My Nuxt App',
  })
</script>

您也可以传入计算值或引用,元值将会反应性更新:

<script setup>
const title = ref('my title')
useNuxt2Meta({
  title,
})
title.value = 'new title'
</script>
注意不要在同一个组件中同时使用 useNuxt2Meta() 和选项 API 的 head(),因为行为可能不可预测。

Nuxt Bridge 还提供与 Nuxt 3 兼容的元实现,可以通过 useHead 组合函数访问。

<script setup>
- import { useMeta } from '@nuxtjs/composition-api'
  useHead({
    title: 'My Nuxt App',
  })
</script>

您还需要在 nuxt.config 中显式启用它:

import { defineNuxtConfig } from '@nuxt/bridge'
export default defineNuxtConfig({
  bridge: {
    meta: true
  }
})

这个 useHead 组合函数在底层使用 @unhead/vue 来操作您的 <head>(而不是 vue-meta)。因此,建议不要同时使用原生的 Nuxt 2 head() 属性和 useHead,因为它们可能会冲突。

有关如何使用该组合函数的更多信息,请参阅 Nuxt 3 文档

显式导入

Nuxt 使用 #imports 别名公开了每个自动导入,可以根据需要显式导入:

<script setup lang="ts">
import { ref, computed } from '#imports'

const count = ref(1)
const double = computed(() => count.value * 2)
</script>

禁用自动导入

如果您想禁用组合函数和工具的自动导入,可以在 nuxt.config 文件中将 imports.autoImport 设置为 false

nuxt.config.ts
export default defineNuxtConfig({
  imports: {
    autoImport: false
  }
})

这将完全禁用自动导入,但仍可以使用来自 #imports显式导入