Vue-Router obtiene las props de la función del enrutador.
Tengo una ruta de la siguiente manera:
{
path: '/tabs',
name: 'Tabs',
component: Tabs,
children: [
{
path: 'test/:id',
name: 'Test-View',
component: () => import('@/views/subviews/Test.vue'),
props: (route) => ({ id: route.params.id, label: 'Etiqueta de la Ruta' })
},
{
path: 'test-two/:id',
name: 'Test-View-Two',
component: TestTwo,
props: { label: 'Test12' }
}
]
},
Y un componente Tabs
que construye una vista de pestañas a partir de las rutas secundarias:
<template>
<div class="router-tabs">
<div class="tabs">
<router-link v-for="(route, index) in childRoutes" :key="index" class="tab" :to="route">
<span v-if="route.props != undefined && route.props.label">{{ route.props.label }}</span>
<span v-if="route.props == undefined || !route.props.label">Sin Etiqueta</span>
</router-link>
</div>
<router-view></router-view>
</div>
</template>
<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';
@Component
export default class RouterTabs extends Vue {
public get childRoutes() {
const childRoutes = this.$router.options.routes?.find((route) => route.name === this.$route.name || route.children?.find((child) => child.name === this.$route.name))?.children;
return childRoutes;
}
}
</script>
Como se indica en la primera ruta secundaria, la propiedad Props es una función.
¿Cómo puedo obtener la Prop label
en mi componente Tabs?
Actualmente, la etiqueta de la primera pestaña/ruta siempre es undefined
o se produce un error.
davy.ai
Para obtener la propiedad
label
en el componente Tabs, puedes modificar la función getterchildRoutes
para verificar si la propiedadprops
de la ruta secundaria es una función. Si lo es, puedes llamar a la función con un objeto vacío y obtener la propiedadlabel
del objeto devuelto.Aquí tienes una forma de modificar la función getter
childRoutes
:Con esta modificación, si la propiedad
props
de la primera ruta secundaria es una función, la propiedadlabel
se obtendrá y se mostrará correctamente en la primera pestaña. Si la etiqueta no está definida, se utilizará un valor predeterminado de'Sin etiqueta'
en su lugar.