news 2026/5/6 14:10:58

React-Redux 中的useDispatch 用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
React-Redux 中的useDispatch 用法

目录

useDispatch 的基本概念

主要用途

在我们的项目中的应用


useDispatch 的基本概念

useDispatch是一个 React Hook,它返回 Redux store 的 dispatch 函数的引用。通过这个函数,我们可以向 Redux store 发送 actions,从而更新应用程序的状态。

主要用途

  1. 触发 Redux actions:通过 useDispatch 获取 dispatch 函数,然后用它来 dispatch actions,更新 Redux store 中的状态。

  2. 连接 UI 与状态管理:允许组件通过 dispatching actions 来响应用户交互或其它事件。

在我们的项目中的应用

在 Login.tsx 组件中,我们这样使用了 useDispatch:

import React, { FC, useEffect } from 'react' import { useNavigate, Link } from 'react-router-dom' import { Typography, Space, Form, Input, Button, Checkbox, message } from 'antd' import { UserAddOutlined } from '@ant-design/icons' import { useDispatch } from 'react-redux' import { useRequest } from 'ahooks' import { REGISTER_PATHNAME, MANAGE_INDEX_PATHNAME } from '../router' import { loginService } from '../services/user' import { setToken } from '../utils/user-token' import { loginReducer } from '../store/userReducer' import styles from './Login.module.scss' const { Title } = Typography const USERNAME_KEY = 'USERNAME' const PASSWORD_KEY = 'PASSWORD' function rememberUser(username: string, password: string) { localStorage.setItem(USERNAME_KEY, username) localStorage.setItem(PASSWORD_KEY, password) } function deleteUserFromStorage() { localStorage.removeItem(USERNAME_KEY) localStorage.removeItem(PASSWORD_KEY) } function getUserInfoFromStorage() { return { username: localStorage.getItem(USERNAME_KEY), password: localStorage.getItem(PASSWORD_KEY), } } const Login: FC = () => { const nav = useNavigate() const dispatch = useDispatch() const [form] = Form.useForm() // 第三方 hook useEffect(() => { const { username, password } = getUserInfoFromStorage() form.setFieldsValue({ username, password }) }, []) const { run } = useRequest( async (username: string, password: string) => { const data = await loginService(username, password) return data }, { manual: true, onSuccess(result) { const { token = '', userInfo } = result setToken(token) // 存储 token // 主动将用户信息存入 Redux store const { username, nickname } = userInfo dispatch(loginReducer({ username, nickname })) message.success('登录成功') nav(MANAGE_INDEX_PATHNAME) // 导航到"我的问卷" }, } ) const onFinish = (values: any) => { const { username, password, remember } = values || {} run(username, password) // 执行 ajax if (remember) { rememberUser(username, password) } else { deleteUserFromStorage() } } return ( <div className={styles.container}> <div> <Space> <Title level={2}> <UserAddOutlined /> </Title> <Title level={2}>用户登录</Title> </Space> </div> <div> <Form labelCol={{ span: 6 }} wrapperCol={{ span: 16 }} initialValues={{ remember: true }} onFinish={onFinish} form={form} > <Form.Item label="用户名" name="username" rules={[ { required: true, message: '请输入用户名' }, { type: 'string', min: 5, max: 20, message: '字符长度在 5-20 之间' }, { pattern: /^\w+$/, message: '只能是字母数字下划线' }, ]} > <Input /> </Form.Item> <Form.Item label="密码" name="password" rules={[{ required: true, message: '请输入密码' }]} > <Input.Password /> </Form.Item> <Form.Item name="remember" valuePropName="checked" wrapperCol={{ offset: 6, span: 16 }}> <Checkbox {...({ children: '记住我' } as any)} /> </Form.Item> <Form.Item wrapperCol={{ offset: 6, span: 16 }}> <Space> <Button type="primary" htmlType="submit"> 登录 </Button> <Link to={REGISTER_PATHNAME}>注册新用户</Link> </Space> </Form.Item> </Form> </div> </div> ) } export default Login

在这段代码中,useDispatch 的作用是:
1. 获取 Redux store 的 dispatch 函数
2. 当登录成功后,主动调用 dispatch(loginReducer({ username, nickname })) 将用户信息存储到 Redux store 中
3. 这样在页面跳转后,目标页面就能立即从 Redux store 中获取到用户信息,而不需要等待异步请求
为什么需要这样做?
在我们之前的实现中,虽然登录成功并存储了 token,但在跳转到新页面时,目标页面需要通过 useLoadUserData 钩子来加载用户信息。这个钩子会检查 Redux store 中是否已经有用户信息:

// 判断当前 redux store 是否已经存在用户信息 const { username } = useGetUserInfo() // redux store useEffect(() => { if (username) { setWaitingUserData(false) // 如果 redux store 已经存在用户信息,就不用重新加载了 return } run() // 如果 redux store 中没有用户信息,则进行加载 }, [username])

如果我们不在登录成功后主动将用户信息存入 Redux,那么在跳转后,username 会是空的,导致 useLoadUserData 钩子发起 AJAX 请求去获取用户信息。由于浏览器的异步特性和可能的时序问题,这可能导致页面显示异常或者延迟。
通过使用 useDispatch 主动 dispatch 用户信息,我们确保了在跳转后,Redux store 中已经有正确的用户信息,避免了额外的网络请求和潜在的时序问题。

总结

useDispatch 是 React-Redux 中的关键 Hook,它使得函数组件能够与 Redux store 进行交互,通过 dispatching actions 来更新全局状态。在我们的案例中,它帮助我们解决了登录后跳转时的用户体验问题,确保用户信息能及时同步到 Redux store 中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 10:33:36

Kotaemon CPU fallback机制:无GPU也能运行

Kotaemon CPU fallback机制&#xff1a;无GPU也能运行 在企业级AI应用快速落地的今天&#xff0c;一个现实问题始终困扰着开发者&#xff1a;如何让大语言模型&#xff08;LLM&#xff09;在没有GPU的环境中依然“跑得动”&#xff1f;尤其是在中小企业、内网部署或边缘设备场景…

作者头像 李华
网站建设 2026/4/30 11:04:26

大模型性能加速指南:FP8混合精度训练技术全解析!

简介 文章详细介绍了FP8(8位浮点数)在大模型训练中的应用&#xff0c;包括E4M3和E5M2两种格式及其优势&#xff1a;加速计算、节约显存和加速通信。重点讨论了Per-tensor scaling、Blockwise scaling和MXFP8等不同recipe&#xff0c;以及在Hopper和Blackwell平台上的实现差异。…

作者头像 李华
网站建设 2026/5/5 8:46:46

C++ 析构函数为什么不建议抛出未捕获的异常

在C中&#xff0c;析构函数不建议抛出未捕获的异常&#xff0c;核心原因是这会破坏程序的异常安全机制&#xff0c;导致未定义行为&#xff08;Undefined Behavior&#xff09;。以下从底层逻辑、场景风险、语言规则三个维度详细解释&#xff1a; 一、核心矛盾&#xff1a;异常…

作者头像 李华
网站建设 2026/4/18 18:11:01

面料特性与检测差异:针织、梭织与功能性面料对AI验布系统的不同挑战

在纺织行业中&#xff0c;面料的多样性决定了生产流程的复杂性。不同的面料不仅在织造工艺上存在本质区别&#xff0c;其瑕疵特征、物理特性以及在后道加工中的要求也各不相同。这给AI验布系统的设计与应用带来了差异化的技术挑战。本文将从针织、梭织和功能性面料三大类别出发…

作者头像 李华
网站建设 2026/5/6 6:18:15

Kotaemon小说创作伙伴:情节发展与人物设定

Kotaemon小说创作伙伴&#xff1a;情节发展与人物设定 在当代内容创作的浪潮中&#xff0c;越来越多的作家和编剧开始尝试借助人工智能来突破灵感瓶颈。然而&#xff0c;许多AI工具虽然能生成流畅文本&#xff0c;却常常“忘记”前文设定、让角色行为前后矛盾&#xff0c;甚至凭…

作者头像 李华