Sobes.tech
Junior

Wyjaśnij, czym jest Vuex, własnymi słowami.

sobes.tech AI

Odpowiedź od AI

Vuex to biblioteka zarządzania stanem dla aplikacji Vue.js. Jest to scentralizowane przechowalisko dla wszystkich komponentów aplikacji, w którym można przechowywać dane dostępne z różnych części aplikacji bez konieczności przekazywania ich przez propsy lub zdarzenia.

Vuex składa się z następujących głównych części:

  • State: Obiekt zawierający wszystkie wspólne dane aplikacji. To "jedno źródło prawdy".
  • Getters: Funkcje do pobierania danych ze stanu. Są podobne do obliczanych właściwości w komponentach Vue.
  • Mutations: Funkcje bezpośrednio zmieniające stan. Są synchroniczne. Jedynym sposobem zmiany stanu jest wywołanie mutation.
  • Actions: Funkcje, które mogą zawierać operacje asynchroniczne. Nie zmieniają bezpośrednio stanu, lecz wywołują mutations.
  • Modules: Pozwalają podzielić magazyn na moduły, każdy z własnym stanem, getterami, mutation i actions, dla dużych aplikacji.

Zasada działania:

  1. Komponenty pobierają dane z state przez getters.
  2. Działania użytkownika (kliknięcia, wpisy) wywołują actions.
  3. Actions mogą wykonywać operacje asynchroniczne (np. zapytania do API).
  4. Actions wywołują mutations w celu zmiany state.
  5. Zmiany w state automatycznie i reaktywnie aktualizują komponenty.

Przykład użycia:

Załóżmy, że mamy licznik, którego wartość powinna być dostępna z różnych komponentów.

// store.js
import { createStore } from 'vuex';

const store = createStore({
  state() {
    return {
      count: 0
    };
  },
  mutations: {
    increment(state) {
      state.count++;
    },
    decrement(state) {
      state.count--;
    }
  },
  actions: {
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment');
      }, 1000);
    }
  },
  getters: {
    doubleCount(state) {
      return state.count * 2;
    }
  }
});

export default store;
<!-- Component.vue -->
<template>
  <div>
    <p>Licznik: {{ count }}</p>
    <p>Podwójny licznik: {{ doubleCount }}</p>
    <button @click="increment">Dodaj</button>
    <button @click="decrement">Odejmij</button>
    <button @click="incrementAsync">Dodaj asynchronicznie</button>
  </div>
</template>

<script>
import { useStore } from 'vuex';
import { computed } from 'vue';

export default {
  setup() {
    const store = useStore();

    const count = computed(() => store.state.count);
    const doubleCount = computed(() => store.getters.doubleCount);

    const increment = () => store.commit('increment');
    const decrement = () => store.commit('decrement');
    const incrementAsync = () => store.dispatch('incrementAsync');

    return {
      count,
      doubleCount,
      increment,
      decrement,
      incrementAsync
    };
  }
};
</script>

Vuex pomaga organizować zarządzanie stanem aplikacji, czyniąc je bardziej przewidywalnym i łatwiejszym do debugowania, szczególnie w dużych i złożonych projektach.