5

I'm trying to make some reusable template of slot element of VueJS, but it doesn't work well.

The problem I'm facing looks like this. I made 3 Vue files to construct some template.

  1. Guide.vue which will be unit of for loop.
  2. ListView.vue importing ListTemplate.vue and Guide.vue
  3. ListTemplate having a v-for loop for rows props from ListView.vue and a slot for Guide.vue.

I want to pass row props yielding from v-for loop to Guide.vue through the slot but it seems to be undefined. So i tried to declare slot-scope on template wrapping component element on ListView.vue, but it doesn't work.

// Guide.vue
<template>
    <tr onclick="location.href='info_view.html'">
        <td>
            <p class="alarm_h1">{{ slotProps.row.title }}</p>
            <p class="alarm_h2">{{ slotProps.row.title }}</p>
            <p class="alarm_h2">{{ slotProps.row.title }}</p>
        </td>
    </tr>
</template>

<script>
  export default {
    name: "guide",
    props: ['slotProps', 'row']
  }
</script>


// List.vue
<template>
    <div>
        <Guide-head/>
        <List-template :rows="guides">
            <template>
                <component :is="tr_component"></component>
            </template>
        </List-template>
    </div>
</template>

<script>
  import Guide from '../../../components/template/list/tr/Guide'
  import GuideHead from '../../../components/template/head/GuideHead'
  import ListTemplate from '../../../components/template/list/ListTemplate'
  export default {
    name: "list",
    components: {
      Guide,
      GuideHead,
      ListTemplate
    },
    data() {
      return {
        guides: [
          {id: 1, date: '2018.08.20 15:00', title: 'title 1', emergency: false},
          {id: 2, date: '2018.08.20 15:00', title: 'title 2', emergency: false},
          {id: 3, date: '2018.08.20 15:00', title: 'title 3', emergency: false}
        ],
        tr_component: 'guide'
      }
    }
  }
</script>

// ListTemplate.vue
<template>
    <div>
        <table class="reser_check_table" cellpadding="0" cellspacing="0">
            <div v-for="(row, idx) in rows" @click.native="clickNotice(idx)" :key="row.id">
                <slot v-bind:row="row">{{row.title}}</slot>
            </div>
        </table>
    </div>
</template>

<script>
  export default {
    name: "list",
    props: ['rows'],
    /*components: {
      rowTemplate: Row
    },*/
    methods: {
      clickNotice(idx) {
        console.log('clicked');
        //this.$emit('viewNotice', idx);  @viewNotice="view"
      },
      view() {

      }
    }
  }
</script>
Husam Ibrahim
  • 6,999
  • 3
  • 16
  • 28
demyank
  • 81
  • 6

0 Answers0