2
votes

VueJS, passer des données d'un composant à un autre

Je fais quelque chose de nouveau pour moi et j'ai un problème .. Alors expliquons un peu plus ..

J'ai un composant avec le nom components/HomeComponent.vue

Ici est:

HomeComponent.vue

<script>
// @ is an alias to /src
import HomeComponent from "@/components/HomeComponent.vue";

export default {
  name: "home",
  components: {
    HomeComponent
  },
};
</script>

et j'ai ma "vue" vues / Home.vue

<template>
  <!-- Blog Entries Column -->
  <div class="col-md-8">
    <h1 class="my-4">Статии</h1>

    <!-- Blog Post -->
    <div class="card mb-4" v-for="post in posts">
      <div class="card-body">
        <h2 class="card-title">{{ post.title }}</h2>
        <p class="card-text">{{ post.body }}</p>
        <a href="#" class="btn btn-primary">Read More &rarr;</a>
      </div>
      <div class="card-footer text-muted">
        Posted on January 1, 2017 by
        <a href="#">xxx</a>
      </div>
    </div>
  </div>
</template>

Je souhaite donc accéder aux messages de mon Home.vue et make for loop .. Comment faire ça? Merci pour les conseils! :)

<script>
export default {
  name: "HomeComponent",
  data() {
    posts: [
      { title: "Hello", body: "Some text" },
      { title: "Hello", body: "Some text" },
      { title: "Hello", body: "Some text" },
      { title: "Hello", body: "Some text" }
    ];
  }
};
</script>


1 commentaires

Non .. mon HomeComponent contient du html que je ne l'ai pas inclus ici


4 Réponses :


2
votes

Vous devrez transmettre vos données en tant qu'accessoires au composant Home. Plus d'informations peuvent être trouvées ici . Mais voici une solution rapide à votre problème.

<template>
  <comp :posts="posts"></comp>
</template>

<script>
import Comp from './components/Comp.vue'
export default {
  name: "HomeComponent",
  components: {
    'comp': Comp
  },
  data() {
    posts: [
      { title: "Hello", body: "Some text" },
      { title: "Hello", body: "Some text" },
      { title: "Hello", body: "Some text" },
      { title: "Hello", body: "Some text" }
    ];
  }
};
</script>

HomePage.vue

<template>
  <!-- Blog Entries Column -->
  <div class="col-md-8">
    <h1 class="my-4">Статии</h1>

    <!-- Blog Post -->
    <div class="card mb-4" v-for="post in posts">
      <div class="card-body">
        <h2 class="card-title">{{ post.title }}</h2>
        <p class="card-text">{{ post.body }}</p>
        <a href="#" class="btn btn-primary">Read More &rarr;</a>
      </div>
      <div class="card-footer text-muted">
        Posted on January 1, 2017 by
        <a href="#">xxx</a>
      </div>
    </div>
  </div>
</template>

<script>
 export default {
   props:['posts']
 }
</script>


0 commentaires

2
votes

Les données sont transmises aux composants enfants à l'aide d'accessoires. Vous pouvez utiliser emit pour le transmettre au composant parent.

<template>
  <div>
    <HomeComponent v-on:posts="getPosts($event)"></HomeComponent>
  </div>
</template>
<script>
  export default {
    data () {
      return {
        posts: []
      }
    },
    methods: {
      getPosts(e) {
        this.posts = e; 
      }
    }
  }
</script>

Ensuite sur Home.vue, vous écoutez un changement d'événement en utilisant ceci

data() {
  posts: [
    { title: "Hello", body: "Some text" },
    { title: "Hello", body: "Some text" },
    { title: "Hello", body: "Some text" },
    { title: "Hello", body: "Some text" }
  ];
},
mounted () {
  this.$emit('posts', this.posts);
}
  


0 commentaires

1
votes

XXX

<template>
    <div>
        <home-component slot-scope="{ posts }">
            <div class="card mb-4" v-for="post in posts">
               <div class="card-body">
                 <h2 class="card-title">{{ post.title }}</h2>
                 <p class="card-text">{{ post.body }}</p>
                 <a href="#" class="btn btn-primary">Read More &rarr;</a>
               </div>
               <div class="card-footer text-muted">
                 Posted on January 1, 2017 by
                 <a href="#">xxx</a>
               </div>
             </div> 
        </home-component>
    </div>
</template>
<script>
import HomeComponent from "@/components/HomeComponent.vue";
export default {
  name: "home",
  components: {
    HomeComponent
  },
};
</script>

https://medium.com/binarcode/understanding-scoped-slots -in-vue-js-db5315a42391 https://vuejs.org/v2/guide/components-slots. html # Scoped-Slots


0 commentaires

-1
votes

Vous avez défini des données spécifiques au composant. Si vous souhaitez diffuser / transmettre des données dans différents composants / vues, veuillez conserver les données dans app.vue et accéder aux données directement dans la vue / le composant. Une autre façon d'accéder aux données dans un emplacement centralisé, vous pouvez utiliser VueX (magasin de données), son niveau d'avance en bits pour manipuler une énorme capacité de données.


0 commentaires