Frontend Patterns

Pattern

State Synchronization

Keep component state in sync with external data sources or other components.

State Management Intermediate

State Synchronization

Problem

Component state drifts out of sync with external data sources or other components, showing stale information. URL parameters don’t match the UI state, causing broken bookmarks and back button behavior. Local storage updates don’t reflect in the UI until refresh. WebSocket messages arrive but the interface doesn’t update, leaving users looking at outdated data.

Solution

Keep multiple representations of the same data synchronized across components or stores. This ensures consistency but requires careful coordination to avoid conflicts.

Example

This demonstrates keeping component state synchronized with external data sources through bidirectional updates, ensuring consistency between local and external state representations.

// Framework-agnostic state synchronization
class SyncedInput extends HTMLElement {
  static get observedAttributes() {
    return ['external-value'];
  }

  attributeChangedCallback(name, oldValue, newValue) {
    if (name === 'external-value' && newValue !== oldValue) {
      // Synchronize internal state with external value (external -> internal)
      this.internalValue = newValue;
      this.render();
    }
  }

  connectedCallback() {
    this.addEventListener('input', (e) => {
      this.internalValue = e.target.value;
      // Emit event to sync back to parent (internal -> external)
      this.dispatchEvent(new CustomEvent('value-change', {
        detail: this.internalValue
      }));
    });
  }

  render() {
    const input = this.querySelector('input');
    if (input) input.value = this.internalValue;  // Update UI to match state
  }
}

Benefits

  • Ensures UI stays consistent with external data sources.
  • Enables components to work with both local and external state.
  • Makes controlled components that sync with parent state possible.
  • Supports patterns like URL state synchronization.

Tradeoffs

  • Can create infinite loops if updates trigger reciprocal synchronization.
  • Requires careful handling of which source of truth takes precedence.
  • May cause performance issues with frequent synchronization.
  • Makes data flow harder to trace and debug.
Stay Updated

Get New Patterns
in Your Inbox

Join thousands of developers receiving weekly insights on frontend architecture patterns

No spam. Unsubscribe anytime.