Maison > interface Web > js tutoriel > Stimulus avancé : options d'action personnalisées

Stimulus avancé : options d'action personnalisées

Linda Hamilton
Libérer: 2024-12-06 22:18:15
original
214 Les gens l'ont consulté

Advanced Stimulus: Custom Action Options

Cet article a été initialement publié sur Rails Designer


Stimulus vous permet d'enregistrer vos propres options d'action personnalisées. Ce sont les éléments que vous pouvez ajouter à une action, comme keypress->input#validate:prevent (comme indiqué dans l'article sur les fonctionnalités de stimulation que vous ne connaissiez pas). :prevent est une option d'action et empêchera l'événement par défaut. Les autres options disponibles sont : stop et :self.

Vous pouvez également créer le vôtre ! Vous permettant de tirer encore plus parti de Stimulus (qui aurait pensé qu'un cadre modeste avait de nombreuses fonctionnalités ?!).

Je souhaite énumérer quelques suggestions pour vous aider à avoir une idée de ce qu'ils peuvent faire et vous inspirer à créer les vôtres.

Les bases

Vous pouvez créer vos propres options d'action avec la méthode Application.registerActionOption. La méthode renverrait alors soit true, soit false, en fonction de la logique que vous avez ajoutée.

Les bases ressemblent à ceci :

// app/javascript/controllers/application.js
import { Application } from "@hotwired/stimulus"

const application = Application.start()

application.registerActionOption("fire", ({ event, value }) => {
  // any logic that returns true/false
}
Copier après la connexion
Copier après la connexion

Lorsqu'il renvoie true, l'action à laquelle elle est ajoutée s'exécutera. Utilisé comme ceci : click->controller#action:fire.

Maintenant que les bases sont claires, regardons quelques exemples sur la façon dont vous pourriez l'utiliser.

QuandDehors

Une action courante consiste à cliquer à l'extérieur d'un élément pour le masquer, par exemple avec des modaux ou des listes déroulantes. La logique serait quelque chose comme ceci :

application.registerActionOption("whenOutside", ({ event, element }) => {
  return !element.contains(event.target);
});
Copier après la connexion
Copier après la connexion

Et votre contrôleur Stimulus pourrait ressembler à ceci :

// app/javascript/controllers/dropdown_controller.js
import { Controller } from "@hotwired/stimulus";

export default class extends Controller {
  static targets = ["menu"];

  show() {
    this.menuTarget.removeAttribute("hidden");
  }

  hide() {
    this.menuTarget.setAttribute("hidden", true);
  }
}
Copier après la connexion

Puis dans votre HTML :

<div data-controller="dropdown">
  <button data-action="dropdown#show:stop">Show</button>

  <ul data-dropdown-target="menu" data-action="click@window->dropdown#hide:whenOutside">
  </ul>
</div>
Copier après la connexion

Ce n'est que lorsque vous cliquez en dehors du ul avec data-dropdown-target="menu" que la cible sera masquée. Avez-vous remarqué l'option d'action :stop ? Je l'ai exploré dans l'article sur les fonctionnalités de stimulation que vous (ne connaissiez pas).

Étranglé

Supposons maintenant que votre dropdown_controller.js dispose d'une méthode toggle et que vous souhaitez uniquement que vos utilisateurs la basculent toutes les 1 000 ms pour une raison quelconque (sans jugement !).

const throttles = new WeakMap();

application.registerActionOption("throttled", ({ element }, { wait = 1000 } = {}) => {
  if (!throttless.has(element)) {
    throttles.set(element, 0);
  }

  const now = Date.now();
  const lastRun = throttles.get(element);

  if (now - lastRun >= wait) {
    throttles.set(element, now);

    return true;
  }

  return false;
});

Copier après la connexion

Cela ne retournera vrai qu'une fois toutes les 1 000 ms.

? Carte faible ? WTF ?! Je travaille sur un livre donc ça fait moins peur ! Précommandez JavaScript pour les développeurs Rails.

Étendons le dropdown_controller.js avec une méthode toggle :

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  static targets = ["menu"];

  show() {
    this.menuTarget.removeAttribute("hidden");
  }

  toggle() {
    this.menuTarget.toggleAttribute("hidden");
  }

  hide() {
    this.menuTarget.setAttribute("hidden", true);
  }
}

Copier après la connexion

Utilisez-le comme ceci :

<div data-controller="dropdown">
  <button data-action="dropdown#show:stop:throttled">Show</button>

  <ul data-dropdown-target="menu" data-action="click@window->dropdown#hide:whenOutside">
  </ul>
</div>
Copier après la connexion

Vous voyez comment il est possible d'empiler les options d'action ? L'arrêt et l'étranglement sont utilisés.

AvecMetakey

Un autre exemple pourrait être lorsque vous souhaitez ouvrir la liste déroulante uniquement lorsque la touche meta () ou ctrl est enfoncée

application.registerActionOption("withMetaKey", ({ event }) => {
  return event.metaKey;
});
Copier après la connexion

Utilisez-le dans votre HTML comme ceci :

<div data-controller="dropdown">
  <button data-action="dropdown#show:stop:throttled:withMetaKey">Show</button>

  <ul hidden data-clicker-target="menu" data-action="click@window->dropdown#hide:whenOutside">
    <li>Menu Item</li>
  </ul>
</div>
Copier après la connexion

La liste déroulante ne s'affichera que lorsque vous appuierez également sur cmd/ctrl en cliquant.

Un de plus ? Un de plus !

AvecConfirmer

Voulez-vous afficher une boîte de dialogue de confirmation avant d'afficher la liste déroulante ?

// app/javascript/controllers/application.js
import { Application } from "@hotwired/stimulus"

const application = Application.start()

application.registerActionOption("fire", ({ event, value }) => {
  // any logic that returns true/false
}
Copier après la connexion
Copier après la connexion

Et dans votre HTML :

application.registerActionOption("whenOutside", ({ event, element }) => {
  return !element.contains(event.target);
});
Copier après la connexion
Copier après la connexion

Et toutes ces actions personnalisées empilées fonctionneront ! Pour l'exemple donné, ce n'est pas une utilisation pratique, mais il montre tout ce que vous pouvez faire avec eux.

Comme vous l'avez remarqué, j'aime nommer les options d'action personnalisées afin qu'elles soient faciles à comprendre lors de la lecture dans l'action :

  • cliquez sur @window->dropdown#hide:whenOutside;
  • cliquez->dropdown#show:withMetakey.

Préférence personnelle. Vous pouvez bien sûr les nommer comme vous le souhaitez.

Pour beaucoup de ces exemples, vous devrez normalement créer des actions distinctes, mais pas avec des options d'action personnalisées. Une fois que vous les aurez vus utilisés, vous découvrirez de nombreux cas d'utilisation.

? J'ai rassemblé ces options d'action personnalisées dans un petit package bien rangé appelé stimulus-fx ; assurez-vous de le vérifier! Contribuez si vous le trouvez utile !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal