# Vue

> Ikiform に送信する Vue の単一ファイルコンポーネントと、シークレットキーを使う Nuxt のサーバールート。

Vue からは SDK または `fetch` でブラウザーから送信します。いつものセットアップ以外に、プラグインやビルドの手順は必要ありません。

## SDK をインストールする

`ターミナル`:

```bash
npm install @ikiform/sdk
```

## 単一ファイルコンポーネント

`ContactForm.vue`:

```vue
<script setup>
import { submit } from "@ikiform/sdk";
import { ref } from "vue";

const status = ref("idle");
const errors = ref({});
const message = ref("");

async function onSubmit(event) {
  status.value = "sending";
  const result = await submit("frm_xxxxxxxxxxxxxxxx", new FormData(event.target));
  if (result.ok) {
    status.value = "sent";
    return;
  }
  errors.value = result.error.fields ?? {};
  message.value = result.error.message;
  status.value = "error";
}
</script>

<template>
  <p v-if="status === 'sent'">Thanks, we got it.</p>
  <form v-else @submit.prevent="onSubmit">
    <label>
      Email
      <input name="email" type="email" required />
    </label>
    <p v-if="errors.email">{{ errors.email[0] }}</p>
    <label>
      Message
      <textarea name="message"></textarea>
    </label>
    <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
    <p v-if="status === 'error' && !errors.email" role="alert">{{ message }}</p>
    <button :disabled="status === 'sending'">Send</button>
  </form>
</template>
```

**Ikiform** の人間確認を使うフォームでは、[React のガイド](https://ikiform.com/ja/docs/guides/react.md#component)のように、`submit` の前に `challenge(formId)` を呼び出し、トークンを `{ turnstileToken }` として渡します。

## Nuxt のサーバールート

サーバーから送信したい場合は、シークレットキーを付けてボディを転送するサーバールートを追加します。ページからは自分のルートに JSON を送信します。ハイドレーション前のフォールバック付きで、ブラウザーから直接送信するコンポーネントについては [Nuxt](https://ikiform.com/ja/docs/guides/nuxt.md) を参照してください。

`server/api/contact.post.ts`:

```ts
export default defineEventHandler(async (event) => {
  const body = await readBody(event);
  return $fetch("https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx", {
    method: "POST",
    headers: { Authorization: `Bearer ${process.env.IKIFORM_SECRET_KEY}` },
    body,
    ignoreResponseError: true,
  });
});
```

> サーバーから送られる送信はすべてサーバーの IP アドレスから届くため、Ikiform の訪問者ごとのレート制限は全訪問者をまとめてカウントします。標準のプリセットは IP とフォームごとに 1 分あたり 5 件までなので、アクセスの多いサイトでは上限に達することがあります。可能ならブラウザーから送信するか、サーバーを経由するフォームでは緩めまたはカスタムの[レート制限](https://ikiform.com/ja/docs/rate-limits.md)を選んでください。
