При переході між маршрутами з тим самим компонентом (/users/1 → /users/2) Vue Router не перестворює компонент - він лише оновлює route.params. Хуки onMounted і setup не виконуються вдруге, і дані першого користувача лишаються на екрані.
<script setup>
const route = useRoute();
const user = ref(null);
onMounted(async () => {
user.value = await fetchUser(route.params.id); // лише один раз!
});
</script>
Рішення 1 - стежити за параметром:
watch(
() => route.params.id,
async (id) => { user.value = await fetchUser(id); },
{ immediate: true },
);
Рішення 2 - guard оновлення в компоненті:
onBeforeRouteUpdate(async (to) => {
user.value = await fetchUser(to.params.id);
});
Рішення 3 - примусово перестворювати компонент через key:
<RouterView :key="$route.fullPath" />
Просто, але дорого: при кожній зміні query перемонтовується вся сторінка, губиться її стан.
Параметри як props - компонент не залежить від роутера:
{ path: '/users/:id', component: UserProfile, props: true }
// перетворення: число замість рядка, плюс query
{
path: '/search',
component: SearchPage,
props: (route) => ({ query: route.query.q, page: Number(route.query.page ?? 1) }),
}
<script setup>
const props = defineProps({ id: String });
watch(() => props.id, loadUser, { immediate: true });
</script>
Переваги props:
- компонент можна використати поза роутером і легко тестувати - достатньо передати props;
- приведення типів і значення за замовчуванням в одному місці (функція
props).
Проблема «компонент не оновився» з props не зникає - стежити за зміною все одно треба, але через props.id.