Глобальное управление состоянием является ключевым аспектом при разработке крупных приложений на Inferno. В отличие от локального состояния компонентов, глобальное состояние обеспечивает единое место хранения данных, доступное для всех компонентов приложения, что упрощает синхронизацию и управление состоянием.
В Inferno нет встроенного механизма для глобального состояния, как в Redux или Vuex, однако можно эффективно использовать паттерн Store. Store представляет собой объект, содержащий данные приложения и методы для их изменения. Основные характеристики Store:
Пример простого Store:
import { createStore } from 'redux';
const initialState = {
user: null,
theme: 'light',
notifications: []
};
function appReducer(state = initialState, action) {
switch (action.type) {
case 'SET_USER':
return { ...state, user: action.payload };
case 'SET_THEME':
return { ...state, theme: action.payload };
case 'ADD_NOTIFICATION':
return { ...state, notifications: [...state.notifications, action.payload] };
default:
return state;
}
}
export const store = createStore(appReducer);
В данном примере используется Redux как удобное решение для
глобального состояния, совместимое с Inferno через библиотеку
inferno-redux.
Для того чтобы компоненты реагировали на изменения глобального
состояния, используется подписка на Store. В Inferno
можно применять функцию connect из
inferno-redux:
import { connect } from 'inferno-redux';
import { Component } from 'inferno';
class UserProfile extends Component {
render() {
const { user, theme } = this.props;
return (
<div className={`profile ${theme}`}>
<h2>{user?.name}</h2>
</div>
);
}
}
const mapStateToProps = (state) => ({
user: state.user,
theme: state.theme
});
export default connect(mapStateToProps)(UserProfile);
Ключевые моменты:
mapStateToProps выбирает только необходимые части
состояния.Изменение глобального состояния происходит через диспатч действий. Это обеспечивает контроль над тем, какие события изменяют состояние и позволяет вести аудит изменений.
Пример диспатча:
store.dispatch({ type: 'SET_USER', payload: { name: 'Алексей', id: 1 } });
store.dispatch({ type: 'ADD_NOTIFICATION', payload: 'Привет, Алексей!' });
Использование действий позволяет:
Для асинхронных операций в Inferno с Redux применяются middleware,
например redux-thunk или redux-saga. Это
позволяет диспатчить функции, выполняющие асинхронные вызовы, и после
завершения обновлять глобальное состояние.
Пример с redux-thunk:
export const fetchUser = (userId) => async (dispatch) => {
dispatch({ type: 'FETCH_USER_START' });
try {
const response = await fetch(`/api/users/${userId}`);
const data = await response.json();
dispatch({ type: 'SET_USER', payload: data });
} catch (error) {
dispatch({ type: 'FETCH_USER_ERROR', payload: error });
}
};
В больших приложениях возникает необходимость синхронизировать различные части интерфейса. В Inferno это достигается через подписку компонентов на одни и те же части глобального состояния:
const mapStateToPropsNotifications = (state) => ({
notifications: state.notifications
});
const mapStateToPropsTheme = (state) => ({
theme: state.theme
});
Каждый компонент подписан только на необходимые данные, что минимизирует лишние перерисовки и повышает производительность.
userReducer, notificationsReducer,
themeReducer) и объединять их через
combineReducers.Эффективное глобальное управление состоянием в Inferno позволяет создавать высокопроизводительные, предсказуемые и легко масштабируемые интерфейсы.