使用react和redux构建一个简单的计数器

 更新时间:2025年01月07日 10:45:57   作者:练习两年半的工程师  
这篇文章主要为大家详细介绍了如何使用react和redux构建一个简单的计数器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

modules文件夹之下的counterStore.js

使用 Redux Toolkit 中的 createSlice 方法来定义一个 Redux 的状态管理模块。下面详细解释其各个部分的功能:

1. 导入 createSlice

import { createSlice } from "@reduxjs/toolkit";

createSlice 是 Redux Toolkit 提供的一个函数,用于简化 Redux 的状态管理代码。

它可以同时生成状态(state)、操作函数(actions)和 reducer 函数。

2. 定义 counterStore

const counterStore = createSlice({
    name: 'counter',
    initialState: {
        count: 0
    },
    reducers: {
        increment(state) {
            state.count++
        },
        decrement(state) {
            state.count--
        }
    }
})

name 属性

定义这段状态的名字,作为 action 类型的前缀。

例如,生成的 action 类型可能是 counter/increment 和 counter/decrement。

initialState 属性

定义了状态的初始值:

initialState: {
    count: 0
}

表示这个模块管理的状态是一个包含 count 属性的对象,初始值为 0。

reducers 属性

定义了状态的修改逻辑。

每个函数的参数如下:

  • state:当前模块的状态。
  • action:触发该函数时的附加信息(如 payload)。

在这里,定义了两个 reducer:

1.increment:

  • 增加 count 的值。
  • 使用了 Immer 的特性,可以直接修改状态对象的属性,而不需要返回一个新的状态对象。

2.decrement:

减少 count 的值。

3. 解构 actions

const { increment, decrement } = counterStore.actions;

createSlice 会自动根据 reducers 中定义的函数生成对应的 action creators。

counterStore.actions 是一个包含 increment 和 decrement 的对象。

通过解构,将两个 action creator 分别赋值给 increment 和 decrement。

示例使用:

dispatch(increment()); // 触发 increment action
dispatch(decrement()); // 触发 decrement action

4. 定义 reducer

const counterReducer = counterStore.reducer;

createSlice 生成的 reducer 用于注册到 Redux 的 store 中,处理对应模块的状态更新。

这里将生成的 reducer 赋值给 counterReducer。

5. 导出 actions 和 reducer

export { increment, decrement };
export default counterReducer;

导出 increment 和 decrement,以便在其他地方触发这些 actions。

默认导出 counterReducer,用于注册到 Redux store 中。

总结

这段代码定义了一个简单的计数器模块,包含以下功能:

初始状态:{ count: 0 }

两个操作:

  • increment:将 count 加 1。
  • decrement:将 count 减 1。

自动生成的部分:

  • actions:用于触发状态更新。
  • reducer:处理状态更新逻辑。

它的作用是将计数器状态管理封装为一个独立模块,方便集成到 Redux 的全局状态中。

store文件夹之下的index.js

使用 Redux Toolkit 配置 Redux Store 的基本结构,并将 counterStore 模块集成到 Redux Store 中。以下是详细解析:

1. 导入 configureStore

import { configureStore } from "@reduxjs/toolkit";

configureStore 是 Redux Toolkit 提供的一个函数,用于简化创建 Redux Store 的过程。

相比传统的 createStore,configureStore:

自动集成了 Redux DevTools 扩展。

自动配置了 Redux 中间件(如 redux-thunk)。

支持多个 reducer 的组合。

提供更简洁的配置方式。

2. 导入 counterReducer

import counterReducer from './modules/counterStore';

从 ./modules/counterStore 文件中导入之前定义的 counterReducer。

counterReducer 是 counterStore 中通过 createSlice 创建的 reducer,用于管理 counter 状态。

3. 配置 Store

const store = configureStore({
    reducer: {
        counter: counterReducer
    }
});

configureStore 的参数

接收一个配置对象,用于定义 Store 的行为。

常见配置项:

reducer:

定义所有模块的 reducer。

支持对象形式组合多个 reducer,类似于传统 Redux 的 combineReducers。

在此例中:

reducer: {
    counter: counterReducer
}

将 counterReducer 绑定到 counter 键上,意味着 Redux 的状态结构如下:

{
    counter: {
        count: 0
    }
}

4. 导出 Store

export default store;

将创建的 store 导出,以便在应用中使用,例如通过 Provider 将 Store 绑定到 React 应用。

5. Redux 状态树

根据配置,最终的 Redux 状态树的结构如下:

{
    counter: {
        count: 0
    }
}

counter 是状态的命名空间,对应 counterReducer。

count 是 counter 模块中的一个状态属性。

总结

这段代码是 Redux Toolkit 的典型使用方式:

  • 使用 configureStore 创建 Redux Store。
  • 将 counterReducer 绑定到 counter 命名空间。
  • 导出的 store 可被 React 应用通过 Provider 使用,从而管理 counter 状态。
  • 扩展其他模块时,依然保持代码结构清晰易维护。

src文件夹之下的index.js

这段代码展示了一个典型的 React 项目入口文件,使用 React、React Redux 和 Redux Toolkit 来设置应用。以下是逐部分的详细解析:

1. 导入 React 和相关库

import React from 'react';
import ReactDOM from 'react-dom/client';

React:React 的核心库,用于构建组件和用户界面。

ReactDOM:React 的 DOM 渲染库,用于将 React 组件渲染到 DOM 中。

ReactDOM.createRoot:React 18 新的渲染入口方法,支持并发特性。

2. 导入样式和模块

import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import store from './store';
import { Provider } from 'react-redux';
  • ./index.css:引入全局样式文件,用于定义应用的基础样式。
  • App:主应用组件,是整个 React 应用的根组件。
  • reportWebVitals:性能测量工具,用于监控和优化 React 应用的性能(可选)。
  • store:导入 Redux Store,用于管理应用的全局状态。
  • Provider:来自 react-redux,用于将 Redux Store 注入到整个 React 组件树中。

3. 创建根节点

const root = ReactDOM.createRoot(document.getElementById('root'));

document.getElementById('root'):选择 HTML 中的 id="root" 的 DOM 节点,作为 React 应用的挂载点。

ReactDOM.createRoot:在 React 18 中,使用该方法创建渲染根,支持并发渲染特性。

4. 渲染组件树

root.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>
);

React.StrictMode

React 的调试工具组件,运行时会对代码进行额外检查:

  • 检查生命周期方法的使用是否符合规范。
  • 提醒可能存在的潜在问题(例如不安全的 API)。
  • 在开发模式下启用,不会影响生产环境的性能。

Provider

Redux 提供的上下文组件,作用是:

  • 将 store 传递给组件树中的所有子组件。
  • 任何使用 useSelector 或 useDispatch 的子组件都可以访问 Redux 的状态或分发动作。
  • 必须传入 store 属性,即创建好的 Redux Store 实例。

App

  • React 应用的根组件,表示整个应用的组件树结构。
  • App 中的组件可以通过 Redux 访问全局状态。

5. 性能监控

reportWebVitals();

reportWebVitals 是由 create-react-app 提供的工具,用于监控 React 应用的性能指标。

参数为一个回调函数,用于记录性能数据:

reportWebVitals(console.log);

例如,记录页面的加载时间、首次内容绘制时间等。

或者,将数据发送到分析服务端:

reportWebVitals((metric) => {
  sendToAnalytics(metric);
});

6. 应用整体工作流程

HTML 中定义了一个 <div id="root"></div> 容器,作为 React 应用的挂载点。

ReactDOM.createRoot 创建 React 的根渲染器,挂载到 #root 容器中。

使用 <Provider> 将 Redux Store 注入到整个应用中,确保子组件可以通过 Redux 管理状态。

渲染主组件 <App />,构建用户界面。

如果启用了性能监控,reportWebVitals 会捕获应用的性能数据。

7. 代码结构的意义

模块化设计:将样式、主组件、状态管理和性能监控分离,清晰明了,易于扩展。

React + Redux:结合 Provider 实现全局状态管理,适用于大型应用。

React.StrictMode:帮助开发者捕捉潜在问题,提高代码质量。

总结

这段代码完成了 React 应用的基础配置,将 Redux Store 集成到 React 应用中,并提供性能监控功能,是一个标准的现代 React 项目入口文件结构。

src文件夹之下的App.js

这段代码展示了一个使用 React 和 Redux 的示例,通过 Redux 管理计数器的状态,并在界面上通过按钮实现加减操作。以下是详细解析:

1. 导入 useDispatch 和 useSelector

import { useDispatch, useSelector } from "react-redux";
import { increment, decrement } from "./store/modules/counterStore";

useSelector:

React-Redux 提供的一个 Hook,用于从 Redux Store 中选择状态。

参数是一个回调函数,回调的参数 state 是 Redux 的整个状态树,可以从中提取需要的部分状态。

useDispatch:

React-Redux 提供的另一个 Hook,用于分发(dispatch)Redux 的 action。

返回一个 dispatch 函数,调用时会触发对应的 reducer 更新状态。

increment 和 decrement:

从 counterStore 导入的 action,用于更新计数器状态。

2. 定义 App 组件

function App() {
  const { count } = useSelector(state => state.counter);
  const dispatch = useDispatch();
  ...
}

useSelector 使用

useSelector(state => state.counter):

从 Redux 的状态树中选择 counter 模块的状态。

state.counter 对应 Redux Store 中 counter 的状态:

{
  count: 0
}

解构获取 count 值。

useDispatch 使用

useDispatch():

获取 dispatch 函数。

该函数可用于分发(dispatch)action,触发 Redux 的状态更新。

3. 组件的渲染逻辑

return (
  <div className="App">
    <button onClick={()=>dispatch(decrement())}>-</button>
    {count}
    <button onClick={()=>dispatch(increment())}>+</button>
  </div>
);

按钮的逻辑

减号按钮

<button onClick={()=>dispatch(decrement())}>-</button>

点击时调用 dispatch(decrement()):

decrement() 是 counterStore 中定义的 action。

触发 counterStore 的 decrement reducer,减少 count 值。

状态更新后,React 组件会重新渲染,count 的最新值显示在页面上。

加号按钮

<button onClick={()=>dispatch(increment())}>+</button>

点击时调用 dispatch(increment()):

increment() 是 counterStore 中定义的 action。

触发 counterStore 的 increment reducer,增加 count 值。

状态更新后,React 组件重新渲染,显示最新的 count 值。

显示当前计数

{count}

渲染 count 值,表示当前计数器的状态。

4. Redux 状态和组件交互的工作流程

获取状态:

  • 使用 useSelector 从 Redux Store 中提取状态。
  • 组件中的 {count} 自动更新以反映最新状态。

更新状态:

  • 用户点击按钮,触发 onClick 事件:
  • dispatch(decrement()) 或 dispatch(increment()) 调用。
  • 分发的 action 触发 Redux 的 reducer 更新状态。
  • 更新后的状态通过 useSelector 获取,导致 React 组件重新渲染。

5. 结合 Redux Store 的功能

假设 Redux Store 的状态结构如下:

{
  counter: {
    count: 0
  }
}

初始状态:count = 0

点击 加号按钮:

  • dispatch(increment())
  • count++,状态变为 { count: 1 }

点击 减号按钮:

  • dispatch(decrement())
  • count--,状态变为 { count: 0 }

6. 代码的意义

展示了 React 和 Redux 的集成:

使用 useSelector 提取状态。

使用 useDispatch 分发 action。

通过状态管理实现组件的动态交互,避免直接管理状态的复杂性。

模块化的 Redux Store 设计使代码易扩展,例如增加其他状态模块或功能。

7. 扩展建议

添加初始化状态:可以通过 Redux 提供初始状态的功能,使 count 的初始值可配置。

增强样式:引入 CSS 或组件库美化按钮和布局。

多功能性:添加更多操作,比如重置计数、设置计数的步长。

总结

这段代码是一个简单但完整的 React + Redux 示例,通过按钮实现全局状态 count 的加减操作。它展示了 Redux 状态管理的核心用法,包括 useSelector 和 useDispatch,以及 Redux 和 React 的无缝集成。

到此这篇关于使用react和redux构建一个简单的计数器的文章就介绍到这了,更多相关react redux构建计数器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React利用scheduler思想实现任务的打断与恢复

    React利用scheduler思想实现任务的打断与恢复

    这篇文章主要为大家详细介绍了React如何利用scheduler思想实现任务的打断与恢复,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2024-03-03
  • 浅谈在react中如何实现扫码枪输入

    浅谈在react中如何实现扫码枪输入

    这篇文章主要介绍了浅谈在react中如何实现扫码枪输入,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • react中关于useCallback的用法

    react中关于useCallback的用法

    这篇文章主要介绍了react中关于useCallback的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • react diff 算法实现思路及原理解析

    react diff 算法实现思路及原理解析

    这篇文章主要介绍了react diff 算法实现思路及原理解析,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有我们常见的 key 的作用,需要的朋友可以参考下
    2022-05-05
  • ahooks useInfiniteScroll源码解析

    ahooks useInfiniteScroll源码解析

    这篇文章主要为大家介绍了ahooks useInfiniteScroll源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • react中antd Upload手动上传的示例

    react中antd Upload手动上传的示例

    本文主要介绍了react中antd Upload手动上传的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • react+antd select下拉框实现模糊搜索匹配的示例代码

    react+antd select下拉框实现模糊搜索匹配的示例代码

    我们在开发过程中,经常会出现下拉框数据很多得情况,本文主要介绍了react+antd select下拉框实现模糊搜索匹配的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • React深入浅出分析Hooks源码

    React深入浅出分析Hooks源码

    在react类组件(class)写法中,有setState和生命周期对状态进行管理,但是在函数组件中不存在这些,故引入hooks(版本:>=16.8),使开发者在非class的情况下使用更多react特性
    2022-11-11
  • React RenderProps模式超详细讲解

    React RenderProps模式超详细讲解

    render props是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的技术。简单来说,给一个组件传入一个prop,这个props是一个函数,函数的作用是用来告诉这个组件需要渲染什么内容,那么这个prop就成为render prop
    2022-11-11
  • React中Portals与错误边界处理实现

    React中Portals与错误边界处理实现

    本文主要介绍了React中Portals与错误边界处理实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07

最新评论