Skip to main content

Update a property of a Vuejs component which is used with v-for

Imagine you want to create a list with Vuejs.

To do this you will create a component (eg: "fueltypes") that will have a <li> element as template and that  you will include like this :

            <ul class="tabs">
                <fueltypes
                        v-for="fueltype in fueltypes"
                        v-bind:fueltype="fueltype"
                        :key="fueltype.value">
                </fueltypes>
            </ul>

Imagine now that you want apply a class on one of these rendered element when clicking on it. First, we would add an "on-click" event on each rendered element and that event would change a property of the component. A problem would be always present, if you click on the element, others elements that were already clicked would not change. To avoid this, you should add an event (eg: change-link-active) on the component and this event would change the property for each element :

           <ul class="tabs">
                <fueltypes
                        v-for="fueltype in fueltypes"
                        v-bind:fueltype="fueltype"
                        :link_active="link_active"
                        @change-link-active="link_active = $event"
                        :key="fueltype.value">
                </fueltypes>
            </ul>

In the method (changeActiveClass) called on the event "on-click" in our component it will be necessary to call $emit with a unique value (here fueltype.id) which will be passed in parameter to trigger our event "change-link-active". This unique value will be used for the condition to display the class or not on the element:

 <template>
  <li class="tab">
    <div class="col-md-12">
      <a v-bind:id="'fuel_type_'+fueltype.class"
         v-bind:href="'#'+fueltype.class"
         @click="changeActiveClass(fueltype.id)"
         v-bind:class="[fueltype.class, {active:link_active == fueltype.id} ]">
        {{ fueltype.label }}
      </a>
    </div>
  </li>
</template>
<script>
    export default {
        props: {
            fueltype: {
                type: Object,
                required: true
            },
            link_active: {
                type: Number,
                required: false
            },
        },
        methods: {
            changeActiveClass (id) {
                this.$emit('change-link-active', id);
            }
        },
    }
</script>

Tags