npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

vue3-form-helper

v1.0.10

Published

A Vue 3 form helper to simplify form handling of a Single Page Application

Downloads

342

Readme

vue3-form-helper

Deal with forms in Vue 3 by using this Form Helper Plugin, detecting dirty state, validation, error handling and more.

Vue JS Seminar

Why is there a package?

If you are running an SPA (Single Page Application), you deal with forms differently than in a traditional server-side rendered application. You don't send the form data to the server and get a new page as a response. Instead, you send the form data to the server and get a JSON response. This package helps you to deal with forms in Vue 3 by providing a Form Helper Plugin, detecting dirty state, validation, error handling and more.

Installation

Run npm or yarn installation of the vue3-head package:

yarn

$ yarn add vue3-form-helper

npm

$ npm install vue3-form-helper

Set Up your Vue Application

Add the plugin to your Vue 3 application in the main.js or app.js file. You don't need to pass an axios instance, but if you want to use the axios instance, you can pass it as an argument.

The plugin itself runs without any further configuration, but nevertheless it makes things easier, especially when you want to define axios interceptors, error handling, and more.

Basic Setup

// app.js or main.js

import { createApp } from 'vue';
import App from './App.vue';
const app = createApp(App);

import { createFormPlugin } from 'vue3-form-helper';
const formPlugin = createFormPlugin(); // optional passing your axios instance
app.use(formPlugin);

app.mount('#app');

Setting up with global axios instance

// app.js or main.js

import { createApp } from 'vue';
import App from './App.vue';
const app = createApp(App);

// you can implement any kind of axios instance here 
import axios from 'axios';
const axiosInstance = axios.create({
    baseURL: 'https://fakeapi.andreaspabst.com', // Replace with your API base URL
});

import { createFormPlugin } from 'vue3-form-helper';
const formPlugin = createFormPlugin(axiosInstance);
app.use(formPlugin);

app.mount('#app');

Usage

Basic Usage

The most simple way of using the form helper is to import the useForm function and pass an object with the initial form values.

<script setup>
import { useForm } from "vue3-form-helper";

const form = useForm({
    name: 'Andreas Pabst',
    email: '[email protected]',
    age: 32,
    is_active: true,
    deleted_at: null,
});

async function submitForm() {
    try {
        await form.submit('POST', '/submit-form');
        alert('Form submitted successfully');
    } catch (error) {
        console.error(error);
    }
}

You then may use the form object in your template to bind the form values to the input fields. Please be aware that the form object is reactive and you can use the form object to bind the form values to the input fields. Therefor simply use the v-model directive and bind it on form.data.<field>. Of course you could implement multiple forms in your application and use the form object multiple times, e.g. yourForm.data.<field> or anotherForm.data.<field>. Don't forget to init each form with the const yourForm = useForm(...) function.

<template>
    <form @submit.prevent="submitForm">
        <input v-model="form.data.name" type="text" name="name" />
        <input @change="form.data.image = $event.target.files[0]" type="file" name="file" />
        <button type="submit">Submit</button>
        <button type="reset" @click.prevent="form.reset()">Reset</button>
    </form>
</template>

Uploading Images and Files

To upload images and files, you need to use the type="file" input field and bind the change event to the form data. As soon as you send the form data to the server, you need to force the form data to be sent as FormData.

forceFormData: true is the option you need to set to true if you want to upload files.

If you don't force the form data to be sent as FormData, the form data will be sent as JSON data. JSON data is the default behavior and within JSON it's not possible to send files, because the whole data will by stringified during the JSON.stringify process. If you want to send the form data as FormData, you need to set the forceFormData option to true.

const form = useForm({
    name: 'Andreas Pabst',
    image: null,
});

async function submitForm() {
    try {
        await form.submit('POST', '/submit-form', {
            forceFormData: form.data.image !== null, // forceFormData needs to be true if you want to upload files
        });
        alert('Form submitted successfully');
    } catch (error) {
        console.error(error);
    }
}

Error Bag Usage

<div class="d-flex justify-content-between">
    <label for="name" class="w-50">Name:</label>
    <input v-model="form.data.name" type="text" id="name" class="form-control" />
</div>
<span v-if="form.errors.name">{{ form.errors.name }}</span>

The error bag is a reactive object and you can use it to display error messages in your template. Typically its filled by the server response, but you can also add errors manually.

Check and Clear Errors

You can check if the form has errors by using the hasErrors method. If you want to clear the errors, you can use the clearErrors method.

<template>
    <form @submit.prevent="submitForm">
        <input v-model="form.data.name" type="text" name="name" />
        <button type="submit">Submit</button>
        <button type="reset" @click.prevent="form.reset()">Reset</button>
    </form>
    <span v-if="form.hasErrors('name')">{{ form.errors.name }}</span>
    <button @click="form.clearErrors('name')">Clear Errors</button>
</template>

Or you can generally check if the form has any errors by using the hasErrors method without any arguments.

<template>
    <form @submit.prevent="submitForm">
        <input v-model="form.data.name" type="text" name="name" />
        <button type="submit">Submit</button>
        <button type="reset" @click.prevent="form.reset()">Reset</button>
    </form>
    <span v-if="form.hasErrors()">There are errors in the form</span>
</template>

In the end you can easily clear all errors by using the clearErrors method without any arguments. Any time when the form will be submitted, the errors will be cleared automatically.

<template>
    <form @submit.prevent="submitForm">
        <input v-model="form.data.name" type="text" name="name" />
        <button type="submit">Submit</button>
        <button type="reset" @click.prevent="form.reset()">Reset</button>
    </form>
    <span v-if="form.hasErrors()">There are errors in the form</span>
    <button @click="form.clearErrors()">Clear All Errors</button>
</template>

Validation

The form helper provides a simple validation mechanism. You can define validation rules for each field in the form object. The validation rules are defined as a string and can be one of the following:

const form = useForm({
    name: '',
    email: '',
    age: null,
}, {
    name: 'string',
    email: 'string',
    age: 'number',
});

License

MIT

Resources

Software Tips