學習 Stimulus 的最簡單方式就是構建一個簡單的控制器。這一章咱們就來學習一個。html
要往下繼續,你須要運行一個 stimulus-starter ,它是一個用於探索 Stimulus 的預配置骨架。 git
推薦使用 remixing stimulus-starter on Glitch ,這樣就能完整地在瀏覽器裏運行了,並且不須要再安裝其餘東西:
Remix on Glitchgithub
或者,若是你喜歡使用本身的溫馨的文本編輯器,您將須要克隆並設置stimulus-starter:瀏覽器
$ git clone https://github.com/stimulusjs/stimulus-starter.git $ cd stimulus-starter $ yarn install $ yarn start請輸入代碼
而後在瀏覽器中訪問 http://localhost:9000/
。框架
(注意 stimulus-starter 使用 Yarn 來管理依賴,你得先安裝它。)編輯器
咱們從一個簡單的練習開始:帶按鈕的文本域。點擊按鈕時,讓文本域的值顯示在控制檯。 ide
每一個 Stimulus 項目都是從 HTML 開始的,此項目也不例外。編輯public/index.html
並在<body>
標籤後面添加如下代碼:學習
<div> <input type="text"> <button>Greet</button> </div>
而後刷新頁面,便能看到文本域和按鈕了。ui
做爲其核心,Stimulus 的目標是自動將 DOM 元素鏈接到 JavaScript 對象。這些對象由控制器調用。 this
咱們一塊兒來經過拖拽框架內置的控制器類建立第一個控制器。在 src/controllers/
文件夾裏建立一個hello_controller.js
文件。而後放入如下代碼:
// src/controllers/hello_controller.js import { Controller } from "stimulus" export default class extends Controller { }
下一步,咱們須要告訴 Stimulus 控制器應該怎樣鏈接到 HTML。在 <div>
的 data-controller
屬性中添加標識符便可:
<div data-controller="hello"> <input type="text"> <button>Greet</button> </div>
標識符充當了元素和控制器之間的連接。在此例中,標識符hello
告訴 Stimulus 去hello_controller.js
建立一個控制器的實例。在安裝指南中能夠了解更多關於如何動態加載控制器。
刷新頁面,你會看到任何改變都沒有。咱們應該如何知道控制器有沒有生效?
一種方式是在 connect()
方法中添加一個 log 狀態,控制器連接到
HTML 時 Stimulus 就會觸發它。
在 hello_controller.js
實現 connect()
方法:
// src/controllers/hello_controller.js import { Controller } from "stimulus" export default class extends Controller { connect() { console.log("Hello, Stimulus!", this.element) } }
刷新頁面,你就能在控制檯中看到Hello, Stimulus!
了。
如今,咱們看下,如何修改代碼讓 log 信息在點擊「Greet」按鈕時顯示。
首先,將 connect()
重命名爲 greet()
:
// src/controllers/hello_controller.js import { Controller } from "stimulus" export default class extends Controller { greet() { console.log("Hello, Stimulus!", this.element) } }
咱們想要在按鈕的點擊事件觸發時調用greet()
方法。在 Stimulus 中,處理事件的控制器方法叫作操做(action)方法。
將 action 方法鏈接到按鈕的點擊事件。public/index.html
並添加魔法屬性data-action
到按鈕上:
<div data-controller="hello"> <input type="text"> <button data-action="click->hello#greet">Greet</button> </div>
操做描述符(action descriptor)解釋
data-action
的值value click->hello#greet
被成爲操做描述符。這裏的意思是:
click
是事件名稱hello
是控制器標識符greet
要調用的方法名刷新頁面並打開開發者控制檯。你就能在點擊「Greet」按鈕時看到 log 信息了。
咱們即將完成這次練習,修改 action 使其對咱們輸入到文本域裏的任何名字都說 hello。
要實現它,首先咱們須要在控制器中引用 input
元素。而後就能經過讀取它的值獲取輸入的內容了。
Stimulus 讓咱們將重要元素標記爲目標(target),而後咱們就能輕鬆地在控制器中經過相應的屬性引用這些元素了。打開public/index.html
添加魔法屬性data-target
到 input
元素:
<div data-controller="hello"> <input data-target="hello.name" type="text"> <button data-action="click->hello#greet">Greet</button> </div>
﹟目標描述符(Target Descriptors)解釋
data-target
的值hello.name
被稱爲目標描述符. 這裏的意思是:
hello
是控制器標識符name
是目標的名稱
在咱們將 name
添加到控制器的目標描述符列表中時,Stimulus 會自動建立一個this.nameTarget
屬性,它會返回第一個匹配到的目標元素。咱們可使用這個屬性讀取元素的值並構建歡迎字符串。
咱們來試試。打開hello_controller.js
而後這樣修改:
// src/controllers/hello_controller.js import { Controller } from "stimulus" export default class extends Controller { static targets = [ "name" ] greet() { const element = this.nameTarget const name = element.value console.log(`Hello, ${name}!`) } }
而後刷新頁面,打開控制塔。在輸入框中輸入你的名字,點擊「Greet」按鈕。Hello, world!
咱們已經知道 Stimulus 控制器是 JavaScript 類的實例。該類的方法能夠做爲事件處理器使用。
這意味這咱們擁有了標準的重構技術兵工廠。好比,咱們能夠經過提取name
getter 來清理 greet()
方法:
// src/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 } }
恭喜!你寫出了你的第一個 Stimulus 控制器!
本文咱們覆蓋了該框架的核心概念:controllers, identifiers, actions, 和 targets。在下一章,咱們將瞭解如何組件這些東西構建正兒八經的控制器,呃,像 Basecamp 那樣。
Next: Building Something Real