一、redux的核心概念
Redux是一个用于JavaScript应用程序的状态管理库。它可以帮助开发人员更好地管理应用程序的状态,并更容易地进行调试和测试。以下是一些Redux的重要概念和用法:
- Store:Redux中的状态管理中心。它是一个JavaScript对象,包含了整个应用程序的状态数据。
- Action:Redux中的状态更新的触发器。它是一个JavaScript对象,包含一个类型(type)和数据(payload)。
- Reducer:Redux中的状态更新逻辑。它是一个纯函数,接受一个当前状态(state)和一个操作(action),返回一个新的状态。
- Dispatch:Redux中的状态更新发起者。它是一个函数,接受一个操作(action),并将其发送给Reducer。
- Subscribe:Redux中的状态更新监听器。它是一个函数,接受一个回调函数作为参数,当状态更新时调用该回调函数。
使用Redux的一般流程如下:
- 创建一个Store,将Reducer传递给它。
- 创建一个Action,描述状态更新的类型和数据。
- 使用Dispatch函数将Action发送给Reducer,更新状态。
- 使用Subscribe函数监听状态更新,更新UI。
二、简单的小Demo
我们定义了三个Action类型和三个Action Creator来描述状态的更新。Reducer则根据Action的类型来更新状态。我们还定义了一个Middleware来处理异步的Action,使用了Redux Thunk库来实现异步Action的处理。
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import axios from 'axios';
// Action Types
const FETCH_USERS_REQUEST = 'FETCH_USERS_REQUEST';
const FETCH_USERS_SUCCESS = 'FETCH_USERS_SUCCESS';
const FETCH_USERS_FAILURE = 'FETCH_USERS_FAILURE';
// Action Creators
const fetchUsersRequest = () => {
return {
type: FETCH_USERS_REQUEST
};
};
const fetchUsersSuccess = (users) => {
return {
type: FETCH_USERS_SUCCESS,
payload: users
};
};
const fetchUsersFailure = (error) => {
return {
type: FETCH_USERS_FAILURE,
payload: error
};
};
// Reducer
const initialState = {
loading: false,
users: [],
error: ''
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case FETCH_USERS_REQUEST:
return {
...state,
loading: true
};
case FETCH_USERS_SUCCESS:
return {
loading: false,
users: action.payload,
error: ''
};
case FETCH_USERS_FAILURE:
return {
loading: false,
users: [],
error: action.payload
};
default:
return state;
}
};
// Middleware
const fetchUsers = () => {
return (dispatch) => {
dispatch(fetchUsersRequest());
axios.get('https://jsonplaceholder.typicode.com/users')
.then(response => {
const users = response.data;
dispatch(fetchUsersSuccess(users));
})
.catch(error => {
const errorMsg = error.message;
dispatch(fetchUsersFailure(errorMsg));
});
};
};
const middleware = applyMiddleware(thunk);
// Store
const store = createStore(reducer, middleware);
export default store;
三、拆分Reducer
// 多个Reducer 创建store
import { createStore, combineReducers } from 'redux';
import userReducer from './reducers/userReducer';
import productReducer from './reducers/productReducer';
import cartReducer from './reducers/cartReducer';
const rootReducer = combineReducers({
user: userReducer,
product: productReducer,
cart: cartReducer
});
const store = createStore(rootReducer);
export default store;
// 获取各个模块的数据
import store from './store';
const user = store.getState().user;
const products = store.getState().product;
const cartItems = store.getState().cart;
四、监听State的变化
import { createStore } from 'redux';
// 定义 reducer
const reducer = (state = { count: 0 }, action) => {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
};
// 创建 store
const store = createStore(reducer);
// 订阅 state 变化
const unsubscribe = store.subscribe(() => {
console.log('state changed:', store.getState());
});
// 分发 action
store.dispatch({ type: 'INCREMENT' }); // state changed: { count: 1 }
store.dispatch({ type: 'INCREMENT' }); // state changed: { count: 2 }
// 取消订阅 state 变化
unsubscribe();
// 分发 action
store.dispatch({ type: 'DECREMENT' }); // 不会输出任何内容