Передача данных JSON из одного компонента в другой.Vue.js - PullRequest
0 голосов
/ 04 марта 2019

Я весь день пытаюсь понять, как передавать данные из одного компонента в другой.Я прочитал много соответствующих учебных пособий и инструкций, к сожалению, без удачи.

Я получил некоторые данные из API и представляю их в home.vue, и я хочу передать данные в новый файлчтобы создать страницу, которая будет отображать случайный продукт из списка.

Возможно, этот подход совершенно неправильный, но я впервые использую компоненты vue, у меня есть опыт только с экземпляром

Я пытаюсь реализовать это с помощью реквизита, чтобы вернуть данные на новую страницу.

Вот файл randomize.vue, куда я хотел бы передать свои данные

<template>
  <div class="hello">
    <p> {{ this.propsdata[0].e }} </p>
  <h1>dla;dl;djal;d</h1>
  </div>
</template>

<script>
export default {
  name: "randomize",
  props: ["propsdata"],
  data() {
    return {
        obj: this.propsdata
    };
  },
  mounted(){
   console.log(this.props);
  },
};
</script>

Это файл home.vue, из которого я получаю данные

<template>
  <div>
    <div class=" main-conte" >
                 <randomize  :propsData=toBeShown />

<transition-group name="fade" tag="div" id="container"  class=" row "  >
      <figure v-for="(value,index) in  toBeShownOrdered" id="page-wrap" :key="index" class="beer-container col-xs-6 col-sm-6 col-lg-4 col-xl-2"   >
         <a  >
    <img @click="goTodetail(value.id)" class="logo lazy img-responsive loaded" v-bind:src="getMissingImg(index)"/>
          <figcaption>
            <div class="beer-title">{{value.name}}</div>
            <div class="beer-availability"> {{value.tagline}}</div>
            <div class="learn-more">
              <h4 class="beer-info-title">Format</h4>
              <span class="serving-icons"></span>
              <div class="serving">
             <i v-if="value.abv >= 0 && value.abv <=6 " class="fas fa-wine-glass-alt"></i> 
             <i v-if="value.abv >= 6 && value.abv <=7" class="fas fa-glass-cheers"></i>
             <i v-if="value.abv >= 7 && value.abv <=100" class="fas fa-wine-bottle"></i>
             <span class="measure">{{value.abv}}</span>%</div>
             </div>
           </figcaption>
           </a>
     </figure>
     </transition-group>
<div class=prev-next>
<button @click="orderByName = !orderByName">Click Me!</button>

<button class="prev" @click="prevPage" :disabled="currentPage==1">
<i class="fas fa-angle-double-left"></i></button>
      <button class="next"  @click="nextPage" :disabled="currentPage == totalPages">
<i class="fas fa-angle-double-right"></i>     </button>
</div>
</div>
  <div>
  </div>
    </div>
</template>
<script>
import { mdbView, mdbMask } from "mdbvue";
import FadeTransition from "./fade-transition.vue";

import randomize from "@/components/randomize";



export default {
  name: "home",

  components: {
    mdbView,
    mdbMask,
    FadeTransition,
    randomize
  },

  data() {
    return {
      items: [],
       message: '',
      currentPage: 1,
      orderByName: false,


 };
  },
  computed: {
    //show more less products
  	toBeShown() {
      return this.items.slice(0, this.currentPage * 5);

    },
    totalPages() {
      return Math.ceil( this.items.length / 4);
    },
    toBeShownOrdered() {
  return this.orderByName ? _.orderBy(this.toBeShown, 'name', 'asc') : this.toBeShown;
}
 },

  mounted() {
    this.fetchData();

    
  },
  


  methods: {
    fetchData: function() {
      const myRequest = new Request("https://api.punkapi.com/v2/beers");
      fetch(myRequest)
        .then(response => {
          return response.json();
        })
        .then(data => {
          this.items = data;

          console.log(this.items);
        })
        .catch(error => {
          console.log(error);
        });
    },
    getMissingImg(index) {
      return this.images[index];
    },

   	nextPage(){
      if(this.currentPage <  this.totalPages) this.currentPage++;
    },
    prevPage(){
      this.currentPage = this.currentPage - 1 || 1;
    },
      goTodetail(prodId) {
    let proId=prodId
    this.$router.push({name:'blog',params:{Pid:proId}})
    
      },

index.js

import Vue from 'vue'
import Router from 'vue-router'
import home from '@/components/home'
import blog from '@/components/blog'
import randomize from '@/components/randomize'



Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'home',
      component: home,
      props:true
    },
    {
      path: '/blog/:Pid',
      name: 'blog',
      component: blog,
      props:true

    },
    {
      path: '/randomize/',
      name: 'randomize',
      component: randomize,
      props:true

    },
  ]
})

1 Ответ

0 голосов
/ 04 марта 2019

Вы бы выиграли от использования vuex , поскольку оно будет поддерживать ваше состояние на уровне приложения (в отличие от компонента data , который сохраняет каждое состояние компонента на уровне компонента).

Настройка vuex требует немного больше работы и обучения, но если вы не увеличите свое приложение до среднего / большого размера, это в долгосрочной перспективе принесет вам пользу, уменьшив общую сложность вашего приложения.

Короче говоря, все компоненты вашего приложения могут получить доступ к состоянию, хранящемуся в vuex, без необходимости работать с реквизитом.И из любого компонента вы можете диспетчерские действия , реализованные в вашем хранилище vuex для изменения состояния vuex.Vuex поможет сосредоточить ваши компоненты на представлении данных и регистрации действий пользователя.

Чтобы упростить настройку приложения Vue с помощью vue-router и vuex, вы можете создать свое приложение с помощью nuxt.js , которая представляет собой платформу, которая предоставляет вам vue + vue-router + vuex без каких-либо усилий.Nuxt.js также поможет настроить рендеринг на стороне сервера, который будет полезен для SEO, если ваше приложение будет проиндексировано поисковыми системами.

...