2017-05-26 6 views
1

Was ist der beste Weg, um den Titel {{post.name}} und Bild post.imgAttribution von Tile-Komponente zu Modal-Komponente zu übergeben, so dass beide Elemente die gleichen Daten anzeigen, wenn die Taste gedrückt wird?Daten an die modale Komponente an vueJS übergeben

<div id="root" class= "container"> 
    <hero-component></hero-component> 
    <div class="tile is-ancestor"> 
     <tile-component v-for="post in posts" :key="post.id"> 
      <template slot="header-title">{{post.name}}</template> 
      <template slot="content-photo"><img :src= "post.imgAttribution"/> </template> 
      <template slot="button-modal"> 
       <modal-component v-show="showModal" @close="showModal = false"></modal-component> 
       <a class="button is-primary" v-on:click="showModal=true">Show Cat</a> 
      </template> 
     </tile-component> 
    </div> 
</div> 

Komponenten:

var HeroComponent = Vue.component('hero-component', { 
template: ` 
     <div> 
      <section class="hero"> 
         <div class="hero-body"> 
         <div class="container"> 
          <h1 class="title"> 
          Cat Gallery 
          </h1> 
         </div> 
         </div> 
      </section> 
     </div>`}); 

    var TileComponent = Vue.component('tile-component', { 
     template:` 
     <div> 
       <div class="tile is-parent"> 
       <article class="tile is-child box"> 
        <p class="title"> 
        <slot name="header-title"></slot> 
       </p> 
       <p class="content-photo"> 
        <slot name="content-photo"></slot> 
       </p> 
        <slot name="button-modal"></slot> 
      </article> 
      </div> 
     </div> 
    </div>`}); 

    var ModalComponent = Vue.component('modal', { 
    template: ` 
    <div> 
     <div class="modal is-active"> 
      <div class="modal-background"></div> 
       <div class="modal-card"> 
        <header class="modal-card-head"> 
         <p class="modal-card-title"> 
          <!-- title from tile-component -!> 
         </p> 
        <button class="modal-close" @click="$emit('close')" ></button> 
        </header> 
        <section class="modal-card-body"> 
         <div class="modal-content"> 
          <p class="image is-4by3"> 
           <!-- image from tile-component -!></p> 
         </div> 
        </section> 
       </div> 
      </div> 
    </div>`}); 

    Vue.component('modal-component', ModalComponent); 

    new Vue({ 
     el: '#root', 
     data: { 
      showModal: false, 
      posts: [], 
      errors: [] 
     }, 
     component: { 
      'hero-component': HeroComponent, 
      'modal-component': ModalComponent, 
      'tile-component': TileComponent 
     }, 
     created() { 
      axios.get('http://localhost:3000/Cat/') 
      .then(response => this.posts = response.data) 
      .catch(e => this.error.push(e)); 
     } 
    }); 

Antwort

1

Sie sind bereits Slots verwenden, warum nicht weiter?

var ModalComponent = Vue.component('modal', { 
    template: ` 
     <div> 
     <div class="modal is-active"> 
      <div class="modal-background"></div> 
      <div class="modal-card"> 
      <header class="modal-card-head"> 
       <p class="modal-card-title"> 
       <slot name="title"></slot> 
       </p> 
       <button class="modal-close" @click="$emit('close')" ></button> 
      </header> 
      <section class="modal-card-body"> 
       <div class="modal-content"> 
       <p class="image is-4by3"> 
        <slot name="image"></slot> 
       </p> 
       </div> 
      </section> 
      </div> 
     </div> 
     </div> 
`}); 

Und übergeben Sie die Werte auf diese Weise. Hier verwende ich einen Header und ein IMG-Element, aber Sie könnten tun, was Sie wollen.

<modal-component v-show="showModal" @close="showModal = false"> 
    <h1 slot="title">{{post.name}}</h1> 
    <img slot="image" :src="post.imgAttribution" alt="" /> 
</modal-component> 
+0

Großartig es funktioniert gut, danke! Das Problem ist nun, dass Modal-Komponente nur das letzte Element in den Posts anzeigt. Hattest du einen Hinweis, das zu beheben? – Manoxs

+0

@Manoxs es ist nicht so, dass der letzte angezeigt wird, dass * alle * angezeigt werden. Alle deine Mods arbeiten mit einem Wert, 'showModal'. Hier ist eine Möglichkeit, wie du das umgehen kannst. https://codepen.io/Kradek/pen/xdeGmy?editors=1010 – Bert

+0

Erstaunlich, vielen Dank! – Manoxs

Verwandte Themen