Alex Béliveau
Alex Béliveau

Reputation: 63

Passing parents props to slot in Vue,js

I have in my application a DocumenContainer component which has multiple ChartContainer components. The ChartContainer has a slot in which I put various types of Charts (bar chart, Line Chart etc.). I would like to pass the data isOuput to the child component which is a slot

ChartContainer (simplified):

<template>
    <div class="card-body">
        <slot v-slot="isOutput"></slot>
     </div>
</template>
<script>
    export default {
        data() { 
            return {
                isOutput : false,
            }
        }
</script>

DocumentContainer:

<chart-container title="Stats Model" v-slot="slotProps" :documentId="id">
  {{slotProps.isOuput}}
  <v-bar-chart  :docId="id"></v-bar-chart>
</chart-container>

I tried passing the isOutput to the parent (DocumentContainer) with v-slot. The problem right now is that I'm only able to print {{slotProps.isOutput}}. I would like to pass that slotProps.isOutput as a props to the <v-bar-chart> and

 <v-bar-chart :isOuput="slotProps.isOutput" :docId="id"></v-bar-chart>

is giving me undefined in the bar-chart props. Is there a simpler way than to pass the data to the parent and to the child? How can I achieve this?

Upvotes: 4

Views: 5015

Answers (1)

Ja9ad335h
Ja9ad335h

Reputation: 5075

I think this is something to do with the context

It will work if you use v-bind instead

<v-bar-chart v-bind="{ isOutput: slotProps.isOutput, docId: id }"></v-bar-chart>

Example code

const Component1 = {
  template: `
  <div>
    <h2>Component 1</h2>
    <button @click="isOutput = !isOutput">Toggle</button>
    <slot :isOutput="isOutput"></slot>
  </div>
  `,
  data() {
    return {
      isOutput: false,
    }
  }
};

const Component2 = {
  props: ['isOutput'],
  template: `
  <div>
    <h2>Component 2</h2>
    isOutput: {{String(isOutput)}}
  </div>
  `
};

new Vue({
  el: '#app',
  components: {
    Component1,
    Component2
  }
});
<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script>
<div id="app">
  <h1>Home</h1>
  <Component1>
    <template v-slot="slotProps">
        isOutput: {{String(slotProps.isOutput)}}
        <Component2 v-bind="{ isOutput: slotProps.isOutput }">
        </Component2>
    </template>
  </Component1>
</div>

Upvotes: 5

Related Questions