返回

复盘:手写 Redux 和 React-Redux

前端

掌握 Redux 和 React-Redux 的终极指南

基本概念

Redux 是一种管理应用程序状态的 JavaScript 库。它遵循单一状态树原则,这意味着应用程序的整个状态都存储在一个称为 store 的中央对象中。store 是只读的,任何状态更改都必须通过分发 action 来实现。

action 是包含操作类型和可选数据的简单对象。reducer 是一个纯函数,它根据 action 和当前 state 计算新的 state

数据流

Redux 的数据流涉及以下步骤:

  1. 用户触发一个动作,例如单击按钮。
  2. action 被分发到 store
  3. reducer 根据 action 和当前 state 计算新的 state
  4. store 更新为新的 state
  5. 组件重新渲染,以反映新的 state

创建 Store

要使用 Redux,首先需要创建一个 storestore 是一个包含应用程序整个 state 的 JavaScript 对象。可以使用 createStore() 函数创建 store,如下所示:

import { createStore } from 'redux';

const store = createStore(reducer);

分发 Action

action 是一个包含操作类型和可选数据的简单对象。可以使用 dispatch() 方法分发 action,如下所示:

store.dispatch({
  type: 'ADD_TODO',
  text: 'Learn Redux'
});

编写 Reducer

reducer 是一个纯函数,它根据 action 和当前 state 计算新的 statereducer 必须是纯函数,这意味着它不能产生副作用,也不能修改 actionstate。可以使用 switch 语句编写 reducer,如下所示:

function reducer(state = {}, action) {
  switch (action.type) {
    case 'ADD_TODO':
      return {
        ...state,
        todos: [...state.todos, action.text]
      };
    default:
      return state;
  }
}

集成到 React 应用程序

要将 Redux 集成到 React 应用程序中,可以使用 react-redux 库。react-redux 提供了 Providerconnect() 两个组件,可以将 Redux store 与 React 组件连接起来。

Provider

首先需要在应用程序的根组件中包裹 Provider,如下所示:

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';

import store from './store';
import App from './App';

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

connect

可以使用 connect() 函数将 Redux store 与 React 组件连接起来,如下所示:

import React, { Component } from 'react';
import { connect } from 'react-redux';

class TodoList extends Component {
  render() {
    return (
      <ul>
        {this.props.todos.map((todo, index) => (
          <li key={index}>{todo}</li>
        ))}
      </ul>
    );
  }
}

const mapStateToProps = (state) => {
  return {
    todos: state.todos
  };
};

export default connect(mapStateToProps)(TodoList);

这样,TodoList 组件就可以访问 Redux store 中的 state 了。

结论

Redux 和 React-Redux 是用于管理复杂应用程序状态的强大工具。通过理解其机制并遵循本文概述的步骤,您可以轻松掌握这些库并提高您的 React 开发效率。

常见问题解答

1. Redux 和状态管理库之间有什么区别?

Redux 是一个特定的状态管理库,而其他库(如 MobX 和 Zustand)提供了不同的方法来管理状态。Redux 以其严格的单一状态树原则和可预测的数据流而闻名。

2. 为什么 Redux 使用纯函数?

Redux 使用纯函数(即 reducer)来确保状态的可预测性和可重复性。纯函数不依赖于外部状态或产生副作用,这使得调试和测试应用程序变得更加容易。

3. 如何处理 Redux 中的异步操作?

可以使用 Redux Thunk 或 Redux Saga 等中间件来处理 Redux 中的异步操作。这些中间件允许分派函数,这些函数可以返回一个 Promise 或执行副作用。

4. Redux 是否始终是 React 应用程序的最佳状态管理选择?

Redux 是一个强大的状态管理工具,但它并不总是适合所有 React 应用程序。对于小型或不涉及复杂状态管理的应用程序,可以使用更简单的库(如 Zustand)。

5. Redux 在大型应用程序中有哪些优势?

Redux 适用于大型应用程序,因为它提供了对状态的集中控制、可预测的数据流以及扩展性和可测试性。