2

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>

1 Answer 1

3

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>
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.