首先明确一点,Redux 是一个有用的架构,但不是非用不可。事实上,大多数情况,你可以不用它,只用 React 就够了。

曾经有人说过这样一句话。

"如果你不知道是否需要 Redux,那就是不需要它。"

Redux 的创造者 Dan Abramov 又补充了一句。

"只有遇到 React 实在解决不了的问题,你才需要 Redux 。"

redux使用教程

回归正题

如何使用context+useReducer来做类似于Vuex一样的全局状态管理.

  1. 首先使用create-react-app创建项目
  1. npx create-react-app my-app
  2. cd my-app
  3. npm start

  2. 在src目录下创建state文件夹,里面只有一个index.js文件

  1. src
  2. | ---- state
  3. | ------index.js
  4. ...

  3. state>index.js代码如下

  1. import React, { useReducer } from "react" //导入react,
  2.  
  3. const State = React.createContext() //创建Context对象,来向组件树传递数据
  4. //定义reducer的改变规则
  5. const ADD = "ADD"
  6. const DECREASE = "DECREASE"
  7. function reducer(state, action) {
  8. switch (action) {
  9. case ADD:
  10. return state + 1
  11. case DECREASE:
  12. return state - 1
  13. default:
  14. return state
  15. }
  16. }
  17. //定义一个组件来包裹需要获取到共享数据的组件
  18. const StateProvider = props => {
  19. //获取值和设置值的方法,0是默认值
  20. const [state, dispatch] = useReducer(reducer, 0)
  21. /* value 就是组件树能够拿到的数据,传了一个state值,和一个dispatch方法
  22. dispatch就是为了改变state用的 */
  23. return <State.Provider value={{ state, dispatch }}>
  24. {props.children}
  25. </State.Provider>
  26. }
  27.  
  28. export {
  29. State, StateProvider, ADD, DECREASE
  30. }

  4. src目录下只留下state文件夹,index.js文件,App.js文件,新建components文件夹

src/index.js

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import App from './App';
  4. import { StateProvider } from "./state"
  5.  
  6. ReactDOM.render(
  7. <StateProvider>
  8. <App />
  9. </StateProvider>,
  10. document.getElementById('root')
  11. );

src/App.js

  1. import React, { useContext } from "react"
  2. import MyComponents01 from "./components/MyComponents01"
  3. import { State, ADD, DECREASE } from "./state" //取出context对象
  4.  
  5. export default function App() {
  6. const { dispatch }=useContext(State) //获取到dispatch
  7. return <>
  8. <h1>计数器:</h1>
  9. <div>
  10. <button onClick={()=> dispatch(ADD)}>+1</button>
  11. <button onClick={()=> dispatch(DECREASE)}>-1</button>
  12. </div>
  13. <MyComponents01 />
  14. </>
  15.  
  16. }

src/components/MyComponents01.js

  1. import React, { useContext } from "react"
  2. import { State } from "../state" //取出context对象
  3.  
  4. export default function MyComponents01(){
  5. //取出共享的数据state
  6. const { state }=useContext(State)
  7.  
  8. return <div>
  9. 共享数据:{state}
  10. </div>
  11. }

最终效果

tips

只要在Provide组件下, 所有的组件都可以获取到共享数据,
获取共享数据也很简单.引入Context对象
在组件内部使用const { ... } =useContext(创建的Context对象)即可

使用react Context+useReducer替代redux的更多相关文章

  1. React Hooks +React Context vs Redux

    React Hooks +React Context vs Redux https://blog.logrocket.com/use-hooks-and-context-not-react-and-r ...

  2. useReducer代替Redux小案例-1(七)

    使用useContext和useReducer是可以实现类似Redux的效果,并且一些简单的个人项目,完全可以用下面的方案代替Redux,这种做法要比Redux简单一些.因为useContext和us ...

  3. 探索 Redux4.0 版本迭代 论基础谈展望(对比 React context)

    Redux 在几天前(2018.04.18)发布了新版本,6 commits 被合入 master.从诞生起,到如今 4.0 版本,Redux 保持了使用层面的平滑过渡.同时前不久, React 也从 ...

  4. 如何在非 React 项目中使用 Redux

    本文作者:胡子大哈 原文链接:https://scriptoj.com/topic/178/如何在非-react-项目中使用-redux 转载请注明出处,保留原文链接和作者信息. 目录 1.前言 2. ...

  5. 前端笔记之React(五)Redux深入浅出

    一.Redux整体感知 Redux是JavaScript状态管理容器,提供了可被预测状态的状态管理容器.来自于Flux思想,Facebook基于Flux思想,在2015年推出Redux库. 中文网站: ...

  6. useReducer代替Redux

    创建state.js import React, { createContext,useContext,useReducer } from 'react'; export const countTex ...

  7. useReducer代替Redux小案例-2(八)

    通过上节课的学习,用useContext实现了Redux状态共享的能力,这节课看一下如何使用useReducer来实现业务逻辑的控制.需要注意的是这节课的内容是接着上节课的,需要你把上节课的代码部分完 ...

  8. 【前端】react学习阶段总结,学习react、react-router与redux的这些事儿

    前言 借用阮一峰的一句话:真正学会 React 是一个漫长的过程. 这句话在我接触react深入以后,更有感触了.整个react体系都是全新的,最初做简单的应用,仅仅使用react-tools打包js ...

  9. 如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...

随机推荐

  1. Codeforces 1337D Xenia and Colorful Gems

    题意 给你3个数组\(a, b\)和\(c\),最小化\((x-y)^2+(y-z)^2+(z-x)^2\),其中\(x \in a, y \in b, z \in c\). 解题思路 这题其实第一眼 ...

  2. 笔记 | 第一个量子算法:Deutsch-Jozsa算法,非常好懂!

    <关于胡小兔的博客又诈尸了这件事> 信息物理真是难啊!上节课讲了量子计算的最基础的概念和Deutsch-Jozsa算法,我看了好几天才看懂-- 等考完试估计我就忘了,所以今天先写个博客给未 ...

  3. Ocelot+Consul实现微服务架构

    API网关 API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式.以前的话,客户端不得不去请求微服务A ...

  4. Agumater 增加基本数据上传下载能力

  5. Asp.Net中的三种分页方式总结

    本人ASP.net初学,网上找了一些分页的资料,看到这篇文章,没看到作者在名字,我转了你的文章,只为我可以用的时候方便查看,2010的文章了,不知道这技术是否过期. 以下才是正文 通常分页有3种方法, ...

  6. AWD 第二弹

    前言 小组第二次awd训练 万能密码登陆 首页发现一个登录界面,使用万能密码登陆 ' or 1=1#' 登陆成功后,发现Flag 任意文件上传 刚刚的后台界面存在上传按钮,可直接上传一句话木马 文件包 ...

  7. Ubuntu更换国内源--解决终端下载速度慢的问题

    目前我已知的更改国内源的方法基本上就两种,第一种,把/etc/apt/sources.list文件里的源更换一下,改成阿里云或者其它源.第二种,更换在设置中software&updates(软 ...

  8. iptables防火墙说明即使用

    防火墙是架设在公网和私网之间的服务器,隔离公网和私网,保护私网. RHEL7默认使用firewalld作为防火墙. 但firewalld底层还是调用包过滤防火墙iptables #systemctl ...

  9. RocketMQ的发送模式和消费模式

    前言 小伙伴们大家好啊,王子又来和大家一起闲谈MQ技术了. 通过之前文章的学习,我们已经对RocketMQ的基本架构有了初步的了解,那今天王子就和大家一起来点实际的,用代码和大家一起看看RocketM ...

  10. [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)

    ##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...