Quantcast
Channel: Active questions tagged svelte - Stack Overflow
Viewing all articles
Browse latest Browse all 1541

Ways to make layout load data both reactive + changeable?

$
0
0
  • I am returning a bunch of data from my +layout.ts
  • I want the data to change when the url changes
  • I also want to be able to modify filter, search, tag etc from the UI via input, dropdown elements

+layout.ts

type NewsFilter = 'latest' | 'likes' | 'dislikes' | 'trending'type LayoutLoadReturnType = {    filter: NewsFilter;    id: string | undefined;    latestNewsPromise: Promise<{status: number; data: Array<{id: string; author: string; title: string; description: string;}>}>;    search: string;    symbolNames: {status: number, Array<{id: string; name: string; symbol: string}>};    symbolRanks: {status: number, Array<{id: string; rank: number; symbol: string}>};    tag: {id: string; name: string; symbol: string} | undefined;    title: string | undefined;    urlFriendlyTag: string;};export const load: LayoutLoad = ({ data, fetch, params, url }): LayoutLoadReturnType => {    const filter = (url.searchParams.get('filter') as NewsFilter) || 'latest';    const id = params.id;    const search = url.searchParams.get('search') || '';    const title = params.title;    const urlFriendlyTag = params.tag || 'all';    const { symbolNames, symbolRanks } = data;    const tag = getTagFromUrlFriendlyTag(urlFriendlyTag, symbolNames.data);    let endpoint;    if (typeof id !== 'undefined'&& id !== null && isValidId(id)) {        endpoint = getNewsListWithItemEndpoint(filter, id, undefined, undefined, search, tag);    } else {        endpoint = getNewsListEndpoint(filter, undefined, undefined, search, tag);    }    return {        filter,        id,        latestNewsPromise: fetch(endpoint).then((r) => r.json()),        search,        symbolNames,        symbolRanks,        tag,        title,        urlFriendlyTag    };};

What have I tried?

Option 1

  • When I change the URL due to some action below, the values dont change+layout.svelte
<script lang="ts">const {children, data}=$props();let filter = $state(data.filter);let search = $state(data.search);let tag = $state(data.tag);let urlFriendlyTag = $state(data.urlFriendlyTag);let newsItems = $state([]);data.latestNewsPromise.then((items) => {  newsItems.push(...items)})async function loadMore() {  const {data} = await fetch(getNextPageEndpoint());  newsItems.push(...items)}</script><input bind:value="search" /><a href="/news/?filter=likes">View liked news</a><a href="/news/?filter=trending">View trending news</a><!-- ... Options to navigate to news items with different tags via url -->

Option 2

  • I cannot change the values anymore+layout.svelte
<script lang="ts">const {children, data}=$props();let filter = $derived(data.filter);let search = $derived(data.search);let tag = $derived(data.tag);let urlFriendlyTag = $derived(data.urlFriendlyTag);let newsItems = $state([]);data.latestNewsPromise.then((items) => {  newsItems.push(...items)})async function loadMore() {  const {data} = await fetch(getNextPageEndpoint());  newsItems.push(...items)}</script><input bind:value="search" /><a href="/news/?filter=likes">View liked news</a><a href="/news/?filter=trending">View trending news</a><!-- ... Options to navigate to news items with different tags via url -->
  • How do I make it both reactive and modifiable?

Viewing all articles
Browse latest Browse all 1541

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>