Home Hello, Stimulus
Post
Cancel

Hello, Stimulus

了解 Stimulus 如何工作的最佳方法是构建一个简单的控制器,本章节将展示如何操作。

准备工作

为了练习,需要运行 stimulus-starter 项目的副本,这是一个为探索 Stimulus 进行了预配置的空白项目。

推荐使用 Glitch,这样可以完全在浏览器中运行而不需要安装任何东西。

如果更喜欢舒服的使用自己的编辑器,需要克隆并配置 stimulus-starter

1
2
3
4
git clone https://github.com/hotwired/stimulus-starter.git
cd stimulus-starter
yarn install
yarn start

然后在浏览器访问 http://localhost:9000/

注意:stimulus-starter 使用 Yarn 包管理器进行依赖管理,因此要确保首先安装它。

一切从 HTML 开始

从使用文本字段和按钮的简单练习开始。当单击该按钮时,将文本字段中的值显示在控制台。

每个 Stimulus 项目都从 HTML 开始。 打开 public/index.htmlbody 标签中添加一下内容:

1
2
3
4
<div>
  <input type="text">
  <button>Greet</button>
</div>

在浏览器中重新加载页面,应该可以看到文本字段和按钮。

控制器让 HTML 变的生动

Stimulus 的核心目的是自动将 DOM 元素连接到 JavaScript 对象。这些对象称为控制器。

通过扩展框架的内置 Controller 类来创建第一个控制器。在 src/controllers/ 目录中创建一个名为 hello_controller.js 的新文件。并添加以下代码:

1
2
3
4
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
}

用标识符将控制器与 DOM 链接

接下来,需要告诉 Stimulus 该控制器如何连接到我们的 HTML。这个通过在 div 标签的 data-controller 属性中放置一个标识符来实现:

1
2
3
4
<div data-controller="hello">
  <input type="text">
  <button>Greet</button>
</div>

标识符充当l了元素和控制器之间的链接,在本例中,hello 标识符告诉 Stimulushello_controller.js 中创建控制器类的实例。可以在 安装指南 中了解自动控制器加载的工作原理。

测试控制器是否工作

在浏览器中重新加载页面,会发现没有任何变化。那么如何知道控制器是否工作呢?

一种方法是在 connect() 方法中放置一条日志语句,每次控制器连接到 DOMStimulus 都会调用该语句。

1
2
3
4
5
6
7
import { Controller } from "@hotwired/stimulus"

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

再次重新加载页面并打开开发者控制台,会看到 Hello, Stimulus!,然后是 div 标签。

Actions 响应 DOM 事件

现在更改代码,在单击 “Greet” 按钮时显示日志消息.

首先将 connect() 重命名为 greet()

1
2
3
4
5
6
7
import { Controller } from "@hotwired/stimulus"

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

我们希望在按钮的 click 事件被触发时调用 greet() 方法。在 Stimulus 中,处理事件的控制器方法被称为 action 方法。

要将 action 方法连接到按钮的 click 事件,在 public/index.html 中向按钮添加 data-action 属性:

1
2
3
4
<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” 按钮时,应该会看到日志消息。

targets 将重要元素映射到控制器属性

最后通过更改 action 向在文本字段中输入的任何名称打招呼来完成练习。

为了做到这一点,首先需要一个对控制器内的输入元素的引用,然后读取 value 属性来获取其内容。

Stimulus 将重要元素标记为 targets,这样可以很容易的通过相应的属性在控制器中引用它们。打开 public/index.html 并将 data-hello-target 属性添加到 input 中:

1
2
3
4
<div data-controller="hello">
  <input data-hello-target="name" type="text">
  <button data-action="click->hello#greet">Greet</button>
</div>

接下来,通过将 name 添加到控制器的目标定义列表中来为目标创建一个属性。Stimulus 将自动创建一个 this.nameTarget 属性,该属性返回第一个匹配的目标元素。可以使用此属性来读取元素的值并构建问候字符串。

1
2
3
4
5
6
7
8
9
10
11
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 类的实例,其方法可以充当事件处理程序。这意味着可以使用拥有标准重构技术进行重构。例如,可以将 namegetter 方法提取出来,使 greet() 方法更简洁:

1
2
3
4
5
6
7
8
9
10
11
12
13
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
  }
}
This post is licensed under CC BY 4.0 by the author.

Stimulus 简介

Stimulus - Building Something Real