何为 Stimulus JS 以及如何在 Laravel 中使用

Laravel

Basecamp 团队已经发布了一个名为 Stimulus 的新 Javascript 框架 (v1.0.0),该框架于 1月 30日上市。Stimulus 与某些较流行的前端 JavaScript 框架大相径庭,声称 HTML 内容与行为之间的关系更加分离:

Stimulus 是一个有野心的 JavaScript 框架。与其他框架不同,Stimulus 不会接管您应用程序的整个前端。而是通过自动将元素连接到 JavaScript 对象来扩充 HTML。

该文档解释说,HTML 行为与内容之间的分隔是通过 data-controller 建立 HTML 到 JavaScript 的桥梁。

这是一个简单的示例,我认为这很易懂:

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

这是 hello 控制器代码:

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

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

Tdata-action="click->hello#greet" 按钮属性是这里的标签;您可以按以下方式细分值:

  • click 是事件名称
  • hello 是控制器标识符
  • greet 是要调用的方法的名称

我们可以将重要元素标记为目标,以在控制器中引用它们:

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

data-target 值是控制器名称和目标名称。在控制器中引用此值的方法如下:

// 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}!`)
  }
}

由于这是一个 JavaScript 类,因此我们可以受益于 name getter:

// 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
  }
}

这些例子来自 Hello Stimulus 简介。Stimulus 还可以直接使用 Turbolinks,这对于加速传统服务器端应用程序很有用。

您应该查看 安装指南 和 stimulus starter 以开始使用该框架。

在 Laravel 中使用 Stimulus

开始我还在 GitHub 快速存储库中试用 Stimulus,Turbolinks 和 Laravel  paulredmond/stimulus-laravel-demo. 这是我使其运行所需要做的所有事情的要点:

yarn add stimulus turbolinks
yarn add --dev babel-plugin-transform-class-properties

将以下内容添加到项目根目录中的 .babelrc 文件中:

{
    "plugins": ["transform-class-properties"],
    "presets": [
      ["env", { "modules": false }]
    ]
}

接下来,创建一个 resources/assets/js/controllers 文件夹,并在 resources/assets/js/app.js 文件中替换以下内容:

var Turbolinks = require("turbolinks")
Turbolinks.start()

import { Application } from "stimulus"
import { definitionsFromContext } from "stimulus/webpack-helpers"

const application = Application.start()
const context = require.context("./controllers", true, /\.js$/)
application.load(definitionsFromContext(context))

最后一个重要说明:

Turbolinks 必须位于 HTML 文档的 <head> 中。通过 XHR 获取文档后导航时会替换 <body>,因此脚本需要位于 <body> 标记之外。

因此只需将 app.js 文件添加到头部即可,如下所示:

<head>
  <!-- ... -->
  <link href="{{ mix('css/app.css') }}" rel="stylesheet" type="text/css" />
  <script src="{{ mix('js/app.js') }}"></script>
</head>

干杯!

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laravel-news.com/stimulus-javasc...

译文地址:https://learnku.com/laravel/t/41175

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2
Epona

Stimulus JS 体验很不错

4年前 评论

这不就是angularjs 1.*吗

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!