0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

stimulus について知らないので簡単に調査したというメモ

Posted at

Rails で stimulus を触れる機会があったため、そもそも何なのか基礎から調べることにした

概要

Stimulus is a JavaScript framework with modest ambitions. It doesn’t seek to take over your entire front-end—in fact, it’s not concerned with rendering HTML at all.

「Stimulus は、控えめな目標を持つ JavaScript フレームワークです。フロントエンド全体を制御しようとするものではなく、HTML のレンダリングにはまったく関係ありません。」 (原文翻訳)

引用:https://stimulus.hotwired.dev/

  • 最近はやりの React も JS のライブラリということで stimulus の比較対象としてサンプルコードを見比べた
    → 「React のサンプルコード」 v.s. 「stimulus のサンプルコード
    • サンプルコードを見てみる限り 『HTML が主体になっているか JS が主体になっているか』 の違いと思われる

【メモ】

  • React は JS でありながら HTML をレンダリングしている
    • JavaScript のチュートリアルで学ぶような「すでにある HTML の要素を JS で DOM 操作する」とは違い"JS 側"が舵を取っているイメージ
  • stimulus は HTML の要素に data-XXX のような属性を加えることで DOM 操作対象を指定している
    • あくまで HTML があってこその JS というイメージで HTML が主体
      • そのため"modest ambitions"と表現しているのかもしれない

コードで確かめる

  • 公式ドキュメントよりサンプルコードを拝借して以下のようなソースコードを実装した
  • data-hello-target="name" ... stimulus で参照する要素("ターゲット属性"という)
    • data-XXX-target ... 参照するのが"XXX"コントローラであることを意味する
    • "name" ... "XXX"コントローラ内で扱うこの要素の識別名
  • data-action="click->hello#greet" ... stimulus で監視する DOM イベント
    • click ... 監視する DOM イベント
      • サンプルコードにおいては <button> なので click を監視している
    • hello ... このイベントを扱う stimulus のコントローラ名
    • greet ... イベントを扱うコントローラ内のメソッド名

https://stimulus.hotwired.dev/reference/targets
https://stimulus.hotwired.dev/reference/actions

 
(サンプルコード:公式ドキュメントで紹介されているサンプルコードを HTML ファイル単体で実装する場合)

stimulus_sample.html
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <script type="module">
        import { Application, Controller } from "https://unpkg.com/@hotwired/stimulus/dist/stimulus.js"
        window.Stimulus = Application.start()
        
        Stimulus.register("hello", class extends Controller {
        static targets = [ "name", "output" ]
        
            greet() {
                this.outputTarget.textContent =
                `Hello, ${this.nameTarget.value}!`
            }
        });
    </script>
</head>
<body>
    <!--HTML from anywhere-->
    <div data-controller="hello">
        <input data-hello-target="name" type="text">
        
        <button data-action="click->hello#greet">
        Greet
        </button>
        
        <span data-hello-target="output">
        </span>
    </div>
</body>
</html>

【メモ】

  • バニラ JS で id を HTML 要素に付与するように stimulus も data-XXX を付与している
    • 違う点は前者のように単に「識別するための id」を付与するのではなく data-actiondata-hello-target というように**「要素の識別 & その要素はどういった役割なのか」**という意味を持たせられる

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?