Skip to content
On this page

useField

useField(name: MaybeRef<string>, options?: UseFieldOptions<Value>) is a custom Vue composition api that will return the value, meta (state) and attributes of a specific field, you can also add validation to it.

Usage

vue
<script setup lang="ts">
import { useField } from '@vorms/core'

const { value, error, attrs } = useField<string>('drink', {
  validate(value) {
    return value ? 'This is required!!' : undefined
  }
})
</script>

<template>
  <div>
    <input v-model="value" type="text" v-bind="attrs" >
    <span>{{ error }}</span>
  </div>
</template>
<script setup lang="ts">
import { useField } from '@vorms/core'

const { value, error, attrs } = useField<string>('drink', {
  validate(value) {
    return value ? 'This is required!!' : undefined
  }
})
</script>

<template>
  <div>
    <input v-model="value" type="text" v-bind="attrs" >
    <span>{{ error }}</span>
  </div>
</template>

Params

name (Required)

The name of a specific field. Its type can be string, Ref<string> or () => string

  • Type MaybeRefOrGetter<string>

If you want to create a custom component in your application, such as <TextField />, you should use Ref<string> to retain reactivity for props.name. as follows:

vue
<script setup lang="ts">
import { useField } from '@vorms/core'

interface TextFieldProps {
  name: string
}

const props = defineProps<TextFieldProps>()

// or using `const nameSync = computed(() => props.name)`
// or using `const nameRef = toRef(props, 'name')`
const { value } = useField<string>(() => 'name')
</script>
<script setup lang="ts">
import { useField } from '@vorms/core'

interface TextFieldProps {
  name: string
}

const props = defineProps<TextFieldProps>()

// or using `const nameSync = computed(() => props.name)`
// or using `const nameRef = toRef(props, 'name')`
const { value } = useField<string>(() => 'name')
</script>

This is useful when you have a dynamic field name. e.g. the name is generated using a v-for loop.

vue
<template>
  <div v-for="(order, index) in orders" :key="order.id">
    <TextField :name="`order.${index}.name`" />
  </div>
</template>
<template>
  <div v-for="(order, index) in orders" :key="order.id">
    <TextField :name="`order.${index}.name`" />
  </div>
</template>

options

  • Type
ts
interface UseFieldOptions<Value> {
  // This function allows you to write your logic to validate your field, 
  // this is optional.
  validate?: FieldValidator<Value>;
};

type FieldValidator<Value> = (value: Value) => string | void | Promise<string | void>;
interface UseFieldOptions<Value> {
  // This function allows you to write your logic to validate your field, 
  // this is optional.
  validate?: FieldValidator<Value>;
};

type FieldValidator<Value> = (value: Value) => string | void | Promise<string | void>;

The validate is a field level validation. This property accepts the field's value as an argument. You can return a string or an undefined value to determine whether this value is valid or not, the string you return will be the error message for this field.

Returns

value

Current field's value.

  • Type Ref<Value>

error

Current field's error message.

  • Type ComputedRef<string>

touched

Returns true after the field has been blurred for the first time.

  • Type ComputedRef<boolean>

dirty

Return true if current field's value are not equal to initial value.

  • Type ComputedRef<string>

attrs

attrs is attributes that need to be bound to the field.

  • Type ComputedRef<FieldAttrs>

    ts
    interface FieldAttrs {
      // Field's name that you passed earlier.
      name: string;
      onBlur(event: Event): void;
      onChange(): void;
      onInput(): void
    };
    interface FieldAttrs {
      // Field's name that you passed earlier.
      name: string;
      onBlur(event: Event): void;
      onChange(): void;
      onInput(): void
    };
  • Example

    html
    <input v-model="value" type="text" v-bind="attrs" />
    <input v-model="value" type="text" v-bind="attrs" />

Released under the MIT License.