”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Stimulus 创建可调整大小的导航

使用 Stimulus 创建可调整大小的导航

发布于2024-11-08
浏览:755

本文最初发布于 Rails Designer——Rails 应用程序的 UI 组件库,使用 ViewComponent 构建,使用 Tailwind CSS 设计并使用 Hotwire 增强。


如果您的应用程序有侧边栏导航(这在大多数屏幕足够宽的情况下很常见),那么调整其大小可能是一个很好的添加功能。进行此自定义允许您的用户根据手头的任务调整屏幕。也许他们想专注于编写下一个大作品,或者他们可能分割屏幕,使默认宽度有点太宽。

Create a Resizable Navigation with Stimulus

无论什么原因,使用 JavaScript 调整侧边栏导航(或任何其他组件)的大小都很容易,因此使用 Stimulus 也是如此。让我们开始吧。让我们在 HTML 中设置基础知识:

Content for your app here

上面的 HTML 使用的是 Tailwind CSS 类,但这对于本示例来说不是必需的。当然,您可以随心所欲地设计它。

现在是刺激控制器。正如您从上面注意到的,handler(可以拖动调整大小的元素)没有添加到 HTML 中,而是用 JS 注入。

import { Controller } from "@hotwired/stimulus"

// Connects to data-controller="resizer"
export default class extends Controller {
  static targets = ["container"];
  static values = {
    resizing: { type: Boolean, default: false },
    maxWidth: { type: Number, default: 360 } // in px
  };

  connect() {
    this.containerTarget.insertAdjacentHTML("beforeend", this.#handler);
  }

  // private

  get #handler() {
    return `
      
    `
  }
}

这将在导航元素(绝对定位)旁边注入处理程序。它还具有在 mousedown 事件上触发 setup() 的操作。我们来添加一下吧。

export default class extends Controller {
  // …
  connect() {
    this.containerTarget.insertAdjacentHTML("beforeend", this.#handler);

    this.resize = this.#resize.bind(this);
    this.stop = this.#stop.bind(this);
  }

  setup() {
      this.resizingValue = true;

      document.addEventListener('mousemove', this.resize);
      document.addEventListener('mouseup', this.stop);
  }
  // …
}

这是怎么回事?为什么不分别在 mousemove 和 mouseup 事件上添加 #resize() 和 #stop() 呢?这是为了确保当 resize 和 stop 作为事件侦听器调用时 this 引用控制器实例,保留对控制器属性和方法的访问。

让我们添加私有函数#resize()和#stop()。

export default class extends Controller {
  // …

  // private

  #resize(event) {
    if (!this.resizingValue) return;

    const width = event.clientX - this.containerTarget.offsetLeft;

    if (width 



#resize() 函数根据鼠标位置 (event.clientX) 计算容器的新宽度并更新容器的宽度,确保其不超过允许的最大宽度(在值中设置)。 #stop() 函数通过将 resizingValue 设置为 false 并删除事件侦听器来停止调整大小过程。

如果您转到浏览器,您现在可以调整浏览器的大小,并且不会使其宽度超过 maxWidth 设置的值(默认为 360px)。

太棒了! ?这就是使用 Stimulus 调整应用程序中元素大小所需的全部内容。从这里,您可以通过将值存储在用户设置中(例如通过 Redis)来改进,以便在浏览器之间保持相同,或者将其存储在浏览器的 LocalStorage 中以存储该会话(Rails Designer 通过为此提供 JS 实用程序来帮助您)。

版本声明 本文转载于:https://dev.to/railsdesigner/create-a-resizable-navigation-with-stimulus-mkk?1如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3