New Composition API
通过从 @nuxtjs/composition-api
迁移到 Nuxt 3 兼容的 API,迁移到 Nuxt 3 时将减少重写工作。
ssrRef
和 shallowSsrRef
这两个函数已被一个在内部工作方式非常相似的新的组合函数取代:useState
。
主要区别在于你必须为此状态提供一个 key(ssrRef
和 shallowSsrRef
由 Nuxt 自动生成),它只能在 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
此函数已被移除,但你可以使用 useNuxtApp
或 useState
在 defineNuxtPlugin
中实现它的用例。你还可以在布局的 setup()
函数中运行任何自定义代码。
- import { onGlobalSetup } from '@nuxtjs/composition-api'
- export default () => {
- onGlobalSetup(() => {
+ export default defineNuxtPlugin((nuxtApp) => {
+ nuxtApp.hook('vue:setup', () => {
// ...
})
- }
+ })
useStore
要访问 Vuex store 实例,你可以使用 useNuxtApp().$store
。
- import { useStore } from '@nuxtjs/composition-api`
+ const { $store } = useNuxtApp()
useContext
和 withContext
你可以使用 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]
}
useAsync
和 useFetch
这两个组合函数可以用 useLazyAsyncData
和 useLazyFetch
替换,它们在Nuxt 3 文档中有文档说明。与之前的 @nuxtjs/composition-api
组合函数一样,这些组合函数在客户端上不会阻塞路由导航(这就是名称中 'lazy' 的含义)。
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: '我的 Nuxt 应用',
})
</script>
你还可以传入计算属性或 ref,元标签的值将以响应式方式更新:
<script setup>
const title = ref('我的标题')
useNuxt2Meta({
title,
})
title.value = '新标题'
</script>
useNuxt2Meta()
和 Options API 的 head()
,因为行为可能是不可预测的。Nuxt Bridge 还提供了一个与 Nuxt 3 兼容的 meta 实现,可以通过 useHead
组合函数访问。
<script setup>
- import { useMeta } from '@nuxtjs/composition-api'
useHead({
title: '我的 Nuxt 应用',
})
</script>
你还需要在你的 nuxt.config
中显式启用它:
import { defineNuxtConfig } from '@nuxt/bridge'
export default defineNuxtConfig({
bridge: {
meta: true
}
})
这个 useHead
组合函数在内部使用 @unhead/vue
(而不是 vue-meta
)来操作你的 <head>
。因此,建议不要同时使用原生的 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
。
export default defineNuxtConfig({
imports: {
autoImport: false
}
})
这将完全禁用自动导入,但仍然可以使用来自 #imports
的显式导入。