alya-forms v2.0.0
Alya Forms
Have you ever needed to show something to the user and send something else to the server? Or have an input display a certain kind of data, but work with a different object internally? Alya Forms can help you achieve that!
Installing
npm install alya-formsGetting started
How does it work
In Alya Forms, your input data is stored in an Attribute. The attribute consists of an object with two properties, display and value, as shown below:
{ display: 'Carlos Eduardo', value: '507f1f77bcf86cd799439011' } The display property is the one that the user sees, and the value is the one that only you will see and work with.
For example: Let's say that we're coding an input that searches for a person in the database as the user types in it. The data of this input can be represented as in the example above. The user will see the name of the person in the input, but the application will have their ID internally to send to the backend when needed.
How can I implement it
The library provides you with two exports:
- The
useFormhook, recommended for creating custom forms that take advantage of the library's full resources, such as reacting todatachanges and updating values programmatically withupdate.
const { data, connect, update, reset } = useForm({ initialData: initialData })- The
Formcomponent, recommended for simpler forms when you just need to submit the data.
<Form onSubmit={handleSubmit}
render={(form: AlyaForms.Form) => (
<>
<YourInput {...form.connect('firstName')} type="text" placeholder="First name"/>
<button type="submit">Submit</button>
</>
)}
/>To use both, you'll need to implement the connect API into your inputs first:
Connecting an input
To connect an input, the library provides you with the method connect:
<YourInput {...connect('firstName')} type="text" placeholder="First name"/>This method exposes the properties name and attribute, the hook useAttribute, and the method setAttribute:
nameis the name of the attribute in thedataobject (represented by firstName in the example above).attributeis the value of the attribute in thedataobject.useAttributeis a hook to initialize the attribute in thedataobject.setAttributeis a function to set the value of the attribute in thedataobject.
A basic TypeScript input component implementing these properties would look like this:
import React, { forwardRef, memo } from 'react'
import type { AlyaForms } from 'alya-forms'
type BasicInputProps = Omit<React.ComponentPropsWithoutRef<'input'>, 'onChange'> & AlyaForms.Connect & {
onChange?: (event: React.ChangeEvent<HTMLInputElement>, attribute: AlyaForms.Attribute) => void
}
const BasicInput = memo(forwardRef<HTMLInputElement, BasicInputProps>(function ({
name,
attribute = {},
setAttribute,
useAttribute,
onChange,
...props
}, ref) {
useAttribute()
function handleChange(event: React.ChangeEvent<HTMLInputElement>) {
const inputValue = event.target.value
const attribute = { display: inputValue, value: inputValue }
setAttribute(attribute)
if (onChange) onChange(event, attribute)
}
return (
<input
{...props}
name={name}
value={attribute.display || ''}
onChange={handleChange}
ref={ref}
/>
)
}))The component above receives the four connect properties and implements them as follows:
nameis used in the name prop of the input.attributeis used in the value prop of the input (note that we use the display key).useAttributeis called to initialize the attribute.setAttributeis called in handleChange to update the attribute.
!TIP To ensure the best performance for your form, always wrap the input component with React's
memo()function, just like in the example. This ensures that the input will only re-render when its properties change.
Examples
In the examples directory, you can find two projects that use the library: one in JavaScript and another in TypeScript. The examples show how to load initial data into the form and programmatically update an attribute using both the useForm hook and the Form component.
Types and Reference
To write...