Skip to content

evilkiwi/form

Folders and files

NameName
Last commit message
Last commit date

Latest commit

b96a4a6 · Nov 11, 2023

History

34 Commits
Nov 22, 2022
Nov 11, 2023
Nov 11, 2023
Nov 11, 2023
Nov 11, 2023
Feb 11, 2022
Nov 11, 2023
Nov 11, 2023
Nov 11, 2023
Jul 28, 2021
Nov 22, 2022
Nov 11, 2023
Nov 11, 2023
Nov 11, 2023
Nov 11, 2023
Jul 13, 2023
Nov 11, 2023
Nov 11, 2023

Repository files navigation

NPM Discord GPL-3.0-only

Form Handling and Validation Hook for Vue 3

@evilkiwi/form provides Vue 3 Hooks for consuming, validating and managing Forms.

Inspired by vue-hooks-form.

  • Asynchronous validation via async-validator
  • No forced HTML structure/format
  • Error handling
  • TypeScript

Installation

This package is available via NPM:

yarn add @evilkiwi/form

# or

npm install @evilkiwi/form

Usage

A simple example app is provided in the examples/simple folder.

<template>
  <form @submit.prevent="submit">
    <label for="email">Email Address</label>
    <input
      type="email"
      name="email"
      id="email"
      placeholder="Email Address"
      :disabled="loading"
      @focus="email.clearError"
      v-model="email.value"
    />
    <p class="err" v-if="email.error">{{ email.error.message }}</p>
    <label for="email">Password</label>
    <input
      type="password"
      name="password"
      id="password"
      placeholder="Password"
      :disabled="loading"
      @focus="password.clearError"
      v-model="password.value"
    />
    <p class="err" v-if="password.error">{{ password.error.message }}</p>
    <button type="submit" :disabled="loading">Login</button>
  </form>
</template>

<script lang="ts" setup>
import { useForm } from '@evilkiwi/form';

const { useField, handle, loading } = useForm<{
  email: string;
  password: string;
}>({
  defaults: {
    email: 'hello@example.com',
  },
});

const email = useField('email', {
  type: 'email',
  required: true,
});
const password = useField('password', {
  required: true,
});

const submit = handle(async ({ email, password }) => {
  alert(`Email: ${email} Password: ${password}`);
});
</script>

API

useForm

Options

Option Default Type Description
defaults {} Record<string, any> Optionally provide defaults for the various fields in this object by key -> value pairs.
validationMode submit 'change'|'submit' NOT IMPLEMENTED YET. Whether to validate input once submitted

Response

Option Type Description
useField Field<unknown> Documented below.
handle (run: values => Promise<void>) => async (e?: Event) => Promise<void> Registers the asynchronous handler that runs once a form is submitted and successfully validated.
reset () => void Reset the Form to tis default state.
validate () => Promise<boolean> Manually trigger validation and error handling.
clearErrors () => void Clear all errors for all fields.
loading Ref<boolean> Whether the form is currently executing.
destroy () => void Destroy and clean-up the Form handler. Happens automatically during onBeforeUnmount.

useField

Options

Currently the options object provided to useField is inheritted from async-validator and all options are forwarded as a validation field.

Response

Option Type Description
errors ValidateError[] An array of all Errors set against this Field.
error ValidateError|null Optimistically picks one, if any, of the Errors against the field.
hasError ComputedRef<boolean> Whether or not the Field has 1 or more errors.
setError (text: string) => void Manually set the error on this field.
clearError () => void Clears all Errors currently set against this Field.
value WritableComputedRef<unknown> The value for the field, compatible with v-model.

To-do

  • Add a test suite