FrameworkStyle

SnapshotController

Reactive controller for subscribing to a State container in HTML custom elements

Import

import { SnapshotController } from '@videojs/store/html';

Usage

SnapshotController subscribes to a State container and triggers host updates when state changes. It has two overloads:

Full state — returns the entire state object. Re-renders on any state change.

import { SnapshotController } from '@videojs/store/html';

class Display extends HTMLElement {
  #state = new SnapshotController(this, sliderState);

  render() {
    const value = this.#state.value;
    // Full state object
  }
}

With selector — returns a derived value from state. Re-renders only when the selected value changes (using shallow equality).

import { SnapshotController } from '@videojs/store/html';

class SliderValue extends HTMLElement {
  #value = new SnapshotController(this, sliderState, (s) => s.value);

  render() {
    return this.#value.value; // Only the selected slice
  }
}

Use .track(state) to switch to a different State container at runtime.

SnapshotController vs StoreController

Both are reactive controllers, but they operate at different levels:

SnapshotController StoreController
Input State container Store instance or context
Subscribes Always Only with a selector
Use case Subscribe to raw state changes Access store actions and optionally subscribe

SnapshotController is lower-level. It works with State containers directly — the reactive primitives that back a store. Use it when building custom controllers or working outside the player store system.

StoreController is higher-level. It resolves a store from a context or direct reference and internally creates a SnapshotController when you pass a selector. Use it for player UI elements.

Lifecycle

SnapshotController subscribes on hostConnected() and unsubscribes on hostDisconnected(). The React equivalent is useSnapshot.

API Reference

Overload 1

Parameters

Parameter Type Default
host* ReactiveControllerHost
state* State<T>

Return Value

Property Type
value R
track (state: State<T>) => void

Overload 2

Parameters

Parameter Type Default
host* ReactiveControllerHost
state* State<T>
selector* Selector<T, R>

Return Value

Property Type
value R
track (state: State<T>) => void
VideoJS