STIMULUS(二) —— Hello, Stimulus

图灵完备者
• 阅读 1543

学习 Stimulus 的最简单方式就是构建一个简单的控制器。这一章我们就来学习一个。

先决条件

要往下继续,你需要运行一个 stimulus-starter ,它是一个用于探索 Stimulus 的预配置骨架。

推荐使用 remixing stimulus-starter on Glitch ,这样就能完整地在浏览器里运行了,而且不需要再安装其他东西:
Remix on Glitch

或者,如果你喜欢使用自己的舒适的文本编辑器,您将需要克隆并设置stimulus-starter:

$ git clone https://github.com/stimulusjs/stimulus-starter.git
$ cd stimulus-starter
$ yarn install
$ yarn start请输入代码 

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

(注意 stimulus-starter 使用 Yarn 来管理依赖,你得先安装它。)

从 HTML 起步

我们从一个简单的练习开始:带按钮的文本域。点击按钮时,让文本域的值显示在控制台。

每个 Stimulus 项目都是从 HTML 开始的,此项目也不例外。编辑public/index.html并在<body>标签后面添加以下代码:

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

然后刷新页面,便能看到文本域和按钮了。

控制器为 HTML 带来生命力

作为其核心,Stimulus 的目标是自动将 DOM 元素连接到 JavaScript 对象。这些对象由控制器调用。

我们一起来通过拖拽框架内置的控制器类创建第一个控制器。在 src/controllers/ 文件夹里创建一个hello_controller.js文件。然后放入以下代码:

// src/controllers/hello_controller.js
import { Controller } from "stimulus"

export default class extends Controller {
}

链接控制器和 DOM 的标识符

下一步,我们需要告诉 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!了。

Actions Respond to DOM Events

现在,我们看下,如何修改代码让 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-targetinput 元素:

<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

点赞
收藏
评论区
推荐文章
Python进阶者 Python进阶者
4年前
Mysql查询语句进阶知识集锦
前言上次咱们简单的学习了一下select的用法,,对数据库大概有了一些基本的了解。咱们接着上次继续来看叭!查询数据如下or查询我们在上学时,会听到这样的话,某某某,你把谁谁谁或者谁谁谁叫过来。这样子的话,我们我们要查询的,就是一个或(or)的关系了。or查询只有满足一个条件即可sql语法SELECTfromstudentWHERE<条件or
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
JavaScript的 基本数据类型
第一:Javascript对象是第二:Javascript中第三:Javascript的对象是数据;第四:JavaScript中的对象可以简单理解成"名称:值"对(name:value)。名称(name):"名称"部分是一个JavaScript字符串参考https://www
Stella981 Stella981
3年前
Android 连接到网络
连接到网络这一节将告诉你如何实现一个连接到网络的简单的应用程序。它说明了一些最佳的实践,即使是在创建最简单的联网app时也应该遵守的。注意,要执行本节所描述的网络操作,你的应用的manifest必须包含如下的permissions:<usespermissionandroid:name"android.permissio
Stella981 Stella981
3年前
OFBiz 快速入门——续二
OFBiz快速入门——续二2011年03月17日星期四00:03OFBiz 快速入门2.5 创建一个文件,取名为(controller.xml),被OFBiz webapp控制器使用的。在没有额外增加功能时,这个文件内容非常的小与简单,如下:<?xml version"1.0" encoding"UTF8"?<siteco
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
React劲爆新特性Hooks 重构去哪儿网火车票PWA
第1章课程简介在这里,你可以知道为什么要学习这门课程,会学习到哪些内容,等等......你会了解到学习本课程所需要的先决条件第2章\操作篇\项目搭建万事万物,都要从项目搭建开始。这一章,你一定要跟着老师一步一步地操作!不然,你可能连门都进不去......第3章\新特性\React新特性一览这一章你
Stella981 Stella981
3年前
Golang的项目目录结构
1.简单型的项目目录结构如果我们只是开发一个小应用或者做一些简单的测试,那么完全没有必要根据官方的建议建立各种目录,只需要要一个文件夹中放置我们的源码文件,然后直接运行gobuild就可以,例如:gobuildhello.go然后编译器就会在当前目录下面生成一个hello.exe文件。我们
Stella981 Stella981
3年前
D3.js学习
什么是D3.js?一句话:D3.js是一个操纵数据的javascript库!从一个简单的例子开始学习一个新的东西其实很简单,我们先来一个效果图,然后我们再一条条改它的语句,对比呈现的效果来学习这条属性的作用,好了,下面就是我们要做的:看上去是不是挺复杂的呢?下面我们来看看他的源码到底是怎样的呢?!image(http://
Stella981 Stella981
3年前
Genesis
‍发布到Android平台在游戏制作完毕后,需要进行平台打包才能最终发布。Genesis3D是一个可以支持很多平台的编辑器,这一篇我们就来学习如何让你把制作出的游戏在Android平台上运行。1.首先,用户需要在本机安装JavaSDK和AndroidSDK。2.打开工程,选择编辑菜单下的“偏好设置”。!(h
Wesley13 Wesley13
3年前
JSP请求响应流程入门介绍
  一个完整的jsp请求响应流程可以简单的使用下图表示:  !(https://img2018.cnblogs.com/blog/1033563/201905/1033563201905201418342101444572240.png)  过滤器:直观的了解,就是对请求做一个过滤作用,比如身份验证,验证不通过的不让他继续往下走  Ser
图灵完备者
图灵完备者
Lv1
不堪肠断思乡处,红槿花中越鸟啼。
文章
3
粉丝
0
获赞
0