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