-
-
Notifications
You must be signed in to change notification settings - Fork 22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Svelte 5 support #80
Comments
Here is a bit of a crazy take, why don't you remove |
I agree with @Hugos68 i don't think it's needed. |
I'm currency using the syntax
|
@paoloricciuti ⚠ Little plug const searchParams = stateParams({
schema: {
search: 'string',
tags: ['number'],
sortBy: '<asc,dec>',
range:{
from:"date",
to:"date"
}
}
}); It does not use the boxed value pattern and behave like a normal svelte 5 state. |
Hey just noticed this...i'm actually working on the svelte 5 version right now...i like the added validation and i will definitely take a look at this 😄 |
@paoloricciuti If you want to add validation maybe it's possible to re-use existing validation libraries like zod? |
I don't plan to add validations during the svelte 5 conversion but if i will do something similar in the future i will definitely try to make it with some existing library (possibly more than one with the adapter pattern) |
Thanks everyone for the feedback...i've opened this PR to close this issue. There are a few breaking changes (the biggest is the removal of You can try it out today by doing pnpm add https://pkg.pr.new/sveltekit-search-params@126 and i setup a prerelease that i plan to keep around for a bit to gather feedback before pushing to the new Major (probably after sveltekit will introduce the stateful version of the stores). Please let me know if there are any bugs. |
How to achieve the
|
There's the |
Apologies for missing that earlier. I just reviewed the documentation and came back to update my comment, only to realize you already addressed it. Additionally, I was thinking it might be useful to introduce a For instance, if this is used as a search result filter, and the user is on page 20 but applies additional filters that reduce the total number of pages below 20, they would still be on page 20 and see no results. If you have an even better approach in mind, I’m all ears! |
Before switching to v4, I was able to set different debounce times for individual parameters. However, it seems that this is no longer possible. I’m using this setup in search forms and would like to apply different debounce behaviors based on the input type:
Is there a way to achieve this in the current setup, or any workaround you’d recommend? |
Hi @paoloricciuti , where would you like to track issues with @126? I am unclear about how we should be reacting to query changes. For example, this seems to cause an infinite number of function calls: const params = queryParameters({ selected: ssp.array() }, { pushHistory: false })
$effect(() => {
if (params.selected) {
fetchProperties()
}
}) |
You can just open an issue in the repo...what are you doing inside |
Just tried and it seems to work fine |
It's probably a poor design decision on my part, but I'm not sure how to get around it: I fetch each item in the array and add it to another $state. There's also some memoization in here to avoid re-fetching items: let properties = $state([])
const fetchProperties = async () => {
const newProperties = {}
for (const id of $params.selected) {
if (!newProperties[id] && !properties.some((e) => e.id == id) {
newProperties[id] = await fetch(`/api/property/${id}`).then(e => e.json())
}
}
properties = properties
.filter((e) => $params.selected?.some((id) => e.id == id)
.concat(Object.values(newProperties))
} Wrapping the async potion of this in a setTimeout(0) made the infinte loop go away, but there's still some weird behavior. I'll add that I appreciate your effort on this, I'm surprised query-string stores aren't a native feature in svelte(kit), it seems like a required feature for deep linking in webapps. |
This is the source of the infinite loop...you are reading and writing to the same state (properties)...so that will trigger the infinite loop. This has nothing to do with the library tho, you probably just need to |
Is there a prerelease version of svelte 5 that we can try out and give feedback / help contribute? I don't see any pr's |
Yes you can install the |
Was a little surprised/confused that With query string const params = queryParameters({ sort: true });
$inspect(params); returns an empty object const params = queryParameters({ sort: true });
$inspect(JSON.stringify(params)); returns the expected Am I misunderstanding how Since |
Svelte 5 is right around the corner and while stores are still supported i want to upgrade this library to take advantage of runes.
This however require some changes that are not back compatible so my plan is to continue supporting stores in
sveltekit-search-params@^2
and upgrade to runes insveltekit-search-params@^3
.The new version however will likely face some api changes because of how runes behave.
queryParameters
The function
queryParameters
will benefit a lot from runes: today this function return an unique store object with each query parameter as the key.with runes the syntax will not change that much but the updates should be much more fine grained which is good
queryParam
Here's where the change will be much more intensive so first thing first sorry if you are using this intensively...i'll try to see if i can create a migration CLI to help you with your upgrade.
Today
queryParam
accept the key of the query parameter as input and returns a store with that param by itself. If the query parameter is a string the store will contain the string itself.This is not possible with runes so we have three options:
The boxed value
The simplest option would to return a
ref
or aboxed
instead of the actual value. The downside is that you need to access it with.value
everywhere.This is simple to refactor but once you need to access it with
.value
everywhere is it really worth it over usingqueryParameters
with a short name and just access it likeqp.search
everywhere?The function
Another option could be have the returned value be a function...you could access it by calling it and set it by calling it with a typesafe parameter.
this is nice to see but it can get complex with Typescript type narrowing and it get's pretty hairy with objects and arrays.
The derived
A somewhat nice option would be to make use of
$derived.by
to destructure the return value ofqueryParam
. This would give us a simple value to use everywhere and we could even return aninput
object to spread into your inputs that automatically set theoninput
property to mimic thebind
behaviour.but this again become very hairy with object and arrays (especially if you want to bind a property of that object instead of the whole object).
Conclusion
I'm not really satisfied with any of the options for
queryParam
and i wonder if we should just drop that api but i would love to have YOUR opinion and ideas on this.The text was updated successfully, but these errors were encountered: