前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【译】如何结合React Hooks来使用Redux

【译】如何结合React Hooks来使用Redux

作者头像
用户1097444
发布2022-06-29 14:40:31
2.7K0
发布2022-06-29 14:40:31
举报
文章被收录于专栏:腾讯IMWeb前端团队

本文由 IMWeb 首发于 IMWeb 社区网站 imweb.io。点击阅读原文查看 IMWeb 社区更多精彩文章。

原文地址:https://itnext.io/how-to-use-redux-with-react-hooks-5422a7ceae6e

React-redux(https://github.com/reduxjs/react-redux) 发布了 7.1.0 版本的 hooks 。这意味着我们可以使用 React 的最新最佳实践。

Hooks 让我们为相同的功能编写更少的代码。我们需要编写的代码越少,我们就可以越快地启动应用程序。

简单的 Redux 组件

这是一个非常基本和传统的 Redux 连接组件。您会如何使用 Hooks 来重构它?

代码语言:javascript
复制
import React, { Component } from "react";import { connect } from "react-redux";import { toggleSwitch } from "./UiReducer";
class Toggle extends Component {  render() {    const { ui, toggleSwitch } = this.props;    return (      <div>        <div>{JSON.stringify(ui)}</div>        <input          type="checkbox"          value={ui.toggle}          onChange={toggleSwitch}        />      </div>    );  }}
const mapStateToProps = ({ ui }) => ({  ui});
export default connect(  mapStateToProps,  { toggleSwitch })(Toggle);

上面是一个切换复选框的简单组件。为了简单起见,我们只有一个状态, toggle 是一个布尔值。

用Redux切换复选框

如果您对 hooks 有一定的了解,那么您可能知道 hooks 需要在函数组件中使用。您不能在 React 类中使用 hooks。

第1步 - 将类组件重构为函数组件

将 React 组件从类转换到函数组件是相当简单的。我们要做的就是

代码语言:javascript
复制
import React from "react";import { connect } from "react-redux";import { toggleSwitch } from "./UiReducer";
const Toggle = ({ ui, toggleSwitch }) => (  <div>    <div>{JSON.stringify(ui)}</div>    <input type="checkbox" value={ui.toggle} onChange={toggleSwitch} />  </div>);
const mapStateToProps = ({ ui }) => ({  ui});
export default connect(  mapStateToProps,  { toggleSwitch })(Toggle);

注意:这个代码比之前的已经短了很多。我们将类语法替换为更简单的函数语法。我们还从箭头函数参数 props 中解构了 uitoggleSwitch属性。可以肯定的是,切换仍然按预期工作。

Hooks 通常使用 use 关键字作前缀,比如 useStateuseSelecor

我们目前从 store 读取状态的方法是通过 mapStateToProps 并将函数组件封装在 connectHOC中。

第2步 - useSelector

让我们从使用 hooks 读取状态开始。我们需要从 react-redux 包中导入 useSelector。使用 useSelector hook,我们可以读取我们的状态。

代码语言:javascript
复制
import React from "react";import { connect, useSelector } from "react-redux";import { toggleSwitch } from "./UiReducer";
const Toggle = ({ toggleSwitch }) => {  const ui = useSelector(state => state.ui);  return (    <div>      <div>{JSON.stringify(ui)}</div>      <input type="checkbox" value={ui.toggle} onChange={toggleSwitch} />    </div>  );};
export default connect(  null,  { toggleSwitch })(Toggle);

注意:我们删除了 ui 参数,并使用 useSelector hook。useSelector 的第一个参数是存储的状态。

第3步 - useDispatch

useDispatch hook 让我们执行 redux 操作。我们从 react-redux 包导入 useDispatchhook。

使用 useDispatch 相对简单,我们将 hook 实例保存在一个变量下。我们可以在任何事件监听器中调用 dispatch 函数。

代码语言:javascript
复制
import React from "react";import { useSelector, useDispatch } from "react-redux";import { TOGGLE } from "./UiReducer";
const Toggle = () => {  const ui = useSelector(state => state.ui);  const dispatch = useDispatch();  return (    <div>      <div>{JSON.stringify(ui)}</div>      <input        type="checkbox"        value={ui.toggle}        onChange={() => dispatch({ type: TOGGLE })}      />    </div>  );};
export default Toggle;

注意:我们在这里调用 dispatch 函数时使用类型常量 TOGGLE,我们在 Redux 常量中定义了这个类型并将其导入到组件中。

代码语言:javascript
复制
export const TOGGLE = "ui/toggle";

如果您想将 payload 传递给 dispatcher,请像往常一样执行此操作。

代码语言:javascript
复制
dispatch({ type: TOGGLE, payload: 'My payload' })

总结

恭喜!您成功地从类重构为使用 hooks。为了确保一切正常工作,让我们再测试一次 toggle。

是的,一切正常。源码(https://codesandbox.io/s/react-redux-hook-by-indrek-lasn-utc6h)现在您已经了解了 hooks 的基础知识并使用了 hooks 与redux ,我建议您阅读文档(https://react-redux.js.org/api/hooks)以深入了解这些概念。

此外,我建议阅读 Functional React: Quickstart with React Hooks, Redux and MobX(https://amzn.to/2T07zrK) 一书,深入了解 Redux、React 和 MobX。

关注我们

IMWeb 团队隶属腾讯公司,是国内最专业的前端团队之一。

我们专注前端领域多年,负责过 QQ 资料、QQ 注册、QQ 群等亿级业务。目前聚焦于在线教育领域,精心打磨 腾讯课堂、企鹅辅导 及 ABCMouse 三大产品。

社区官网

http://imweb.io/

加入我们

https://www.lagou.com/jobs/4465788.html

扫码关注 IMWeb前端社区 公众号,获取最新前端好文

微博、掘金、Github、知乎可搜索 IMWebIMWeb团队 关注我们。

👇点击阅读原文获取更多参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯IMWeb前端团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单的 Redux 组件
  • 第1步 - 将类组件重构为函数组件
  • 第2步 - useSelector
  • 第3步 - useDispatch
  • 总结
    • 关注我们
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档