Reputation: 6240
Shallow routing works well when clicking on an item
Shallow routing throws 404 when typing item url directly
src/routes/(news)/+layout.svelte
<script lang="ts">
import './../../app.css'
import { page } from '$app/stores';
import { pushState } from '$app/navigation';
import { MediaQuery } from 'svelte/reactivity';
const { children, data } = $props();
const large = new MediaQuery('min-width: 800px');
const hasNoDetailSelected = $derived.by(() => {
return (
typeof $page.state.id === 'undefined' && typeof $page.state.title === 'undefined'
);
});
function onClickItem() {
pushState('/news/abcdabcd-abcd-abcd-abcd-abcdabcdabcd/title-1', {id: 'abcdabcd-abcd-abcd-abcd-abcdabcdabcd', title: 'title-1'})
}
</script>
<header class="header">
<h1>
<a data-sveltekit-preload-data="off" href="/">TestNewsApp</a>
</h1>
</header>
{#if large.current}
<main style="flex-direction: row">
<div class="news-list-container">
<nav>
<ul>
<li onclick={onClickItem}>Item 1</li>
</ul>
</nav>
</div>
<div class="news-detail-container">
{@render children()}
</div>
</main>
{:else if !large.current && hasNoDetailSelected}
<main style="flex-direction: column">
<div class="news-list-container">
<nav>
<ul>
<li onclick={onClickItem}>Item 1</li>
</ul>
</nav>
</div>
</main>
{:else}
<main style="flex-direction: column">
<div class="news-detail-container">
{@render children()}
</div>
</main>
{/if}
<style>
.news-detail-container {
background-color: lightyellow;
flex: 1;
}
.news-list-container {
background-color: lightcyan;
flex: 1;
}
main {
display: flex;
flex: 1;
}
</style>
src/routes/(news)/+page.svelte
<script lang='ts'>
import {page} from '$app/stores';
</script>
{#if $page.state.id && $page.state.title}
<p>Detail Page</p>
{:else}
<p>Popular News</p>
{/if}
Upvotes: -1
Views: 19
Reputation: 6240
routes/(news)/news/[id]/[title]/+page.svelte
<script lang='ts'>
import {page} from '$app/state'
const {data, id, title} = $props()
</script>
<p>Detail Page What? {id || page.params.id} {title || page.params.title}</p>
routes/(news)/+page.svelte
<script lang='ts'>
import {page} from '$app/stores';
import DetailPage from './news/[id]/[title]/+page.svelte'
</script>
{#if $page.state.id && $page.state.title}
<DetailPage id={$page.state.id} title={$page.state.title} />
{:else}
<p>Popular News</p>
{/if}
const hasNoDetailSelected = $derived.by(() => {
return (
typeof $pageFromStore.state.id === 'undefined' && typeof $pageFromStore.state.title === 'undefined' && typeof pageFromState.params.id === 'undefined' && typeof pageFromState.params.title === 'undefined'
);
});
Upvotes: 0