Quasar использует Vuex как основной механизм для управления состоянием приложения. В современных приложениях состояние играет ключевую роль, так как оно позволяет централизованно хранить данные, обеспечивая реактивность компонентов и упрощая масштабирование.
State — это объект, который хранит все данные приложения. Он является единственным источником правды. Все компоненты получают доступ к state через store, что позволяет избегать дублирования данных и рассинхронизации.
Пример определения state:
// store/index.js
export const state = () => ({
user: null,
isAuthenticated: false,
cart: []
});
Особенности:
Доступ к state из компонентов осуществляется через:
computed: {
currentUser() {
return this.$store.state.user;
}
}
Getters — это вычисляемые свойства для state. Они позволяют получать данные из store с предварительной обработкой, не изменяя само состояние.
Пример использования getters:
export const getters = {
isLoggedIn: (state) => {
return state.isAuthenticated;
},
cartItemCount: (state) => {
return state.cart.length;
}
};
Особенности:
export const getters = {
getCartItemById: (state) => (id) => {
return state.cart.find(item => item.id === id);
}
};
computed: {
loggedIn() {
return this.$store.getters.isLoggedIn;
}
}
Mutations — единственный способ изменять state. Они синхронны и принимают два параметра: state и payload.
Пример:
export const mutations = {
setUser(state, user) {
state.user = user;
state.isAuthenticated = !!user;
},
addToCart(state, product) {
state.cart.push(product);
},
removeFromCart(state, productId) {
state.cart = state.cart.filter(item => item.id !== productId);
}
};
Особенности:
В компоненте мутации вызываются через:
this.$store.commit('setUser', user);
this.$store.commit('addToCart', product);
Actions — функции для выполнения асинхронных операций, таких как HTTP-запросы, и последующего вызова мутаций.
Пример:
export const actions = {
async fetchUser({ commit }) {
const response = await fetch('/api/user');
const data = await response.json();
commit('setUser', data);
},
async addProductToCart({ commit }, product) {
// имитация задержки сервера
await new Promise(resolve => setTimeout(resolve, 500));
commit('addToCart', product);
}
};
Особенности:
this.$store.dispatch('fetchUser');
export const actions = {
async checkout({ state, commit, getters }) {
if (getters.cartItemCount === 0) return;
await api.checkout(state.cart);
commit('clearCart');
}
};
Quasar позволяет структурировать store с помощью модулей, чтобы разделять логику по функциональным блокам:
// store/user.js
export const state = () => ({
profile: null
});
export const mutations = {
setProfile(state, profile) {
state.profile = profile;
}
};
export const actions = {
async fetchProfile({ commit }) {
const data = await fetch('/api/profile').then(res => res.json());
commit('setProfile', data);
}
};
export const getters = {
userName: (state) => state.profile?.name || ''
};
Модули можно подключать с namespaced: true для изоляции
пространства имен:
export const namespaced = true;
Доступ к таким модулям:
this.$store.dispatch('user/fetchProfile');
this.$store.getters['user/userName'];
Эта структура позволяет создавать масштабируемые, поддерживаемые приложения с Quasar и Vuex, обеспечивая централизованное управление состоянием, предсказуемость и реактивность компонентов.