【问题标题】:Vue - How can I list the array in the first object of the array with Vuex using mapStateVue - 如何使用 Vuex 使用 mapState 在数组的第一个对象中列出数组
【发布时间】:2021-07-17 15:42:06
【问题描述】:

我想在 Vuex 中使用 mapState 列出播放器中第一个对象的名称数组。在当前代码中,播放器中的对象是根据其标题列出的,但我只想根据该页面上第一个对象中的名称来过滤它们。在第二页上,我想根据我将添加到第二个对象的名称列出它们。我希望我能够解释我的问题。我怎样才能在过滤器中做到这一点?或者如果有更好的方法来做到这一点呢?

Players.vue

<template>
  <div class="Players">
    <CostumText class="Players-title" tag="h1">Kulüpler</CostumText>
    <div class="Players-search">
      <input type="text" v-model="search" placeholder="Kulüp ara.." />
      <label>Futbolcu ara:</label>
    </div>
    <div class="Players-inner">
      <router-link
        :to="players.pathName"
        class="Players-inner-wrapper"
        v-for="players in filteredList"
        v-bind:key="players.id"
      >
        <div class="Players-inner-cards">
          <Clubs class="Players-inner-cards-svg" v-bind:name="players.id" />
          <CostumText tag="strong" lang="tr" class="Players-inner-cards-text">
            {{ players.title }}
          </CostumText>
        </div>
      </router-link>
    </div>
    <router-view />
  </div>
</template>

<script>
import { mapState } from 'vuex'
import CostumText from '@/components/CostumText'
import Clubs from '@/components/Clubs.vue'

export default {
  name: 'Players',
  components: {
    CostumText,
    Clubs
  },
  data() {
    return {
      search: ''
    }
  },
  computed: {
    ...mapState(['players']),
    filteredList() {
      return this.players.filter((player) =>
        player.title.toLowerCase().includes(this.search.toLowerCase())
      )
    }
  },
  modules: {}
}
</script>

存储/index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    players: [
      {
        id: 1,
        names: ['kerem', 'sirin', 'ali', 'ayse', 'ahmet'],
        title: 'Ali',
        pathName: 'ali'
      },
      {
        id: 2,
        title: 'Ayse',
        pathName: 'ayse'
      },
      {
        id: 3,
        title: 'Ahmet',
        pathName: 'ahmet'
      }
    ]
  },
  getters: {},
  mutations: {},
  actions: {},
  modules: {}
})

【问题讨论】:

    标签: javascript arrays vue.js object vuex


    【解决方案1】:

    你可以修改filteredList为

      computed: {
        ...mapState(['players']),
        filteredList() {
          const filteredPlayers = this.players.filter(player => {
            let flag = false;
            if(player.names) {
             player.names.forEach(name => {
              if(name.toLowerCase().includes(this.search.toLowerCase()) flag = true;
             });
            }
           return flag;
        });
        return filteredPlayers;
      },
    

    这是显示姓名的方式

    <div class="Players-inner-cards">
              <Clubs class="Players-inner-cards-svg" v-bind:name="players.id" />
              <CostumText tag="strong" lang="tr" class="Players-inner-cards-text">
                {{ players.names.valueOf() }}
              </CostumText>
            </div>
    

    【讨论】:

    • 它在控制台上显示:“TypeError: Cannot read property 'forEach' of undefined” :(
    • 代码现在可以工作了,非常感谢你,但是在 CostumText 组件的模板上,我用 player.title 调用名称,所以在屏幕上它只显示一个名为“Ali”的组件(第一个对象标题)。如何将其更改为名称?
    • 顺便说一句,如果您的问题解决了,请接受答案...谢谢 :)
    • 这样,名称数组显示在一个组件中。我只想在一个组件中使用一个名称,并希望使用 v-for(在路由器链接中)显示另一个组件中的所有名称。
    猜你喜欢
    • 2021-09-17
    • 2020-08-13
    • 2018-04-17
    • 2019-01-03
    • 1970-01-01
    • 2019-12-12
    • 2019-05-01
    • 2019-11-12
    • 2019-09-25
    相关资源
    最近更新 更多