首页  >  文章  >  web前端  >  使用 Stimulus 创建可调整大小的导航

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

DDD
DDD原创
2024-09-13 06:17:10916浏览

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


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

Create a Resizable Navigation with Stimulus

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

<main data-controller="resizer" class="flex">
  <nav data-resizer-target="container" class="relative w-1/6">
    <!-- Imagine some nav items here -->
  </nav>

  <div class="w-5/6">
    <p>Content for your app here</p>
  </div>
</main>

上面的 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 `
      <span
        data-action="mousedown->resizer#setup"
        class="absolute top-0 w-1 h-full bg-gray-200 -right-px cursor-col-resize hover:bg-gray-300"
      ></span>
    `
  }
}

这将在导航元素(绝对定位)旁边注入处理程序。它还具有在 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 <= this.maxWidthValue) {
      this.containerTarget.style.width = `${width}px`;
    } else {
      this.containerTarget.style.width = `${this.maxWidthValue}px`;
    }
  }

  #stop() {
    this.resizingValue = false;

    document.removeEventListener('mousemove', this.resize);
    document.removeEventListener('mouseup', this.stop);
  }

  // …
}

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

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

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

以上是使用 Stimulus 创建可调整大小的导航的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn