This article will take about 2 minutes to read.
The Bloc pattern is used extensively in Flutter. It’s a way of doing reactive state management.
The code for this is so simple that we can include it all here.
First, we need to define a class which contains state, and the means to observe it.
const { Subject } = rxjs;
class CounterBloc {
    constructor() {
        this.counter = 0;
        this.counterSubject = new Subject();
    }
    incrementCounter() {
        this.counter++;
        this.counterSubject.next(this.counter);
    }
    dispose() {
        this.counterSubject.complete();
    }
}
Then we need to create a component which depends on the bloc.
class CounterComponent extends HTMLElement {
    constructor() {
        super();
    }
    setBloc(bloc) {
        this.bloc = bloc;
    }
    connectedCallback() {
        this.className = "counter-element"
        const button = document.createElement('button');
        button.textContent = 'Click me';
        button.onclick = () => {
            this.bloc.incrementCounter();
        };
        const output = document.createElement('span');
        this.bloc.counterSubject.subscribe((value) => {
            output.textContent = `Counter: ${value}`;
        });
        this.appendChild(button);
        this.appendChild(output);
    }
}
customElements.define('counter-component', CounterComponent);
Then at the call site, we define 2 new components which share the same Bloc. They will each be incremented at the same time.
<div id="wrapper"></div>
<script>
    const wrapper = document.getElementById("wrapper")
    const bloc = new CounterBloc();
    const counter1 = document.createElement('counter-component');
    counter1.setBloc(bloc);
    wrapper.appendChild(counter1);
    const counter2 = document.createElement('counter-component');
    counter2.setBloc(bloc);
    wrapper.appendChild(counter2);
</script>
All in all, this demonstrates shared reactive state.