Beleza Matheus, vou postar:
CADASTRO:
<template>
<div>
<h1 class="centralizado">Cadastro</h1>
<h2 class="centralizado">{{ foto.titulo }}</h2>
<h2 v-if="foto._id" class="centralizado">Alterando</h2>
<h2 v-else class="centralizado">Incluindo</h2>
<form @submit.prevent="grava()">
<div class="controle">
<label for="titulo">TÍTULO</label>
<input
v-validate
data-vv-rules="required|min:3|max:30"
data-vv-as="título"
name="titulo"
id="titulo"
autocomplete="off"
v-model="foto.titulo"
>
<span class="erro" v-show="errors.has('titulo')">{{errors.first('titulo')}}</span>
</div>
<div class="controle">
<label for="url">URL</label>
<input
v-validate
data-vv-rules="required"
name="url"
id="url"
autocomplete="off"
v-model.lazy="foto.url"
>
<span class="erro" v-show="errors.has('url')">{{errors.first('url')}}</span>
<imagem-responsiva v-show="foto.url" :url="foto.url" :titulo="foto.titulo"/>
</div>
<div class="controle">
<label for="descricao">DESCRIÇÃO</label>
<textarea id="descricao" autocomplete="off" v-model="foto.descricao"/>
</div>
<div class="centralizado">
<meu-botao rotulo="GRAVAR" tipo="submit"/>
<router-link :to="{name: 'home'}">
<meu-botao rotulo="VOLTAR" tipo="button"/>
</router-link>
</div>
</form>
</div>
</template>
<script>
import ImagemResponsiva from "../shared/imagem-responsiva/ImagemResponsiva.vue";
import Botao from "../shared/botao/Botao.vue";
import Foto from "../../domain/foto/Foto";
import FotoService from "../../domain/foto/FotoService";
export default {
components: {
"imagem-responsiva": ImagemResponsiva,
"meu-botao": Botao
},
methods: {
grava() {
console.log(
`Enviar dados para API:
titulo: `,
this.foto.titulo,
`url: `,
this.foto.url,
`descricao: `,
this.foto.descricao
);
this.$validator.validateAll().then(success => {
if (success) {
this.service.cadastra(this.foto).then(
() => {
if (this.id) this.$router.push({ name: "home" });
this.foto = new Foto();
},
err => console.log(err)
);
}
});
}
},
created() {
this.service = new FotoService(this.$resource);
if (this.id) {
this.service.busca(this.id).then(foto => (this.foto = foto));
}
},
data() {
return {
foto: new Foto(),
id: this.$route.params.id
};
}
};
</script>
<style scoped>
.centralizado {
text-align: center;
}
.controle {
font-size: 1.2em;
margin-bottom: 20px;
}
.controle label {
display: block;
font-weight: bold;
}
.controle label + input,
.controle textarea {
width: 100%;
font-size: inherit;
border-radius: 5px;
}
.centralizado {
text-align: center;
}
.erro {
color: red;
}
</style>
ROTAS:
import Home from './components/home/Home.vue';
const Cadastro = () => System.import('./components/cadastro/Cadastro.vue');
export const routes = [
{ path: '/', name: 'home', component: Home, titulo: "Home", menu: true },
{ path: '/cadastro', name: 'cadastro', component: Cadastro, titulo:"Cadastro", menu: true },
{ path: '/cadastro/:id', name: 'altera', component: Cadastro, menu: false },
{ path: '*', component: Home, menu: false }
];