用Redux革新您的React应用程序:简化状态管理的初学者指南(第2部分)
#javascript #网络开发人员 #react #redux

Here is a link to PART 1

创建还原功能来处理每种操作类型并相应地更新商店

还原器被称为还原器,因为它们用于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
});

在此示例中,我们正在创建两个还原器:counterReducertodosReducer。每个还原器都处理状态的不同部分。

然后,我们使用combineReducers()将这些还原器组合到称为rootreducer的单个还原函数中。所得状态对象将具有两个属性:countertodos,它们对应于每个还原器处理的状态。

在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())分别派遣INCREMENTDECREMENT动作。

最后,我们正在渲染当前计数和两个按钮时触发相应操作的按钮。

创建选择器功能以从商店提取特定数据

在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应用程序中使用它的更多信息,则有一些可能会发现有用的资源:

谢谢阅读

Connect with me on Twitter