---
# System prepended metadata

title: Persist view state
tags: [brew-js-react]

---

---
tags: brew-js-react
---

# Persist view state

The router implements view state mechanism. Therefore a view component can persist states when navigating different views. 

## `useRouteState` hook

```typescript
function View() {
    const [searchText, setSearchText] = useRouteState('searchText', '');
    // ...
}
```

When user leave the current page and later navigate back, `searchText` will be initialized with the last value set by `setSearchText`.

## Single view for different paths

It is common to display different content depending on current path using the same component.

For example, the page `/products/1` and `/products/2` may display detail of product with ID `1` and `2` respectively, using the same view component.

If there are states isolated in different page that need to be persisted and restored in each page view, use the lower level `useViewState` hook:

```typescript
function ProductInfo() {
    const id = useRouteParam('id');
    const viewState = useViewState('myViewState');
    const [searchText, setSearchText] = useState(viewState.get() ?? '');
    
    // store current search text in view state
    // so that when navigating back the last search text is restored
    viewState.set(searchText);

    useEffect(() => {
        return viewState.onPopState((prevState) => {
            // callback will be called when navigation occurred
            // and rendering this same view component
            setSearchText(prevState ?? '');
        });
    }, [viewState]);

    // ...
}
```

## Snapshot internal states

==Since `v0.3.3`==

The library provides mechanism to snapshot internal view state so that user can traverse between internal states using browser's back and forward function.

:::info
It is always preferrable to use route parameters if such state is better conceptualized as a page, so that user can access directly by different URL.
:::

```typescript!
function Component() {
    // pass `true` as third argument to enable snapshot
    const [step, setStep] = useRouteState('step', 0, true);
    
    // ...
}
```
