Seitu
Solid

Hooks

Subscribe to a reactive value.

useSubscription()

Subscribe to a reactive value. Pass a handle or a getter (reactive: re-subscribes when it reads a signal). Returns an Accessor<R> (value()).

Examples

Inline subscription

import { createWebStorageValue } from 'seitu/web'
import { useSubscription } from 'seitu/solid'
import * as z from 'zod'

function Counter() {
  const value = useSubscription(() => createWebStorageValue({
    type: 'sessionStorage',
    key: 'test',
    defaultValue: 0,
    schema: z.number(),
  }))

  return <div>{value()}</div>
}

Instance outside of component

import { createWebStorage } from 'seitu/web'
import { useSubscription } from 'seitu/solid'
import * as z from 'zod'

const sessionStorage = createWebStorage({
  type: 'sessionStorage',
  schemas: { count: z.number(), name: z.string() },
  defaultValues: { count: 0, name: '' },
})

function Counter() {
  const value = useSubscription(sessionStorage)
  return <div>{value().count}</div>
}

Subscription with selector

import { createWebStorage } from 'seitu/web'
import { useSubscription } from 'seitu/solid'
import * as z from 'zod'

const sessionStorage = createWebStorage({
  type: 'sessionStorage',
  schemas: {
    count: z.number(),
    name: z.string(),
  },
  defaultValues: { count: 0, name: '' },
})

function Counter() {
  // Accessor updates only when count changes
  const count = useSubscription(sessionStorage, { selector: value => value.count })

  return <div>{count()}</div>
}

Reactive source (re-subscribes when a signal changes)

import { createSignal } from 'solid-js'
import { createWebStorageValue } from 'seitu/web'
import { useSubscription } from 'seitu/solid'
import * as z from 'zod'

function User() {
  const [userId, setUserId] = createSignal('user-1')
  const data = useSubscription(() => createWebStorageValue({
    type: 'localStorage',
    key: `user:${userId()}`,
    schema: z.object({ name: z.string() }),
    defaultValue: { name: '' },
  }))

  return <div>{data().name}</div>
}

Ref example

import { createScrollState } from 'seitu/web'
import { useSubscription } from 'seitu/solid'

function Page() {
  let ref: HTMLDivElement | undefined
  const state = useSubscription(() => createScrollState({ element: () => ref, direction: 'vertical' }))

  return (
    <div ref={ref}>
      {String(state().top.reached)}
    </div>
  )
}

Edit on GitHub

Last updated on

On this page