创建还原功能来处理每种操作类型并相应地更新商店
还原器被称为还原器,因为它们用于reald()函数中,该功能用于将值数量减少到单个值。在Redux中,还原器用于根据派遣的动作将商店的当前状态降低到新状态。
创建还原功能
要在redux中创建一个还原功能,您需要遵循一些约定。首先,该功能应采用两个参数:当前状态和一个诉讼。其次,该函数应根据派遣的操作返回新状态。
这是一个简单的还原函数的示例:
const initialState = {
count: 0
};
function counterReducer(state = initialState, action) {
switch (action. Type) {
case 'INCREMENT':
return { count: state. Count + 1 };
case 'DECREMENT':
return { count: state. Count - 1 };
default:
return state;
}
}
在上面的代码段示例中,我们创建了一个名为counterReducer
的还原函数。
该函数采用两个参数:当前状态(将其初始化为具有计数属性设置为0的对象)和一个操作。
该功能根据被派遣的动作返回新状态。
还原功能使用开关语句来处理不同的操作类型。在此示例中,我们正在处理两种动作类型:增量和减少。
当派遣增量操作时,该函数将返回一个新状态对象,计数属性增加了1。类似地,当访问降低操作时,该函数返回一个新状态对象,计数属性降低了1。派遣了任何其他操作,该功能只需返回当前状态。
结合还原器
在较大的应用程序中,多个还原器可能处理该州的不同部分。要将这些还原器组合到可以传递到商店的单个还原函数中,Redux提供了combineReducers()
函数。
这是如何使用combineReducers()
结合多个还原器的示例:
import { combineReducers } from 'redux';
const counterInitialState = {
count: 0
};
function counterReducer(state = counterInitialState, action) {
switch (action. Type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
const todosInitialState = {
items: []
};
function todosReducer(state = todosInitialState, action) {
switch (action. Type) {
case 'ADD_TODO':
return { items: [...state. Items, action.payload] };
case 'REMOVE_TODO':
return { items: state.items.filter(todo => todo.id !== action.payload) };
default:
return state;
}
}
const rootReducer = combineReducers({
counter: counterReducer,
todos: todosReducer
});
在此示例中,我们正在创建两个还原器:counterReducer
和todosReducer
。每个还原器都处理状态的不同部分。
然后,我们使用combineReducers()
将这些还原器组合到称为rootreducer的单个还原函数中。所得状态对象将具有两个属性:counter
和todos
,它们对应于每个还原器处理的状态。
在React组件中使用还原器
创建了还原函数并使用combineReducers()
将其与其他还原器结合在一起,可以使用useReducer()
Hook在React组件中使用所得的还原函数。
这是如何使用useReducer()
钩在React组件中管理状态的一个示例:
import React, { useReducer } from 'react';
function Counter() {
const [state, dispatch] = useReducer(counterReducer, { count: 0 });
function handleIncrement() {
dispatch({ type: 'INCREMENT' });
}
function handleDecrement() {
dispatch({ type: 'DECREMENT' });
}
return (
<div>
<h1>Count: {state. Count}</h1>
<button onClick={handleIncrement}>Increment</button>
<button onClick={handleDecrement}>Decrement</button>
</div>
);
}
在此示例中,我们使用useReducer()
钩在称为计数器的组件中管理状态。我们将counterReducer
函数作为第一个参数传递给useReducer()
,以及计数的初始状态(这是计数属性设置为0的对象)。
然后,我们分别定义了两个函数(handleIncrement() and handleDecrement())
分别派遣INCREMENT
和DECREMENT
动作。
最后,我们正在渲染当前计数和两个按钮时触发相应操作的按钮。
创建选择器功能以从商店提取特定数据
在Redux中,选择器是用于以结构化方式从状态提取数据的函数。当状态复杂或想从状态得出新数据时,选择器特别有用。
在本节中,我们将说明如何在REDUX进行状态管理的React应用程序中创建和使用选择器。
创建选择器函数
要创建选择器函数,您可以从Reselect库中使用createSelector()
函数。 createSelector()
函数采用一个或多个输入选择器和一个转换函数,并返回记忆的选择器函数。
这是如何创建从状态提取当前计数的选择器函数的示例:
import { createSelector } from 'reselect';
const getCount = state => state.counter.count;
export const countSelector = createSelector(
[getCount],
count => count
);
在此示例中,我们使用createSelector()
函数来创建一个名为CountSelector的记忆选择器函数。
选择器函数采用一个名为getCount
的输入选择器,该输入选择器只需从状态的计数片中提取计数属性即可。
转换函数将计数作为输入并将其返回为输出。所得的countSelector
函数可用于以有效的方式从状态提取计数。
在mapStateToProps()
中使用选择器函数
创建了Selector函数后,您可以在mapStateToProps()
函数中使用它,将数据传递给组件作为Props。
这是如何在mapStateToProps()
中使用CountSelector函数的示例:
import { connect } from 'react-redux';
import { countSelector } from './selectors';
function Counter({ count, dispatch }) {
// ...
}
function mapStateToProps(state) {
return {
count: countSelector(state)
};
}
export default connect(mapStateToProps)(Counter);
在此示例中,我们使用connect()
函数将称为Counter
的组件连接到Redux Store。我们正在从称为selectors.js
的文件中导入countSelector
函数。
然后,我们将定义一个mapStateToProps()
函数,该函数将计数属性从状态映射到组件中称为计数的道具,使用countSelector
函数从状态中提取计数。最后,我们正在导出连接的计数器组件。
结论
选择器是Redux中功能强大的工具,使您可以以结构化和性能的方式从状态提取数据。通过使用Reselect库中的createSelector()
函数,您可以创建记忆的选择器函数,从州提取新数据或从状态提取特定的数据。通过将选择器与mapStateToProps()
函数结合使用,您可以将数据传递给React组件作为Props,并将数据传递给UI中的数据。
定论
我们已经讨论了redux如何在React应用中管理复杂状态有用,并介绍了以下各节中的以下主题:
- 安装必要的软件包(redux,react-redux)
- 创建一个redux商店并用初始状态初始化
- 创建动作和动作创建者以更新商店
- 创建还原器来处理操作并更新商店
- 使用UserEducer()挂钩将React组件连接到Redux Store。
如果您想了解有关Redux以及如何在React应用程序中使用它的更多信息,则有一些可能会发现有用的资源:
- Redux documentation:
- Getting Started with Redux course on Egghead:
- Redux Toolkit documentation:
- Reselect documentation: