首頁 > web前端 > js教程 > 使用 Alpine.js 的高階表單

使用 Alpine.js 的高階表單

Patricia Arquette
發布: 2025-01-03 06:24:44
原創
729 人瀏覽過

Advanced forms with Alpine.js

本文中的文字部分由 ChatGPT 和 DeepL Write 生成,並由我們修正和修改。

如果您還不熟悉使用 Alpine.js 處理表單,您可以在我們關於此主題的第一篇文章《使用 Alpine.js 的互動式表單》中刷新您的知識。

在我們第一篇關於使用 Alpine.js 進行互動表單的文章中,我們已經指出,除了在表單中一般顯示伺服器端資訊之外,Alpine.js 還可以用於影響單一元素。

由於大眾的需求,我們決定在這篇後續文章中專門討論這個主題,並展示如何使用資訊和狀態透過 Alpine.js 驗證表單的範例。

設定

在本次示範中,我們使用 Astro Boilerplate,
我們已經在之前的文章中詳細介紹過。

如果我們的樣板不適合您,那也不是問題。驗證表單條目的步驟適用於任何使用 Alpine.js 的項目。

Alpine.js 的整合方法

為了能夠在後續的實作過程中從 Alpine.js 存取所需的資料和方法,首先聲明這些資料和方法,以避免後續過程中出現錯誤。

表單.ts

form()控制載入狀態,並保存伺服器透過submit()方法傳送的Response,該方法在表單提交時執行。

還包括一個虛構的 fakeResponse(),它從我們虛構的後端「接收」範例性和簡化的驗證錯誤。

import { sleep } from "../utilities";

export const form = () => ({
  loading: false,
  response: null as unknown,

  async submit(event: SubmitEvent) {
    this.loading = true;
    this.response = null;
    const formData = new FormData(event.target as HTMLFormElement);

    /**
     * Replace the following fake response with your `fetch` request and
     * receive the validated results from the server side as JSON.
     *
     * Make sure you add the necessary attributes to the `<Input />'
     * elements to perform client-side validation as well.
     */

    const fakeResponse = async () => {
      await sleep(1000); // Mock response time

      return {
        errors: {
          // [input.name]: "message string"
          username: "Username is alrady taken",
          password: "Password is too short",
        },
      };
    };

    this.response = await fakeResponse();
    this.loading = false;
  },
});
登入後複製
登入後複製

回應必須包含一個錯誤對象,其中每個鍵值對由輸入元素的名稱和關聯的驗證錯誤組成。

輸入.ts

input.ts 透過 validate() 方法處理輸入元素驗證錯誤的顯示,該方法透過 x-effect 屬性集成,以便在提交表單時重新計算要顯示的資料。

export const input = () => ({
  error: null as unknown,

  validate() {
    if (!this.response?.errors?.[this.$el.name]) return (this.error = null);
    this.error = this.response.errors[this.$el.name];
  },
});
登入後複製

全域變數.ts

最後,為此步驟匯入為 Alpine.js 聲明的方法,並在 EventListener alpine:init 中註冊,以便能夠存取所需的範圍。

import Alpine from "alpinejs";
import { app } from "./alpine/app";
import { form } from "./alpine/form";
import { input } from "./alpine/input";

// Await Alpine.js initialization
document.addEventListener("alpine:init", () => {
  Alpine.data("app", app);
  Alpine.data("form", form);
  Alpine.data("input", input);
});

Alpine.start();
登入後複製

聲明可選的實用方法

為了讓我們也可以使用輸入元素的名稱作為標籤,我們創建了大寫方法,該方法分割以短橫線大小寫形式編寫的字串(例如:「電子郵件地址」 )並將每個單字大寫。

如果您決定不使用大寫,則必須刪除 input.astro 元件中對應的引用

import { sleep } from "../utilities";

export const form = () => ({
  loading: false,
  response: null as unknown,

  async submit(event: SubmitEvent) {
    this.loading = true;
    this.response = null;
    const formData = new FormData(event.target as HTMLFormElement);

    /**
     * Replace the following fake response with your `fetch` request and
     * receive the validated results from the server side as JSON.
     *
     * Make sure you add the necessary attributes to the `<Input />'
     * elements to perform client-side validation as well.
     */

    const fakeResponse = async () => {
      await sleep(1000); // Mock response time

      return {
        errors: {
          // [input.name]: "message string"
          username: "Username is alrady taken",
          password: "Password is too short",
        },
      };
    };

    this.response = await fakeResponse();
    this.loading = false;
  },
});
登入後複製
登入後複製

在 Astro 中建立頁面和元件

在接下來的步驟中,我們建立表單所需的頁面和元件。我們定義一個;元件並將其整合到表單區塊中。

輸入.astro

input.astro 組合了元素 ;和在一個元件中,也包含驗證錯誤的表示,這些錯誤透過 Alpine 上下文輸入進行對應。

---
從“@/scripts/utilities”導入{大寫}

const { 名稱, ...props } = Astro.props
---

<div>



<h3>
  
  
  索引.astro
</h3>

<p>index.astro 代表我們的表單區塊並使用預定義元件 <input>>並以表單上下文補充其邏輯,以便可以顯示來自回應物件的錯誤。 </p>

<p>而我們的元件 <input>>處理驗證錯誤的顯示,我們將各個輸入元素的停用屬性綁定到載入狀態,以防止在處理過程中多次提交表單。 <br>
</p>

<pre class="brush:php;toolbar:false">---
從“@/layouts/root.astro”導入根
從“@/components/input.astro”導入輸入

常量元 = {
  標題:“Alpine.js 的高級表單”
}
---


  
    




<hr>

<h2>
  
  
  長話短說
</h2>

<p>透過 Alpine.js,我們示範了來自後端的驗證錯誤如何動態顯示在表單中,以及輸入元素如何對瀏覽器中的對應事件做出反應。 </p>


          
登入後複製

以上是使用 Alpine.js 的高階表單的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板