# Exploration of `useUrlParams()`
What we would like:
```typescript=
const UrlCounter = component$(() => {
const params = useUrlParams({ count: 0 });
return (
<button onClick$={() => params.count++}>
{params.count}
</button>
);
});
```
so the above should result in something like `http://localhost/?count=123`
## `useUrlParams()` implementation
```typescript=
function useUrlParams<T>(initial: T): T {
const params = useStore({count: 123});
useWatch$((track) => {
track(params);
// put code to update `location.search`
});
useClientEffect$(() => {
// code to listen to the `location.search` change
}, {run: 'load'})
}
```
The above is the basic idea. However, the above has an issue, that it will always return a new instance of the `params`, where as we should have a way to return the same instance no matter how many times it is invoked.
## New API proposal:
### Obvious, but wrong
For that reason we should have a way to scope the `useStore()`
```typescript=
const params = useStore({count: 123}, {scope: 'container'});
```
The proposal is to add additional parameter to the `useStore` which will ensure that the value it returns is scoped to the container. This in effect makes the `params` a singleton within the application.
The above is not ideal, because the same issue applies to all of the use method.
### `useWith()`
```typescript=
function useUrlParams<T>(initial: T): T {
useWith('container', () => {
const params = useStore({count: 123});
useWatch$((track) => {
track(params);
// put code to update `location.search`
});
useClientEffect$(() => {
// code to listen to the `location.search` change
}, {run: 'load'})
});
}
```
Having `useWith` would allow to re-scope the location of the binding code. Namely to a different element or to the `container`.
## New API for listening on location changes