📅  最后修改于: 2023-12-03 14:52:01.873000             🧑  作者: Mango
Redux 是一个流行的 JavaScript 状态管理库,用于管理复杂的应用程序状态。它提供了一个可预测的状态容器,可使您更轻松地编写可维护的应用程序。在本文中,我们将介绍如何使用 Redux 处理更多操作,并提供一些示例代码片段。
在开始学习如何处理更多操作之前,让我们快速回顾一下 Redux 的基础知识。
Redux 的核心概念是“store(存储)”,它是一个包含整个应用程序状态的对象。应用程序状态只能通过“actions(操作)”来更改。一个操作是一个描述发生了什么事情的对象,可能包含一些数据。当操作被分派到 Redux 时,它将引发“reducers(处理器)”函数的调用,它是一个纯函数,负责根据操作和当前状态计算新状态。
Redux 通过“dispatch(分派)”函数将操作发送到存储中。在我们的应用程序中,我们使用该函数来触发操作,并且我们会编写一个或多个处理器函数来处理这些操作。
除了使用基本操作之外,我们还可以使用 Redux 提供的一些附加功能来处理更多操作。下面是一些示例:
在现代 web 应用程序中,我们经常需要处理异步数据。Redux 提供了一个名为“Thunk”的中间件,可以让我们的操作返回一个函数而不是一个对象。这个返回的函数将接收一个 “dispatch(分派)”函数和一个 “getState(获取状态)”函数作为参数,并可以包含异步操作。
下面是一个示例代码片段,它演示如何使用 Thunk 中间件来处理异步操作:
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
const initialState = {
loading: false,
data: null,
error: null,
};
const FETCH_DATA_REQUEST = 'FETCH_DATA_REQUEST';
const FETCH_DATA_SUCCESS = 'FETCH_DATA_SUCCESS';
const FETCH_DATA_FAILURE = 'FETCH_DATA_FAILURE';
const fetchDataRequest = () => ({
type: FETCH_DATA_REQUEST,
});
const fetchDataSuccess = (data) => ({
type: FETCH_DATA_SUCCESS,
payload: data,
});
const fetchDataFailure = (error) => ({
type: FETCH_DATA_FAILURE,
payload: error,
});
const reducer = (state = initialState, action) => {
switch (action.type) {
case FETCH_DATA_REQUEST:
return {
...state,
loading: true,
error: null,
};
case FETCH_DATA_SUCCESS:
return {
...state,
loading: false,
data: action.payload,
};
case FETCH_DATA_FAILURE:
return {
...state,
loading: false,
error: action.payload,
};
default:
return state;
}
};
const fetchDummyData = () => (dispatch) => {
dispatch(fetchDataRequest());
fetch('https://jsonplaceholder.typicode.com/todos/1')
.then((response) => response.json())
.then((data) => {
dispatch(fetchDataSuccess(data));
})
.catch((error) => {
dispatch(fetchDataFailure(error));
});
};
const store = createStore(reducer, applyMiddleware(thunk));
store.dispatch(fetchDummyData());
在这个示例中,我们定义了一个“fetchDummyData(获取虚拟数据)”操作,它使用 Thunk 中间件返回一个函数。这个函数将调用“fetch(获取)”函数来从网络上获取虚拟数据。如果数据成功获取,我们将调用“fetchDataSuccess(获取数据成功)”操作来分派一个成功的操作,并将数据作为负载传递。如果发生错误,我们将调用“fetchDataFailure(获取数据失败)”操作来分派一个失败的操作并传递错误信息。
Redux 的“combineReducers(组合处理器)”函数可用于将多个处理器函数组合成一个根处理器函数。这是一种有用的方法,因为它允许我们将应用程序状态分为多个区域,并编写专用于每个区域的处理器函数。
下面是一个示例代码片段,它演示如何使用“combineReducers(组合处理器)”函数组合多个处理器函数:
import { createStore, combineReducers } from 'redux';
const initialCounterState = {
value: 0,
};
const initialListState = {
items: [],
};
const INCREMENT_COUNTER = 'INCREMENT_COUNTER';
const DECREMENT_COUNTER = 'DECREMENT_COUNTER';
const ADD_TO_LIST = 'ADD_TO_LIST';
const REMOVE_FROM_LIST = 'REMOVE_FROM_LIST';
const incrementCounter = () => ({
type: INCREMENT_COUNTER,
});
const decrementCounter = () => ({
type: DECREMENT_COUNTER,
});
const addToList = (item) => ({
type: ADD_TO_LIST,
payload: item,
});
const removeFromList = (item) => ({
type: REMOVE_FROM_LIST,
payload: item,
});
const counterReducer = (state = initialCounterState, action) => {
switch (action.type) {
case INCREMENT_COUNTER:
return {
...state,
value: state.value + 1,
};
case DECREMENT_COUNTER:
return {
...state,
value: state.value - 1,
};
default:
return state;
}
};
const listReducer = (state = initialListState, action) => {
switch (action.type) {
case ADD_TO_LIST:
return {
...state,
items: [...state.items, action.payload],
};
case REMOVE_FROM_LIST:
return {
...state,
items: state.items.filter((item) => item !== action.payload),
};
default:
return state;
}
};
const rootReducer = combineReducers({
counter: counterReducer,
list: listReducer,
});
const store = createStore(rootReducer);
store.dispatch(incrementCounter());
store.dispatch(addToList('Item 1'));
在这个示例中,我们定义了两个处理器函数(“counterReducer(计数器处理器)”和“listReducer(列表处理器)”)。我们可以将它们组合到一个单独的根处理器函数中,并将其传递给“createStore(创建存储)”函数来创建存储。我们还定义了四个操作函数来更新状态。
我们可以使用 Redux 的“connect(连接)”函数和高阶组件(HOC)来将我们的 React 组件连接到 Redux 存储中。这样,我们的组件就可以通过获取状态和分派操作,直接与应用程序状态进行交互。
下面是一个示例代码片段,它演示如何使用“connect(连接)”函数和 HOC(高阶组件)将组件连接到 Redux 存储中:
import React from 'react';
import { connect } from 'react-redux';
const Counter = ({ count, increment, decrement }) => (
<div>
<h2>Counter</h2>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
);
const mapStateToProps = (state) => ({
count: state.counter.value,
});
const mapDispatchToProps = {
increment: () => ({ type: 'INCREMENT_COUNTER' }),
decrement: () => ({ type: 'DECREMENT_COUNTER' }),
};
const ConnectedCounter = connect(mapStateToProps, mapDispatchToProps)(Counter);
export default ConnectedCounter;
在这个示例中,我们定义了一个“Counter(计数器)”组件,并在其外部定义了两个映射函数(“mapStateToProps(映射到状态)”和“mapDispatchToProps(映射到操作)”)来连接它到 Redux 存储中。我们最终使用“connect(连接)”函数和 HOC(高阶组件)来将组件连接到存储中,并导出连接后的组件。
Redux 是管理 JavaScript 应用程序状态的强大库。无论您的应用程序规模如何,您都可以使用 Redux 处理更多操作。在本文中,我们介绍了如何使用 Redux 处理异步操作、组合处理器、以及连接组件和存储。通过这些方法,您将能够更好地组织和管理您的应用程序状态。