Content for your app here
本文最初发布于 Rails Designer——Rails 应用程序的 UI 组件库,使用 ViewComponent 构建,使用 Tailwind CSS 设计并使用 Hotwire 增强。
如果您的应用程序有侧边栏导航(这在大多数屏幕足够宽的情况下很常见),那么调整其大小可能是一个很好的添加功能。进行此自定义允许您的用户根据手头的任务调整屏幕。也许他们想专注于编写下一个大作品,或者他们可能分割屏幕,使默认宽度有点太宽。
无论什么原因,使用 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 实用程序来帮助您)。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3