Невозможно использовать Vuex для извлечения данных для всех компонентов - PullRequest
0 голосов
/ 09 сентября 2018

Я попытался получить данные в App.vue, а затем передать значение this.store.data. После этого я могу использовать значение this.store.data для всех других компонентов. Проблема заключается в том, что когда я щелкаю ссылку (router-link), функция внутри компонентов запускается до извлечения данных в приложении. Можно ли как-нибудь это исправить? Как получить данные и использовать для всех других компонентов?

Вот код store.js:

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
      senator: [],
  },
  mutations: {},
  actions: {}
});

Вот код выборки данных в App.vue:

<script>
import Header from "./components/Header";
import Footer from "./components/Footer";
export default {
    components: {Header, Footer},
    data(){
        return {
            senatorA: [],
        }
    },
    created: function(){
        this.getData();
    },
    methods: {
        getData() {
            let pathSenate = 'senate';
            let url = '';
            let currentPage = window.location.href;
            if (currentPage.includes(pathSenate)) {
                url = 'https://api.myjson.com/bins/1eja30';

            } else {
                url = 'https://api.myjson.com/bins/j83do';
            }
            fetch(url)
                .then(response => response.json())
                .then((jsonData) => {
                    let data = jsonData;
                    this.senatorA = data.results[0].members;
                    this.senatorA.forEach(mem => {
                        mem.fullname = (mem.first_name + ' ' + mem.middle_name + ' ' + mem.last_name).replace(null, '');
                    });
                    this.$store.state.senator = this.senatorA;
                    console.log(this.$store.state.senator)
                });
        },
    }
}

Вот код в компоненте для получения данных из функции извлечения в App.vue:

<script>
import DataTable from './DataTable'
export default {
    name: "FilterData",
    components: {DataTable},
    data () {
        return {
            senatorF: this.$store.state.senator,
            checkarr: [],
            selectarr: '',
            statearr: [],
            searchName: '',
            tempt: [],
        }
    },
    created: function(){
        this.getStates();
    },
    computed: {
        displayParty() {
            if (this.checkarr.length == 0 && this.selectarr == '') {
                return this.searchData(this.senatorF);
            } else if (this.checkarr.length != 0 && this.selectarr == '') {
                this.tempt = this.senatorF.filter(j => this.checkarr.includes(j.party));
                return this.searchData(this.tempt);
            } else if (this.selectarr != '' && this.checkarr.length == 0) {
                this.tempt = this.senatorF.filter(j => this.selectarr.includes(j.state));
                return this.searchData(this.tempt)
            } else {
                let  memFilter= [];
                for (let j = 0; j < this.senatorF.length; j++) {
                    for (let i = 0; i < this.checkarr.length; i++) {
                        if (this.senatorF[j].party == this.checkarr[i] && this.senatorF[j].state == this.selectarr) {
                            memFilter.push(this.senatorF[j]);
                        }
                    }
                }
                return this.searchData(memFilter);
            }
        },
    },
    methods: {
        getStates: function () {
            console.log(this.senatorF)
            this.senatorF.forEach(mem => {
                if (!this.statearr.includes(mem.state)) {
                    this.statearr.push(mem.state);
                    console.log('addrow')
                }
            });
        },
        searchData: function(array){
            return array.filter(mem => mem.fullname.toLowerCase().includes(this.searchName.toLowerCase()) || mem.votes_with_party_pct.toString().includes(this.searchName.toLowerCase()))
        }
    },
};

И вот результат в консоли: Результаты консоли показывают функцию в компоненте, выполняемом до извлечения данных в App.vue

1 Ответ

0 голосов
/ 10 сентября 2018

вы добились хорошего прогресса. Следующие шаги должны следовать правильному потоку в Vuex для «обновления» вашего магазина. В вашем App.vue у вас есть метод getData(), который в конечном итоге делает fetch(), и вы пытаетесь установить данные своего магазина, используя this.$store.state.senator = this.senatorA. Это не правильно. Вы должны следовать односторонней структуре потока данных Vuex.

Vuex One Way Data Flow

Вы пытаетесь напрямую изменить состояние без предварительной фиксации изменений в мутации, которая затем напрямую влияет на состояние. Я знаю, что это может показаться многим, даже Эван Ю (создатель Vue) сказал, что хотел бы упростить.

Вместо того, чтобы делать this.$store.state.senator = this.senatorA, сначала вы должны выполнить диспетчеризацию Vuex следующим образом: this.$store.dispatch('storeActionFunction', this.senatorA).

Внутри ваших файлов Vuex Store у вас должно быть «Действие» (функция), которое затем вызывает commit. Ваш коммит может выглядеть примерно так: commit('SET_SENATAOR_SOMETHING', data). data будет представлять ваш this.senatorA, который был передан через отправку.

У commit() есть 2 параметра ... имя мутации, на которое вы нацеливаетесь, и данные, которые вы хотите передать. Тогда у вас будет раздел в вашем магазине Vuex, где вы указываете свои мутации. Мутация под названием 'SET_SENATAOR_SOMETHING' будет затем принимать переданные в нее данные и делать что-то вроде ... state.senator = data.

Boom. Готово. Похоже, это так, но это так и работает. Если вы хотите увидеть несколько примеров файлов, у меня есть связанный проект ниже, но мой проект абстрагирован в большей степени, чем вы хотите.

Состояние : https://github.com/rebz/vue-meetup-interfaces/blob/master/resources/js/store/modules/people/state.js

Отправка : https://github.com/rebz/vue-meetup-interfaces/blob/master/resources/js/views/people/layouts/layout.vue

Действие : https://github.com/rebz/vue-meetup-interfaces/blob/master/resources/js/store/modules/people/actions.js

Мутация : https://github.com/rebz/vue-meetup-interfaces/blob/master/resources/js/store/modules/people/mutations.js

Геттеры : https://github.com/rebz/vue-meetup-interfaces/blob/master/resources/js/store/modules/people/getters.js

Доступ к данным w / { mapGetters } (не требуется): https://github.com/rebz/vue-meetup-interfaces/blob/master/resources/js/views/people/index.vue

Надеюсь, это поможет!

...