Shared vs. Isolated Components
Ignite-Element offers two powerful modes of state management for your web components:
Shared Components: Use a global state shared across all component instances.
Isolated Components: Maintain an independent state for each component instance.
Both modes are designed to provide flexibility and scalability for your application’s specific needs.
Shared Components
Shared components have a single state source across all instances. Any updates to the state are reflected in every instance, ensuring consistency throughout your application.
When to Use Shared Components
Shared components are ideal for scenarios where a global state needs to be accessed or updated by multiple components. Examples include:
Shopping Cart: Display the total items and costs across different parts of an application.
Theme Management: Apply a consistent theme (e.g., dark mode) throughout your application.
Example: Shared Counter
Here’s a shared counter component:
import { igniteCore } from "ignite-element";
import { html } from "lit-html";
import counterStore from "./counterStore";
const { shared } = igniteCore({
adapter: "mobx",
source: counterStore,
});
shared("shared-counter", (state, send) => {
return html`
<div>
<h3>Shared Counter: ${state.count}</h3>
<button @click=${() => send({ type: "increment" })}>Increment</button>
<button @click=${() => send({ type: "decrement" })}>Decrement</button>
</div>
`;
});
Every instance of shared-counter
will display and update the same global count.
Isolated Components
What Are Isolated Components?
Isolated components maintain their own state, independent of other instances. Each component instance operates within its own scope, ensuring no interference with other components.
When to Use Isolated Components
Isolated components are ideal for scenarios where each component instance requires its own state. Examples include:
Forms: Each form field should manage its own value.
Product Quantity Selectors: Each product in a list should manage its own quantity.
Example: Isolated Counter
Here’s an isolated counter component:
import { igniteCore } from "ignite-element";
import { html } from "lit-html"
import counterStore from "./counterStore";
const { isolated } = igniteCore({
adapter: "mobx",
source: counterStore,
});
isolated("isolated-counter", (state, send) => {
return html`
<div>
<h3>Isolated Counter: ${state.count}</h3>
<button @click=${() => send({ type: "increment" })}>Increment</button>
<button @click=${() => send({ type: "decrement" })}>Decrement</button>
</div>
`;
});
Each instance of isolated-counter
manages its count
value independently.
Comparison: Shared vs. Isolated
State Sharing
Shared across all instances
Independent for each instance
Use Case
Global state like shopping cart or theme
Local state like form inputs or counters
Performance Impact
Updates re-render all shared components
Updates only re-render the specific instance
Best Practices
Use Shared Components for Global State: Choose shared components when you need consistency across multiple instances.
Use Isolated Components for Local State: Use isolated components for scenarios where the state needs to be encapsulated and independent.
Leverage Ignite-Element’s Flexibility: In your application, mix shared and isolated components as needed. For example, use a shared component for a shopping cart summary and isolated components for individual product quantity selectors.
Last updated