Usei o Vue por anos para meu desenvolvimento frontend (amador) e decidi experimentar o Nuxt .
Depois de passar pelo tutorial, pensei que tinha uma ideia geral e criei um projeto simples onde:
- Eu teria uma entrada na página que envia um número para o backend,
- que por sua vez responde com um número incrementado
- que é exibido simultaneamente na página principal.
Para isso criei um novo projeto no qual escrevi alguns arquivos:
server/api/addOne.ts
export default defineEventHandler((event) => {
const oldNumber = (getRouterParam(event, 'number') || 0) as number
return {
oldNumber: oldNumber,
newNumber: oldNumber + 1,
}
})
app.vue
<template>
<div>
<AddOne></AddOne>
</div>
</template>
components/AddOne.vue
<template>
<div>
<input v-model="myNumber" />
<button @click="sendToServer">send</button>
<div> -{{ numberFromServer }}- </div>
</div>
</template>
<script lang="ts">
const myNumber = ref(0)
const numberFromServer = ref(0)
const sendToServer = async (number: number) => {
console.log('clicked')
const { data, pending, error, refresh } = await useFetch('/api/addOne', {
method: 'post',
body: {
number: myNumber.value
}
})
numberFromServer.value = data.newNumber
myNumber.value = -1
console.log(`number from server: ${numberFromServer.value}`)
}
</script>
O aplicativo cria e exibe o que é esperado:
O aplicativo não funciona (inserir um número e pressionar send
não faz nada) e recebo os seguintes avisos:
WARN [Vue warn]: Property "myNumber" was accessed during render but is not defined on instance.
at <AddOne>
at <App>
at <NuxtRoot>
WARN [Vue warn]: Property "numberFromServer" was accessed during render but is not defined on instance.
at <AddOne>
at <App>
at <NuxtRoot>
Não entendo de onde eles vêm - myNumber
e numberFromServer
são definidos no componente. Eu já estava surpreso que o VSCode não os estava sugerindo quando eu os estava digitando, mas pensei que era uma questão de ter o plugin certo, talvez.
Acho que estou fazendo algo fundamentalmente errado, por isso minha pergunta sobre onde as variáveis devem ser definidas no Nuxt, em vez de onde elas estão no Vue.
Isso não é específico do Nuxt.
O aviso significa exatamente o que diz,
numberFromServer
emyNumber
é usado em um modelo, mas não é definido em um script. Deve haverreturn { myNumber, ... }
para a função de configuração, ouconst myNumber = ...
parascript setup
a sintaxe. Isso também pode acontecer se a configuração falhou em executar normalmente e lançou um erro, então as variáveis foram definidas, mas não retornadas.Neste caso não há configuração, esta é a primeira coisa a verificar quando tal aviso ocorre.
Deveria ser: