I am working on a multistep form in Vue and Formkit. It has four steps:
- Group Info
- Practices
- Locations
- Providers
Practices, Locations, and Providers are 'repeaters' - where you can add multiple groups of data, creating an array of objects.
{
"formSteps": {
"groupStep": {
"fullAddress": {},
"pointOfContact": {},
"contractApproval": {}
},
"practiceStep": {
"practices": [
{
"name": "test 1",
"id": "0"
},
{
"name": "test 2",
"id": "1"
},
{
"name": "test 3",
"id": "2"
}
]
},
"locationStep": {
"locations": [
{
"practiceId": "0",
"name": "ent office",
"id": "0",
"emr": {},
"fullAddress": {},
"officeManager": {}
},
{
"practiceId": "1",
"name": "dentist office",
"id": "1",
"emr": {},
"fullAddress": {},
"officeManager": {}
}
]
},
"providerStep": {
"providers": [
{
"id": "0",
"practice": "0",
"primaryLocation": ""
}
]
}
}
}
In the Providers step, there is a "Practice" select where the options are created by iterating over formSteps.practiceStep.practices.
<FormKit
type="select"
label="Practice"
name="practice"
:id="`provPractice_${index}`"
>
<option value="" selected disabled>Select a practice...</option>
<option v-for="(practice, index) in formData.formSteps.practiceStep.practices" :key="index" :value="practice.id">{{ practice.name }}</option>
</FormKit>
<FormKit
type="select"
label="Primary Location"
name="primaryLocation"
:id="`provPrimaryLocation_${index}`"
v-model="`provPractice_${index}`.value"
>
<option value="" selected disabled>Select a location...</option>
<!-- Dynamically rendered options that match practiceId here -->
</FormKit>
Underneath it is a "Primary Location" select where the options needs to be dynamically rendered by comparing the value of the option selected in "Practice" to practiceID in formSteps.locationStep.locations, and if they equal, populate the matching options.
What would be the best way to tackle this?
FormKit documentation offers a flat, simple example here
<script>
const flavors = computed(() => {
if (formData.value.food === 'Ice Cream') {
return ['Chocolate', 'Vanilla']
}
return ['Pepperoni', 'Cheese']
})
</script>
<template>
<FormKit type="form" v-model="formData">
<FormKit
type="select"
label="Food"
name="food"
:options="['Pizza', 'Ice Cream']"
/>
<FormKit
type="select"
label="Flavor"
name="flavor"
:options="flavors"
/>
</FormKit>
</template>
I'm just unsure on how to do something similar with the more complex data in my case.