Stimulus 2: こんにちは、Stimulus

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://stimulus.hotwired.dev/handbook/hello-stimulus

Stimulusがどのように機能するかを学ぶ最良の方法は単純なコントローラーを作成することです。 この章ではその方法を説明します。

# 前提条件

先に進むにはStimulusを探索するための事前構成済みの空白の状態である[`stimulus-starter`](https://github.com/hotwired/stimulus-starter)プロジェクトの実行中のコピーが必要です。

[Glitchで`stimulus-starter`をリミックスして](https://glitch.com/edit/#!/import/git?url=https://github.com/hotwired/stimulus-starter.git)、何もインストールせずにブラウザーで完全に作業できるようにすることをお勧めします。

または、自分のテキストエディターで快適に作業したい場合は、`stimulus-starter`を複製してセットアップする必要があります。

```bash
$ git clone https://github.com/hotwired/stimulus-starter.git
$ cd stimulus-starter
$ yarn install
$ yarn start
```

次にブラウザーで http://localhost:9000/ にアクセスします。

（`stimulus-starter`プロジェクトは、依存関係の管理に[Yarnパッケージマネージャー](https://yarnpkg.com/)を使用することに注意してください。そのため、最初にそれがインストールされていることを確認してください。）

# すべてはHTMLから始まる

テキストフィールドとボタンを使った簡単な練習から始めましょう。ボタンをクリックするとテキストフィールドの値がコンソールに表示されます。

すべてのStimulusプロジェクトはHTMLから始まります。`public/index.html`を開き、`<body>`開始タグの直後に次のマークアップを追加します。

```html
<div>
  <input type="text">
  <button>Greet</button>
</div>
```

ブラウザーでページをリロードすると、テキストフィールドとボタンが表示されます。

# コントローラーはHTMLに命を吹き込みます

Stimulusの本質的な目的はDOM要素をJavaScriptオブジェクトに自動的に接続することです。これらのオブジェクトはコントローラーと呼ばれます。

フレームワークの組み込み`Controller`クラスを拡張して、最初のコントローラーを作成しましょう。`src/controllers/`フォルダーに`hello_controller.js`という名前の新しいファイルを作成します。 次に以下のコードを内部に配置します。

```javascript
// src/controllers/hello_controller.js
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
}
```

# 識別子はコントローラーをDOMにリンクする

次にこのコントローラーをHTMLに接続する方法をStimulusに伝える必要があります。`<div>`の`data-controller`属性に識別子を配置することでこれを行います。

```html
<div data-controller="hello">
  <input type="text">
  <button>Greet</button>
</div>
```

識別子は要素とコントローラーの間のリンクとして機能します。この場合、識別子`hello`は`hello_controller.js`でコントローラークラスのインスタンスを作成するようにStimulusに指示します。インストールガイドでコントローラーの自動ロードがどのように機能するかについて詳しく知ることができます。

# 動いていますか？

ブラウザーでページをリロードすると何も変わっていないことがわかります。コントローラーが機能しているかどうかは、どうすればわかりますか?

1つの方法は`connect()`メソッドにログステートメントを配置することです。このメソッドはコントローラーがドキュメントに接続されるたびにStimulusが呼び出します。

次のように`hello_controller.js`に`connect()`メソッドを実装します。

```javascript
// src/controllers/hello_controller.js
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  connect() {
    console.log("Hello, Stimulus!", this.element)
  }
}
```

ページを再度リロードし、開発者コンソールを開きます。`Hello, Stimulus!`が表示されるはずです。`<div>`の表現が続きます。

# ActionsはDOMイベントに応答します

次にコードを変更して、"Greet"ボタンをクリックしたときにログメッセージが表示されるようにする方法を見てみましょう。

`connect()`の名前を`greeting()`に変更することから始めます。

```javascript
// src/controllers/hello_controller.js
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  greet() {
    console.log("Hello, Stimulus!", this.element)
  }
}
```

ボタンのクリックイベントがトリガーされたときに`greet()`メソッドを呼び出します。Stimulusではイベントを処理するコントローラーメソッドをアクションメソッドと呼びます。

アクションメソッドをボタンのクリックイベントに接続するには`public/index.html`を開いてボタンに`data-action`属性を追加します。

```html
<div data-controller="hello">
  <input type="text">
  <button data-action="click->hello#greet">Greet</button>
</div>
```

## アクション記述子の説明

`data-action`値の`click->hello#greet`はアクション記述子と呼ばれます。この特定の記述子は次のように述べています。

- `click`はイベント名です
- `hello`はコントローラーの識別子です
- `greet`は呼び出すメソッドの名前です

ブラウザーにページをロードして開発者コンソールを開きます。"Greet"ボタンをクリックするとログメッセージが表示されるはずです。

# ターゲットは重要な要素をコントローラーのプロパティにマップする

テキストフィールドに入力した名前に挨拶するようにアクションを変更して演習を終了します。

そのためには、まずコントローラー内の入力要素への参照が必要です。次に値プロパティを読み取ってその内容を取得できます。

Stimulusを使用すると重要な要素をターゲットとしてマークできるため、対応するプロパティを介してコントローラーで簡単に参照できます。`public/index.html`を開き`data-hello-target`属性を入力要素に追加します。

```html
<div data-controller="hello">
  <input data-hello-target="name" type="text">
  <button data-action="click->hello#greet">Greet</button>
</div>
```

次にコントローラーのターゲット定義のリストに`name`を追加してターゲットのプロパティを作成します。Stimulusは最初に一致するターゲット要素を返す`this.nameTarget`プロパティを自動的に作成します。このプロパティを使用して要素の値を読み取り、挨拶文字列を作成できます。

試してみましょう。`hello_controller.js`を開き、次のように更新します。

```javascript
// src/controllers/hello_controller.js
import { Controller } from "@hotwired/stimulus"

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

  greet() {
    const element = this.nameTarget
    const name = element.value
    console.log(`Hello, ${name}!`)
  }
}
```

次にブラウザーでページをリロードし、開発者コンソールを開きます。入力欄にお名前を入力し、"Greet"ボタンをクリックしてください。 こんにちは世界！

# コントローラーはリファクタリングを簡素化します

Stimulusコントローラーはメソッドがイベントハンドラーとして機能するJavaScriptクラスのインスタンスであることがわかりました。

つまり、標準的なリファクタリング手法を自由に使用できるということです。 たとえば、`name`getterを抽出することで`greet()`メソッドをクリーンアップできます。

```javascript
// src/controllers/hello_controller.js
import { Controller } from "@hotwired/stimulus"

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

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

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

# まとめと次のステップ

おめでとうございます。これで最初のStimulusコントローラーが作成されました。

フレームワークの最も重要な概念であるコントローラー、アクション、およびターゲットについて説明しました。次の章ではこれらを組み合わせてBasecampから直接取得した実際のコントローラーを構築する方法について説明します。