Migration auf v4
Nuxt UI v4 markiert einen wichtigen Meilenstein: **Nuxt UI und Nuxt UI Pro sind jetzt in einer einzigen, vollständig quelloffenen und kostenlosen Bibliothek vereint **.
Dieses Handbuch enthält eine Schritt-für-Schritt-Anleitung zum Migrieren Ihrer Anwendung von v3 nach v4.
Migrate Ihr Projekt
Von Nuxt UI Pro
@nuxt/ui-promit@nuxt/uiin Ihrempackage.json:
pnpm remove @nuxt/ui-pro
pnpm add @nuxt/ui tailwindcss
yarn remove @nuxt/ui-pro
yarn add @nuxt/ui tailwindcss
npm uninstall @nuxt/ui-pro
npm install @nuxt/ui tailwindcss
bun remove @nuxt/ui-pro
bun add @nuxt/ui tailwindcss
@nuxt/ui-promit@nuxt/uiin Ihrem CSS ersetzen:
@nuxt/ui-promit@nuxt/uiin Ihren Importen ersetzen:
- import type { BannerProps } from '@nuxt/ui-pro'
+ import type { BannerProps } from '@nuxt/ui'
Von Nuxt UI
- Beim Upgrade von Nuxt UI v3 müssen Sie einfach auf v4 aktualisieren:
pnpm add @nuxt/ui tailwindcss
yarn add @nuxt/ui tailwindcss
npm install @nuxt/ui tailwindcss
bun add @nuxt/ui tailwindcss
Änderungen von v3
Nach dem Upgrade auf Nuxt UI v4, beachten Sie bitte die folgenden wichtigen Änderungen:
Umbenannter ButtonGroup
ButtonGroup Komponente wurde umbenannt in FieldGroup:
<template>
- <UButtonGroup>
+ <UFieldGroup>
<UButton label="Button" />
<UButton icon="i-lucide-chevron-down" />
+ </UFieldGroup>
- </UButtonGroup>
</template>
Umbenanntes PageMarquee
Die PageMarquee Komponente wurde umbenannt in Marquee:
<template>
- <UPageMarquee :items="items" />
+ <UMarquee :items="items" />
</template>
Entfernte SeitenAkkordeon
Die PageAccordion Komponente wurde zugunsten von Accordion:
<template>
- <UPageAccordion
+ <UAccordion
:items="items"
+ :unmount-on-hide="false"
+ :ui="{ trigger: 'text-base', body: 'text-base text-muted' }"
/>
</template>
PageAccordion war ein Wrapper, der unmount-on-hide auf false setzte und die ui-Prop.Umbenannte Modellmodifikatoren.
modelModifiers Form, die von [InputPH2222),InputNumber und [Textarea/docs/components/textarea)nullableverwendet wird:
- Der Modifikator
nullifywurde innullableumbenannt (er konvertiert leere/leere Werte innull). - Ein neuer
optionalModifikator wurde hinzugefügt (er wandelt leere/leere Werte inundefinedum).
- <UInput v-model.nullify="value" />
+ <UInput v-model.nullable="value" />
- <UTextarea v-model="value" :model-modifiers="{ nullify: true }" />
+ <UTextarea v-model="value" :model-modifiers="{ nullable: true }" />
Verwenden Sie nullable, wenn Sie leere Werte als null und optional, wenn Sie undefined für fehlende Werte bevorzugen.
Änderungen an Formularkomponenten
Die Form-Komponente wurde in v4 mit besserer Zustandsverwaltung und verschachtelten Formularhandling verbessert.
- Schema**transformationen werden nur ** auf die
@submitdata angewendet und mutieren den Zustand des Formulars nicht mehr. - **geschachtelte Formulare müssen explizit ** aktiviert werden, indem die
nestedprop. - Geschachtelte Formulare sollten nun eine
nameprop (ähnlich wieUFormField) bereitstellen und werden automatisch ihren Status von ihrem übergeordneten Formular erben.
<template>
<UForm :state="state" :schema="schema" @submit="onSubmit">
<UFormField label="Customer" name="customer">
<UInput v-model="state.customer" placeholder="Wonka Industries" />
</UFormField>
<div v-for="(item, index) in state.items" :key="index">
<UForm
- :state="item"
+ :name="`items.${index}`"
:schema="itemSchema"
+ nested
>
<UFormField :label="!index ? 'Description' : undefined" name="description">
<UInput v-model="item.description" />
</UFormField>
<UFormField :label="!index ? 'Price' : undefined" name="price">
<UInput v-model="item.price" type="number" />
</UFormField>
</UForm>
</div>
</UForm>
</template>
Entfernt veraltete Dienstprogramme
Einige **Nuxt-Inhaltsverwendungen **, die zuvor in Nuxt UI Pro verfügbar waren, wurden in v4 unter removed übertragen:
findPageBreadcrumbfindPageHeadline
Diese werden jetzt vollständig von Nuxt Content bereitgestellt. Stellen Sie sicher, dass Sie Ihre Importe und die Verwendung entsprechend aktualisieren.
- import { findPageHeadline } from '@nuxt/ui-pro/utils/content'
+ import { findPageHeadline } from '@nuxt/content/utils'
- import { findPageBreadcrumb } from '@nuxt/ui-pro/utils/content'
+ import { findPageBreadcrumb } from '@nuxt/content/utils'
AI SDK-Migration (optional)
Dieser Abschnitt gilt nur, wenn Sie das AI SDK und die Chat-Komponenten verwenden (ChatMessage,ChatMessages,ChatPrompt,ChatPromptSubmit,ChatPalette).
- Update
@ai-sdk/vueundaiAbhängigkeiten in Ihrempackage.jsonund fügen Sie (ersetzt@nuxtjs/mdcfür das Rendern von AI-Antworten als Streaming-Markdown):
- Die
useChatcomposable API wurde geändert:inputundhandleSubmitwurden zugunsten vonsendMessageentfernt, undmessagesist jetzt eine Referenz, die Sie direkt festlegen:
<script setup lang="ts">
import { useChat } from '@ai-sdk/vue'
- const { messages, input, handleSubmit, status, error, reload, setMessages } = useChat()
+ const { messages, status, error, sendMessage, regenerate, stop } = useChat()
+ const input = ref('')
+
+ function handleSubmit() {
+ sendMessage({ text: input.value })
+ input.value = ''
+ }
</script>
- Nachrichten verwenden jetzt
partsanstelle voncontent:
// When manually creating messages
- setMessages([{
+ messages.value = [{
id: '1',
role: 'user',
- content: 'Hello world'
+ parts: [{ type: 'text', text: 'Hello world' }]
- }])
+ }]
// In templates
<template>
- <UChatMessage :content="message.content" />
+ <UChatMessage :parts="message.parts" />
</template>
- Einige Methoden wurden umbenannt:
// Regenerate the last message
- reload()
+ regenerate()
<MDC>mit<Markdown>für teilbasiertes Rendering. DieMarkdownKomponente ist speziell für das Streaming von Markdown entwickelt worden, sie rendert inkrementell Token, wenn sie von den AI. Use AI SDK-Helfern und demisPartStreamingUtility von@nuxt/ui/utils/aikommen.
shiki Plugin verwenden, fügen Sie das folgende CSS zu Ihrem Stylesheet hinzu, um den dunklen Modus zu unterstützen:html.dark .shiki span {
color: var(--shiki-dark) !important;
background-color: var(--shiki-dark-bg) !important;
font-style: var(--shiki-dark-font-style) !important;
font-weight: var(--shiki-dark-font-weight) !important;
text-decoration: var(--shiki-dark-text-decoration) !important;
}