Suzed
Suzed

Reputation: 487

Rendering multiple components dynamically from an array

I am trying to render components dynamically within my child component named ChildTabs. I would like to render the components based on the array that passed into the component from the parent view named Contatcs.

So for example if I pass the the form_type from the contact_type named "Big" it would render on my tabs vue. However I have other data that contains more than one component I am trying to render, such as medium which contains multiple forms such as Red Green & Blue.

I have an idea of creating a for loop in my method using the prop data form_type, so I can retrieve my list of forms I am trying to call, but that is where I do not know what to do next. I am already importing the forms, I am not sure how to render them.

Any suggestions are welcomed.

Contacts.vue

<template>
    <div class="row">
          <ChildTabs
                :form_type="contact_types"
            />
    </div>
</template>


<script>
  'use strict';

  import ChildTabs from '../tabs';

  export default {
    name: 'contacts-view',
    data: function () {
        return {
            form_data: {},
            failed_validations: [],
            contact_type: '',
            contact_types: [
                {
                    label: 'Big',
                    value: 'big',
                    form_type: [
                        'Red'
                    ]
                },
                {
                    label: 'Medium',
                    value: 'medium',
                    form_type: [
                        'Red',
                        'Green',
                        'Blue'
                    ]
                },
                {
                    label: 'Small',
                    value: 'small',
                    form_type: [
                        'Blue',
                        'Green'
                    ]
                },
            ],
        }
    },

    props: {

    },

    computed: {

    },

    methods: {
    },

    components: {
        ChildTabs
    }
}
</script>

Tabs.vue

<template>
  <!--=============================================================-->
  <!-- Contact Forms -->
  <!--=============================================================-->
</template>

<script>
  'use strict';

  import Red from './forms/red';
  import Green from './forms/green';
  import Blue  from './forms/blue';

  export default {
    name: 'forms-tab',

    data: function () {
        return {
        }
    },

    props: {
        form_type: {
            type: Array,
            required: false,
            default: []
        },
    },

    computed: {

    },

    methods: {
        RenderComponent: function ()
        {
            this.$props.form_type
        }
    },

    created: function () {
      this.RenderComponent();
    },

    components: {
      Red,
      Blue,
      Green
    }
  }
</script>

Upvotes: 2

Views: 1704

Answers (1)

ittus
ittus

Reputation: 22393

You can use dynamic component in Vue

<template>
  <div>
    <div v-for="type in form_type" :key="type">
      <component :is="getCompentName(type)"/>
    </div>
    
  </div>
</template>

<script>
  export default {
    ...
    methods: {
      getCompentName(type) {
        switch (type) {
          case 'red':
            return 'red'
          case 'blue':
            return 'blue'
          case 'green':
            return 'green'
          default:
            return 'red'
        }
      }
    }
  }
</script>

Upvotes: 3

Related Questions