Stimulus — это JavaScript-фреймворк, ориентированный на минимальное
вмешательство в существующую HTML-структуру и на управление поведением
страницы через декларативные атрибуты. Ключевой принцип Stimulus
заключается в связывании контроллеров с HTML-элементами посредством
data-* атрибутов.
Контроллеры Stimulus организуются как классы, наследующиеся от
Controller. Каждый контроллер может иметь свойство
targets, которое позволяет работать с дочерними
элементами DOM, и свойство values,
обеспечивающее реактивность данных.
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["output"]
static values = { count: Number }
connect() {
console.log("Контроллер подключен")
}
increment() {
this.countValue++
this.outputTarget.textContent = this.countValue
}
}
Ключевые элементы синтаксиса:
data-controller="name" — связывает элемент с
контроллером.data-action="event->controller#method" — определяет,
какое событие вызовет метод контроллера.data-target="controller.target" — обозначает дочерние
элементы для удобного доступа.data-value="type" — задаёт значения для реактивных
свойств.Санитизация данных — процесс очистки и нормализации пользовательского ввода или внешних данных перед использованием внутри контроллера. Важно предотвращать XSS-атаки, некорректное форматирование и ошибки при манипуляции DOM.
1. Экранирование HTML
Для вывода текста в DOM без интерпретации HTML:
function escapeHTML(str) {
const div = document.createElement('div')
div.textContent = str
return div.innerHTML
}
this.outputTarget.innerHTML = escapeHTML(userInput)
2. Ограничение типов значений
Использование values в Stimulus позволяет автоматически
приводить данные к нужному типу и минимизировать ошибки:
static values = { count: Number }
this.countValue = parseInt(this.countValue) || 0
3. Регулярные выражения для проверки формата
Для ввода чисел, e-mail или других структурированных данных регулярные выражения помогают отфильтровать недопустимые символы:
function sanitizeEmail(email) {
const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
return pattern.test(email) ? email : null
}
4. Ограничение длины и символов
Для текстовых полей и динамически добавляемого контента стоит проверять длину и запрещённые символы:
function sanitizeText(input, maxLength = 100) {
const sanitized = input.replace(/[<>]/g, "")
return sanitized.substring(0, maxLength)
}
Контроллеры Stimulus позволяют централизованно управлять данными и событиями. Санитизация выполняется обычно на этапе обработки событий:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["input", "output"]
sanitizeInput() {
const rawValue = this.inputTarget.value
this.outputTarget.textContent = this.escapeHTML(rawValue)
}
escapeHTML(str) {
const div = document.createElement('div')
div.textContent = str
return div.innerHTML
}
}
Важный момент: методы санитизации должны быть детерминированными и не модифицировать исходный объект непредсказуемым образом. Лучше возвращать новое значение, чем изменять оригинал.
values и
дополнительные проверки.innerHTML без предварительной очистки.При отправке данных на сервер необходимо не только локально санитизировать данные, но и проверять их на сервере. Для Stimulus полезно:
trim, toLowerCase,
parseInt).fetch('/submit', {
method: 'POST',
body: JSON.stringify({ name: sanitizeText(this.inputTarget.value) })
})
.then(response => response.json())
.then(data => {
this.outputTarget.textContent = escapeHTML(data.message)
})
Stimulus не конфликтует с другими фреймворками, но при использовании сторонних библиотек важно помнить:
value контроллера.Санитизация данных в Stimulus позволяет поддерживать безопасность, консистентность и предсказуемость работы интерфейсов, сохраняя минималистичный и декларативный подход фреймворка.