[RESOLVIDO] Recuperar id da rota - VUE 3

A url chega assim http://localhost:8081/tema/2, como pegar o número 2 ?

TemaPorIdDescricao.vue

<script setup lang="ts">
import FileSelection from "@/components/forms/form-elements/fileinput/FileInputSelection.vue";
import UiParentCard from "@/components/shared/UiParentCard.vue";
import { useTemaStore } from "@/stores/apps/tema";
import { computed, onMounted, ref } from "vue";

const valid = ref(true);
let editedItem = ref({
  id: null,
  nome: null,
  callback: null,
  apresentacao: null,
  ativo: true,
  jdate: null,
  role: null,
  rolestatus: null,
});

const store = useTemaStore();
onMounted(() => {
  store.buscaPorId(3);
});

const getTema = computed(() => {
  return store.temaPorId;
});
ref(getTema);
</script>
<template>
  <v-row>
    <v-col cols="12" md="12">
      <UiParentCard title="Temas de Estudo">
        <v-form ref="form" v-model="valid" lazy-validation>
          <v-row>
            <v-col cols="12" sm="5">
              <v-text-field
                variant="outlined"
                hide-details
                v-model="editedItem.nome"
                label="Nome"
              ></v-text-field>
            </v-col>
            <v-col cols="12" sm="4">
              <v-text-field
                variant="outlined"
                hide-details
                v-model="editedItem.callback"
                label="Callback chat telegram"
                aria-readonly="true"
              ></v-text-field>
            </v-col>
            <v-col cols="12" sm="2">
              <v-switch
                color="primary"
                v-model="editedItem.ativo"
                hide-details
                label="Ativo ?"
              ></v-switch>
            </v-col>
            <v-col cols="12" sm="4">
              <FileSelection label="Imagem ilustrativa" />
            </v-col>
            <v-col cols="12" sm="12">
              <v-textarea
                variant="outlined"
                hide-details
                label="Apresentação"
                v-model="editedItem.apresentacao"
                rows="5"
              ></v-textarea>
            </v-col>
          </v-row>
        </v-form>
      </UiParentCard>
    </v-col>
  </v-row>
</template>

Como preencher as informações que vem do backend no formulário ?

Dá uma melhorada no título, é um bom tópico, então se no futuro alguém quiser procurar pela mesma coisa, pode procurar por uma palavra chave.


Começa mostrando suas rotas, mais especificamente essa /tema/:id


Essa já é outra questão tb né, mas vc pode criar uma funcao que chama o endpoint do back e chamar no onMounted.

1 curtida

A função já existe, certo ?

onMounted(() => {
  store.buscaPorId(3);
});

MainRoutes

const MainRoutes = {
  path: "/main",
  meta: {
    requiresAuth: true,
  },
  redirect: "/main",
  component: () => import("@/layouts/full/FullLayout.vue"),
  children: [
    {
      path: "/",
      redirect: "/dashboards/analytical",
    },
    {
      name: "Por tema",
      path: "/analise-tema",
      component: () => import("@/views/apps/analise-tema/AnaliseTema.vue"),
    },
    {
      name: "Análise Tema de Estudo",
      path: "/analise-tema/:id",
      component: () => import("@/views/apps/analise-tema/AnaliseTemaPorId.vue"),
    },
    {
      name: "Temas",
      path: "/tema",
      component: () => import("@/views/apps/tema/Tema.vue"),
    },
    {
      name: "Análise Tema",
      path: "/tema/:id",
      component: () => import("@/views/apps/tema/TemaPorId.vue"),
    },
    {
      name: "Sub tema análise Tema",
      path: "/tema/:id",
      component: () => import("@/views/apps/sub-tema/SubTema.vue"),
    },
  ],
};

export default MainRoutes;

sim, já existe. Essa função ja ta pegando do backend? Se tiver, não entendi a sua dúvida…


Vc não pode ter duas rotas com o mesmo path. Só uma dessas duas aí ta sendo utilizada de vdd… E vc pode pegar o :id assim:

{{ $route.params.id }}
1 curtida

Tenho este edit

let editedItem = ref({
  id: null,
  nome: null,
  callback: null,
  apresentacao: null,
  ativo: true,
  jdate: null,
  role: null,
  rolestatus: null,
});

Aqui busca do backend

const store = useTemaStore();
onMounted(() => {
  store.buscaPorId(3);
});

Ai preciso preencher o que vem do backend no formulario abaxo:

<v-form ref="form" v-model="valid" lazy-validation>
          <v-row>
            <v-col cols="12" sm="5">
              <v-text-field
                variant="outlined"
                hide-details
                v-model="editedItem.nome"
                label="Nome"
              ></v-text-field>
            </v-col>
            <v-col cols="12" sm="4">
              <v-text-field
                variant="outlined"
                hide-details
                v-model="editedItem.callback"
                label="Callback chat telegram"
                aria-readonly="true"
              ></v-text-field>
            </v-col>
            <v-col cols="12" sm="2">
              <v-switch
                color="primary"
                v-model="editedItem.ativo"
                hide-details
                label="Ativo ?"
              ></v-switch>
            </v-col>
            <v-col cols="12" sm="4">
              <FileSelection label="Imagem ilustrativa" />
            </v-col>
            <v-col cols="12" sm="12">
              <v-textarea
                variant="outlined"
                hide-details
                label="Apresentação"
                v-model="editedItem.apresentacao"
                rows="5"
              ></v-textarea>
            </v-col>
          </v-row>
        </v-form>

vc precisa passar o $route.params.id onde está o 3.


e pra preencher os dados que tão vindo, é só ir preenchendo esse ref aí.

//acredito q buscaPorId retorna algo
const data = store.buscaPorId(3);
editedItem.nome.value = data.nome; 
//e assim sucessivamente

Sobre pegar o valor da rota, consegui assim:

import { router } from "../../../router";
const store = useTemaStore();
onMounted(() => {
     store.buscaPorId(Number(router.currentRoute.value.params.id));
});

ué, pq preferiu dar essa volta toda ao invés de usar o this.$route?

1 curtida

porque o this.$route não funcionou

qual erro deu? printa o que ta vindo dentro de this.$route

image

console.log(this.$route)
1 curtida

lembrei agora que vc tá usando o vue3…

import {useRouter} from "vue-router";
const router = useRouter()

//onMounted
const id = router.currentRoute.value.params.id
console.log(id);
1 curtida

Não funcionou assim. Está com este erro tambem

Com o useRouter não funcionou?


Foi mal, inverti… O correto é editedItem.value.nome

1 curtida

Sim. Foi o que eu coloquei aqui.

Aconteceu isto.

onMounted(async () => {
   const info = await store....
})
1 curtida

@rodriguesabner

obrigado

Resolvido em

<script setup lang="ts">
import FileSelection from "@/components/forms/form-elements/fileinput/FileInputSelection.vue";
import UiParentCard from "@/components/shared/UiParentCard.vue";
import { useTemaStore } from "@/stores/apps/tema";
import { onMounted, ref } from "vue";
import "vue3-easy-data-table/dist/style.css";
import { router } from "../../../router";

const valid = ref(true);
let editedItem = ref({
  id: 0,
  nome: "",
  callback: "",
  apresentacao: "",
  ativo: true,
  jdate: "",
  role: "",
  rolestatus: "",
});

const store = useTemaStore();
onMounted(async () => {
  const informacao = await store.buscaPorId(
    Number(router.currentRoute.value.params.id)
  );
  editedItem.value = informacao;
});
</script>