I know that v-if
should not be used to filter elements from a list and a computed prop
should be used instead, but what if I need to render a different thing depending on a prop from that list ?
Example: I have a list of objects, I loop through it with `v-for’ and depending on a prop in that object I render one of 2 components.
myList: [ { name: 'James', occupation: 'sailor' }, { name: 'Marco', occupation: 'baker' }, ] <div v-for="(person, index) in myList" :key="index"> <ComponentOne :name="person.name" v-if="person.occumation == sailor"> <ComponentTwo :name="person.name" v-if="person.occumation == baker"> </div>
Is this a valid case since every object inside the list needs to be shown ? I know I can use computed props and 2 loops but that way I lose the order of the objects, in My scenario I need to show a different component depending on that “occupation” prop and keep them in order.
Is this A valid use of v-if
v-for
since I’m not using them both on the same element ?
The broader question I guess is: Is it fine to use v-if
inside v-for
, the guidelines only specify not using them on the same element ?
Advertisement
Answer
I think better way is to use Dynamic Components. You can keep track of component with occumation
and use it in v-for
.
data() { return { myList: [ { name: 'James', occupation: 'sailor' }, { name: 'Marco', occupation: 'baker' } ], componentMapper: { sailor: 'ComponentOne', baker: 'ComponentTwo' } } } <div v-for="(person, index) in myList" :key="index"> <component :is="componentMapper[person.occumation]" v-bind="{ name: person.name }"> </div>
Don’t forget to register ComponentOne && ComponentTwo
components