использовать vuex mapGetters для итерации в состоянии obj пользователей - PullRequest
0 голосов
/ 25 февраля 2020

В данный момент я изучаю vuex, и я застрял в функции отображения, как import { mapGetters } from 'vuex'; , в моем состоянии у меня есть объект с именем users, где я сохраняю пользовательские данные, а позже добавлю функцию addNewUser для расширения объекта пользователей. Но для этого тестового примера я просто создал фиктивного пользователя с именем "Джон":

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

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    users: [
      {
        userName: 'John',
        income: 2000,
        leftover: 0
      }
    ]
  },
  getters: {
    user: state => {
      return state.users;
    },
  },
  mutations: {},
  actions: {
    addNewUser(userName, income) {
      console.log(userName, income, 'from vuex');

    }
  },
  modules: {}
});

, прежде чем идти этим путем, я просто назвал Джона с this.$store.state.users, а затем перебрал userNames с помощью forEach , Но понял, что это не лучший способ сделать это.

как мне добиться, чтобы получить данные о состоянии пользователей и распечатать их, как forEach l oop, как я делал раньше?

В строке 129 loadAllUsers() вы можете увидеть мой старый способ добиться этого:

<template>
  <div
    id="user-modal"
    class="modal fade"
    tabindex="-1"
    role="dialog"
    aria-hidden="true"
  >
    <div
      class="modal-dialog modal-dialog-centered"
      role="document"
    >
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title">
            Settings
          </h5>
          <button
            type="button"
            class="close"
            data-dismiss="modal"
            aria-label="Close"
          >
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="modal-body">
          <!-- List all Users -->
          <div
            id="users-list"
            class="mb-3"
          >
            <h5>Users:</h5>
            <ul class="list-group">
              <li
                v-for="user in userList"
                :key="user.userName"
                class="list-group-item"
              >
                {{ user.userName }}
              </li>
            </ul>
          </div>

          <!-- Add New Users -->
          <h5>Add New User:</h5>
          <div class="input-group mb-1">
            <div class="input-group-prepend">
              <span
                id="basic-addon1"
                class="input-group-text"
              >
                <i class="fas fa-user" />
              </span>
            </div>
            <input
              v-model="userNameInput"
              type="text"
              class="form-control"
              placeholder="Username"
            >
          </div>

          <div class="input-group">
            <div class="input-group-prepend">
              <span
                id="basic-addon1"
                class="input-group-text"
              >
                <i class="far fa-money-bill-alt" />
              </span>
            </div>
            <input
              v-model="userIncomeInput"
              type="number"
              class="form-control"
              placeholder="Income"
            >
          </div>
        </div>
        <div class="modal-footer">
          <button
            type="button"
            class="btn btn-secondary"
            data-dismiss="modal"
          >
            Close
          </button>
          <button
            type="button"
            class="btn btn-primary"
            @click="createNewUser"
          >
            Save changes
          </button>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import { mapGetters } from 'vuex';
// import { mapActions } from 'vuex';
export default {
  data() {
    return {
      userNameInput: '',
      userIncomeInput: '',
      userList: []
    };
  },
  computed: {
    ...mapGetters(['user']),
    printUserTest(user) {
      return user;
    }
  },
  created: function() {
    this.loadAllUsers();
  },
  methods: {
    // ...mapActions({
    //   addNewUser: 'addNewUser'
    // }),
    loadAllUsers() {
      let allUsers = this.$store.state.users;
      allUsers.forEach(user => {
        this.userList.push({ userName: user.userName });
      });
      // },
      // createNewUser() {
      //   let userName = this.userNameInput;
      //   let userIncome = this.userIncomeInput;
      //   console.log(userName, userIncome);
      // }
    }
  }
};
</script>

<style lang="scss">
#user-modal {
  color: $black;
  .input-group-text {
    width: 46px;
  }
}
</style>

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Если вы можете использовать mapState, объявите userList в вычисляемых вместо данных:

  computed: {
    ...mapState({
      userList: state => state.users.map(user => user.userName),
    })

и в вашем коде html измените все user.userName на user

1 голос
/ 25 февраля 2020

С помощью mapGetters вы можете сопоставить users в вашем магазине с вычисленным. это будет реактивным.

Так что вам даже не нужно загружать пользователей.

Vue.config.devtools = false;
Vue.config.productionTip = false;

const store = new Vuex.Store({
  state: {
    users: [{
      userName: 'John',
      income: 2000,
      leftover: 0
    }]
  },
  getters: {
    users: state => {
      return state.users;
    },
  }
})


var app = new Vue({
  el: '#app',
  store,
  computed: {
    ...Vuex.mapGetters(["users"]),
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vuex@3.1.2/dist/vuex.js"></script>

<div id="app">
  <div v-for="user in users">
    {{ user.userName }}
  </div>
</div>

<div>

https://vuex.vuejs.org/guide/getters.html#getters

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...