Skip to main content

composable_controllers

🔗 Create Composable Stimulus Controllers​

Break logic into mixins to compose controllers. Use class decorators to merge functionality and override lifecycle methods cleanly.

// mixins/loggable.js
export const Loggable = Base => class extends Base {
log(message) { console.log(`[${this.identifier}] ${message}`) }
}

// mixins/toggleable.js
export const Toggleable = Base => class extends Base {
toggle() { this.element.classList.toggle('active') }
}

// my_controller.js
import { Controller } from '@hotwired/stimulus'
import { Loggable } from './mixins/loggable'
import { Toggleable } from './mixins/toggleable'

class BaseController extends Controller {}
const Composed = Toggleable(Loggable(BaseController))

export default class extends Composed {
connect() {
super.connect()
this.log('Connected')
}
}