Summit.js
UI Library Techniques
Globals & API

Summit.data

Summit.data registers a named component so you can reference it from any s-data attribute instead of repeating an inline object. It is the tool for anything beyond a one-off snippet: a counter, a dropdown, a form, a component you use in ten places.

Registering a component

Call Summit.data(name, provider). The provider is a factory: a function that returns the state object. Returning the object from a function (rather than sharing one object) is what gives every use its own independent copy.

Summit.data("counter", (start = 0) => ({
  count: start,
  increment() {
    this.count++;
  },
}));
<div s-data="counter">
  <button @click="increment()">
    Count: <span s-text="count"></span>
  </button>
</div>

The returned object becomes reactive state exactly like an inline s-data object: properties are tracked, getters become cached derived values, and methods are bound so this is the component. See Reactivity and State for how that state behaves.

Passing arguments

Reference the provider like a function call and Summit passes the arguments through. The argument list is evaluated in the parent scope, so you can hand in literals or values from an enclosing component.

<div s-data="counter(10)">
  <span s-text="count"></span>
</div>

Bare names work too: s-data="counter" calls the provider with no arguments, letting your parameter defaults (start = 0 above) take over.

A fresh copy every time

Because the provider is a function, each element that references it runs the factory again and gets a separate state object. Two s-data="counter" blocks on the same page keep independent counts.

Lifecycle hooks

If the returned object has an init() method, Summit calls it once the component's state is set up. A destroy() method runs when the element is removed from the DOM. This works for named providers and inline objects alike.

Summit.data("clock", () => ({
  now: "",
  timer: 0,
  init() {
    this.timer = setInterval(() => (this.now = new Date().toLocaleTimeString()), 1000);
  },
  destroy() {
    clearInterval(this.timer);
  },
}));

See Lifecycle for the full order of these hooks.

Chaining and timing

Summit.data returns the Summit global, so registrations chain:

Summit
  .data("counter", () => ({ count: 0 }))
  .data("clock", () => ({ now: "" }));

Registration is timing-safe. You can register a provider before or after Summit.start, and any matching s-data in the page, now or added later, resolves to it.

Esc
Loading search...
Recent
Suggested
No results for "".
to navigate to select esc to close