Axios Vue.js 将对象数组从 store.js 传递给组件

Posted

技术标签:

【中文标题】Axios Vue.js 将对象数组从 store.js 传递给组件【英文标题】:Axios Vue.js Pass an array of objects from store.js to component 【发布时间】:2019-07-30 11:46:12 【问题描述】:

我在 Vue.js 上苦苦挣扎,所以我需要你的帮助。

我想做一些太简单的事情但不幸的是没有运气。在 store.js 中,我有一个 axios fetch,它从被调用的 API 返回数据。 我的下一步是在组件中传递对象。

我使用 this.$store.dispatch('loadBeers') 和突变成功地做到了,我可以在我的 html 中呈现这些项目。

但是,如果我想处理 helloworld 组件中的数据,例如进行分页和过滤 obj,该怎么办?我的逻辑告诉我,我需要将 obj 存储在一个新数组中,然后才能处理我的数据。

如何将 this.myBeers 转移到 helloworld 组件? 也许我的逻辑或我的方法不正确,所以请原谅我只是对实例有经验,但整个框架是另一个世界......

对不起我糟糕的英语,我每天都在努力提高它们。在此先感谢社区..

Store.js

import Vue from "vue";
import Vuex from "vuex";
import axios from "axios";
import VueAxios from "vue-axios";

Vue.use(Vuex);
Vue.use(VueAxios, axios);

export default new Vuex.Store(
  state: 
    beers: []
  ,
  data()
    return
      myBeers:[],
    
  ,
  actions: 
    loadBeers( commit ) 
      axios
        .get("https://api.punkapi.com/v2/beers")
        .then(r => 
          this.myBeers = r.data;
          console.log(this.beers);
          
      )
        .then(beers => 
          commit("SET_BEERS", beers);
        );
    
  ,
  mutations: 
    SET_BEERS(state, beers) 
      state.beers = beers;
    
  
);

<template>
  <div class="container">
    <table class="table table-striped">
      <thead>
        <tr>
          <th>ID</th>
          <th>Name</th>
          <th>Price</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="beer in beers" :key="beer.id">
          <td> beer.id </td>
          <td> beer.name </td>
          <td> beer.abv </td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
import  mapState  from 'vuex'
export default 
  name: 'HelloWorld',
  data()
  return
    myBeers:[],
  
  ,
  mounted () 
    this.$store.dispatch('loadBeers')
    this.myBeers=this.$store.dispatch('loadBeers')
  ,
  computed: mapState([
    'beers'
  ]),
  methods:

    test()
     console.log(this.loadBeers);
    
  



</script>

【问题讨论】:

【参考方案1】:

如果您想根据现有的啤酒列表进行过滤,您可以使用 getter。如果您使用分页,则需要添加到 state.beers 而不是替换它。 https://vuex.vuejs.org/guide/getters.html 在组件中可以用...mapGetters(['myBeer'])查看getter

或者您可以过滤操作中的啤酒并将其添加到state.filteredBeers

import Vue from "vue";
import Vuex from "vuex";
import axios from "axios";
import VueAxios from "vue-axios";

Vue.use(Vuex);
Vue.use(VueAxios, axios);

export default new Vuex.Store(
  state: 
    beers: [],
    filteredBeers: []
  ,

  getters: 
    myBeers(state)
       return.state.beers.filter(beer => beer)
    
  ,
  actions: 
    loadBeers( commit ) 
      axios
        .get("https://api.punkapi.com/v2/beers")
        .then(r => 
          commit("SET_BEERS", r.data);
          let filtered = r.data.filter(beer => beer.ipa)
          commit("SET_FILTERED", filtered)
      )
  
    
  ,
  mutations: 
    SET_BEERS(state, beers) 
      state.beers = beers;
    ,
    SET_FILTERED(state, filtered) 
      state.filteredBeers = filtered;
    
  
);

【讨论】:

【参考方案2】:

假设您总是从服务器获取所有数据,然后在客户端进行过滤/分页,您可以在组件中使用计算属性

<script>
import  mapState  from 'vuex'
export default 
  name: 'HelloWorld',
  data()
  return
    filter: 'test',
    curPage: 1,
    pageSize: 10,
  
  ,
  mounted () 
    this.$store.dispatch('loadBeers')
  ,
  computed: 
  ...mapState([
    'beers'
  ]),
      filteredBeers()
      
        const flt = this.filter.toLowerCase();
        return flt ? this.beers.filter(item => item.name.toLowerCase().indexOf(flt) !== -1) : this.beers;
      ,
      paginatedBeers()
      
        return this.filteredBeers.slice((this.curPage - 1) * this.pageSize, (this.curPage - 1) * this.pageSize + this.pageSize - 1);
       
  ,
  methods:

    test()
     console.log(this.paginatedBeers);
    
  



</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<template>
  <div class="container">
    <table class="table table-striped">
      <thead>
        <tr>
          <th>ID</th>
          <th>Name</th>
          <th>Price</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="beer in paginatedBeers" :key="beer.id">
          <td> beer.id </td>
          <td> beer.name </td>
          <td> beer.abv </td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

【讨论】:

@Igo 非常感谢您抽出宝贵时间,但您的回答给我带来了更多问题。首先,我收到一个错误,this.beers 未定义,这是我的问题,我可以理解您如何过滤数据,但我认为 this.beers 是一个空数组.. this.beers 指的是 mapstate?? 您要提供 JSfiddle 还是 CodePen 吗? 是的,当然!我以前从未使用过它,所以我不能向你保证任何事情,但我会尝试..

以上是关于Axios Vue.js 将对象数组从 store.js 传递给组件的主要内容,如果未能解决你的问题,请参考以下文章

Vuex以及axios

Vuex以及axios 看这个

Vuex以及axios的使用

vue js中的axios将请求作为字符串而不是对象发送

Vue.js:如何将特定对象中的布尔字段从 false 更改为 true @click 处于突变状态和带有动作 axios 的服务器?

Vue Js 在我用 Axios get 调用的函数内部,将传入的数据打印到数组中