Skip to content

Stimulus

Docs & Examples

Source

initConfig

Defines on which selectors should stimulus apply controllers and actions dynamically once they are executed via initStimulus method.

  • controllers[string] - array of controller names to apply dynamic controllers, classname and the controller need to have the same name.
  • actions[string[]] - array of selectors and action values to apply as dynamic actions

useStimulus

Represents the main stimulus variable on which you can register controllers.

javascript
import { useStimulus } from '../composables/stimulus.js'

useStimulus.register('x-my-component', class extends Controller {
 // your code
})

initStimulus

Dynamically applies controllers and actions on selectors defined in initConfig

invoke

Registers an invoke controller that is used to Invoke actions between controllers.

Tips

Jetbrains Plugin

Be sure to take advantage of syntax highlighting with the official Jetbrains Plugin.

Controller Communication

If you need to invoke action across controllers, you have three options

Events

Most intuitive way to communicate if the controllers have parent / children relationship.

Invoke

Handy if the controllers have no relationship. You can use our internal helper method useController, which is an shorthand for getControllerForElementAndIdentifier

javascript
useController('x-drawer' /* controller name */, '.x-drawer' /* selector (optional) */).invoke('close', {
    // event options
})

Outlets

Extending Controllers

If you need to extend a Controller, you can do so easily. Here is an example of extending Details Component.

javascript
useStimulus.register('x-details', class extends Details {
    connect() {
        super.connect()
        
        this.toggleRequired(this.element.open)
    }

    async toggle(event) {
        await super.toggle(event)

        this.toggleRequired(this.element.open)
    }

    toggleRequired(bool) {
        this.element.querySelectorAll('[data-required]').forEach((element) => {
            element.required = bool
        })
    }
})

Do you need Stimulus?

Does your website really need Stimulus? If you are making website with minimum JavaScript, consider using native Web Components API with the Custom elements is attribute.

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://unpkg.com/@ungap/custom-elements/es.js"></script>
    <script type="module">
        customElements.define("x-header", class extends HTMLElement {
            connectedCallback() {
                console.log('x-header connected')
            }
        }, { extends: 'header' })
    </script>
</head>
    <body>
        <header class="x-header" is="x-header">
    
        </header>
    </body>
</html>

Released under the MIT License.