7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

stimulus、初歩の初歩(基本構造についての私的理解まとめ)

Posted at

こちらの続き、railsプロジェクトに当てる前提でいろいろ試しています。

とりあえずハンドブックを読んで、自分なりに纏めてみる(ちなみに書いている人間はWebプログラミング初心者です。間違いなどあればどしどし指摘をよろしくおねがいします1)。

#stimulus、HTML側の三要素ーー【controller】【target】【action】

HTML側で記述する基本的な要素は、

・data-controller
・data-action
・data-target

の3つのはず。
……前回も触れた、ハンドブックの【Hello, Stimulus】を持ち出すと、

app/views/users/index.html.erb

<div data-controller="hello">

  <input data-target="hello.name" type="text">
  <button data-action="click->hello#greet">Greet</button>

</div>
app/javascript/controllers/hello_controller.js
import { Controller } from "stimulus"

export default class extends Controller {
  static targets = [ "name" ]

  greet() {
    console.log(`Hello, ${this.name}!`)
  }

  get name() {
    return this.nameTarget.value
  }
}

(ファイルの場所がハンドブックと違うのは、railsプロジェクトに当てているから……前回参照)。

##それぞれ、何をやっているかというとーー
###data-controller


<div data-controller="hello">
    〜〜〜〜
</div>

→「div」に当てて、
 この「div〜〜/div」の範囲が「data-controller="hello"」の該当範囲だよー
 と教えている。

###data-action

  <button data-action="click->hello#greet">Greet</button>

→「button」に当てて、
 この「button」がドウコウした(今回なら「click」された)時、js側で何らかの動き(今回なら「helloのgreetメソッド」)を発生させるよー
 と言っている。

###data-target

  <input data-target="hello.name" type="text">

→「input」に当てて、
 上記【data-actionで発生するjs側の動き】の中では、このinput要素は「helloのname」として取得される2(あるいはjs側で用意した値を設定する3)よー
 と教えている。

#それぞれに対応するjs側の要素は……
###【data-controller】への対応→jsファイルそのもの
『【data-controller】が指定した該当範囲』内で発生した刺激(stimulus)については、『【data-controller名】_controller.js』にあるjs記述が処理を行う。

###【data-action】への対応→jsファイル内の関数

  greet() {
    console.log(`Hello, ${this.name}!`)
  }

『"〜〜〜〜->【data-controller名】#【data-action名】"』の刺激が発生すると、『【data-controller名】_controller.js』にある『【data-action名】と同名のメソッド』が起動する。

###【data-target】への対応→jsファイル内の記述、『static targets = [【target名】]』および『this.【target名】Target(s)』

  static targets = [ "name" ]

  get name() {
    return this.nameTarget.value
  }

【data-target】にされた要素は、js内では**this.【target名】Target(s)**としてデータを取得/設定する。この両者は、**static targets = [【target名】]**の記述により関連付けられる。

「Target」「Targets」の違いについては、また今度。

##で、結局つまりどういうこと?
###……たぶん、こういうこと。
スクリーンショット 2019-05-15 18.23.10.png

①:HTML側でアクション(ボタンのクリックとか)が発生し、それによってjs側の【action名と同じ名称のメソッド】が呼び出される。
②:「HTML側target要素」と「js側のThis."target名"Target(s)」は、「static targets ="target名"」の記述で関連付けられている。
③:「①」によって起動したメソッド内(あるいは、さらにそこから呼び出されたメソッド内)で、
  ・「This."target名"Target(s)」から値が取得される。
  ・「This."target名"Target(s)」に値を設定する。
 →「②」によって「This."target名"Target(s)」はHTML側の要素と関連付けられているので、この「値設定」「値取得」によりHTML要素の取得,設定が行われる。

とりあえず、概要はつかめたような気がする。
「Target」と「Targets」の違い、具体的な値の取得方法、アクションの種類などは、また追々……書けていけたらいいなぁ。

  1. というかこのstimulus、便利そうなのに触れている情報があんまりない。自分のを含め、Qiitaのタグに登録されている記事が3件だけ(2019年5月15日現在)って、なにさ!?

  2. js側から見ると、「data-target」の情報がinputされる。

  3. 同じくjs側から見ると、「data-target」の情報へ値をoutputする。

7
6
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
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?