使用react Context+useReducer替代redux
首先明确一点,Redux 是一个有用的架构,但不是非用不可。事实上,大多数情况,你可以不用它,只用 React 就够了。
曾经有人说过这样一句话。
"如果你不知道是否需要 Redux,那就是不需要它。"
Redux 的创造者 Dan Abramov 又补充了一句。
"只有遇到 React 实在解决不了的问题,你才需要 Redux 。"
redux使用教程
回归正题
如何使用context+useReducer来做类似于Vuex一样的全局状态管理.
- 首先使用create-react-app创建项目
npx create-react-app my-app
cd my-app
npm start
2. 在src目录下创建state文件夹,里面只有一个index.js文件
src
| ---- state
| ------index.js
...
3. state>index.js代码如下
import React, { useReducer } from "react" //导入react,
const State = React.createContext() //创建Context对象,来向组件树传递数据
//定义reducer的改变规则
const ADD = "ADD"
const DECREASE = "DECREASE"
function reducer(state, action) {
switch (action) {
case ADD:
return state + 1
case DECREASE:
return state - 1
default:
return state
}
}
//定义一个组件来包裹需要获取到共享数据的组件
const StateProvider = props => {
//获取值和设置值的方法,0是默认值
const [state, dispatch] = useReducer(reducer, 0)
/* value 就是组件树能够拿到的数据,传了一个state值,和一个dispatch方法
dispatch就是为了改变state用的 */
return <State.Provider value={{ state, dispatch }}>
{props.children}
</State.Provider>
}
export {
State, StateProvider, ADD, DECREASE
}
4. src目录下只留下state文件夹,index.js文件,App.js文件,新建components文件夹
src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { StateProvider } from "./state" ReactDOM.render(
<StateProvider>
<App />
</StateProvider>,
document.getElementById('root')
);
src/App.js
import React, { useContext } from "react"
import MyComponents01 from "./components/MyComponents01"
import { State, ADD, DECREASE } from "./state" //取出context对象
export default function App() {
const { dispatch }=useContext(State) //获取到dispatch
return <>
<h1>计数器:</h1>
<div>
<button onClick={()=> dispatch(ADD)}>+1</button>
<button onClick={()=> dispatch(DECREASE)}>-1</button>
</div>
<MyComponents01 />
</>
}
src/components/MyComponents01.js
import React, { useContext } from "react"
import { State } from "../state" //取出context对象
export default function MyComponents01(){
//取出共享的数据state
const { state }=useContext(State)
return <div>
共享数据:{state}
</div>
}
最终效果
tips
只要在Provide组件下, 所有的组件都可以获取到共享数据,
获取共享数据也很简单.引入Context对象
在组件内部使用const { ... } =useContext(创建的Context对象)即可
使用react Context+useReducer替代redux的更多相关文章
- React Hooks +React Context vs Redux
React Hooks +React Context vs Redux https://blog.logrocket.com/use-hooks-and-context-not-react-and-r ...
- useReducer代替Redux小案例-1(七)
使用useContext和useReducer是可以实现类似Redux的效果,并且一些简单的个人项目,完全可以用下面的方案代替Redux,这种做法要比Redux简单一些.因为useContext和us ...
- 探索 Redux4.0 版本迭代 论基础谈展望(对比 React context)
Redux 在几天前(2018.04.18)发布了新版本,6 commits 被合入 master.从诞生起,到如今 4.0 版本,Redux 保持了使用层面的平滑过渡.同时前不久, React 也从 ...
- 如何在非 React 项目中使用 Redux
本文作者:胡子大哈 原文链接:https://scriptoj.com/topic/178/如何在非-react-项目中使用-redux 转载请注明出处,保留原文链接和作者信息. 目录 1.前言 2. ...
- 前端笔记之React(五)Redux深入浅出
一.Redux整体感知 Redux是JavaScript状态管理容器,提供了可被预测状态的状态管理容器.来自于Flux思想,Facebook基于Flux思想,在2015年推出Redux库. 中文网站: ...
- useReducer代替Redux
创建state.js import React, { createContext,useContext,useReducer } from 'react'; export const countTex ...
- useReducer代替Redux小案例-2(八)
通过上节课的学习,用useContext实现了Redux状态共享的能力,这节课看一下如何使用useReducer来实现业务逻辑的控制.需要注意的是这节课的内容是接着上节课的,需要你把上节课的代码部分完 ...
- 【前端】react学习阶段总结,学习react、react-router与redux的这些事儿
前言 借用阮一峰的一句话:真正学会 React 是一个漫长的过程. 这句话在我接触react深入以后,更有感触了.整个react体系都是全新的,最初做简单的应用,仅仅使用react-tools打包js ...
- 如何优雅地在React项目中使用Redux
前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...
随机推荐
- ASP.NET Uploadify 上传文件过大 报错(http error)借鉴,以防忘记
Uploadify上传文件原来很早之前用过,没发现什么问题.今天再使用过程中,当文件大于30M的时候就会报错404.查看错误消息提示配置最大上传太小了.需要修改. 记得原来配置上传文件大小在这里:&l ...
- String字符串的最大长度是多少?
在学习和开发过程中,我们经常会讨论 short ,int 和 long 这些基本数据类型的取值范围,但是对于 String 类型我们好像很少注意它的"取值范围".那么对于 Stri ...
- Linux:apache第一个简单的站点
前提: apache安装目录再/application/apache/ 1.先进入安装目录中 cd /application/apache/ ls 查看目录中的内容 可以看到好多我们常见的文件夹,bi ...
- 故事:坐在我隔壁的小王问我什么是HyperLogLog
1 最近坐我隔壁的小王同志,心情真是糟透了.不但工作不顺心,被老板狠狠的批了一顿,连女朋友也跟别人跑了(Y 的让你天天在我面前秀). 真是不可谓不惨,我都快要同情他了. 看着他萎靡又迷离的眼神,我实在 ...
- Linux实战(16):Centos history命令进阶
因在使用history命令是发现历史命令不同步,没有时间戳,在查看历史操作的时候很不方便,特查询了相关文档,发现可通过系统自带的logger来记录跟踪,历史命令执行的用户,时间,登录IP. vim / ...
- 【Nginx】冰河又一本超硬核Nginx PDF教程免费开源!!
写在前面 在 [冰河技术] 微信公众号中的[Nginx]专题,更新了不少文章,有些读者反馈说,在公众号中刷 历史文章不太方便,有时会忘记自己看到哪一篇了,当打开一篇文章时,似乎之前已经看过了, 但就是 ...
- QQDIV失效补救
{"styleId":22,"bgId":3807,"cardId":3807,"renderInfo":{" ...
- 5.CyclicBarrier-栅栏
- 从Class源码看反射
日常敲码中,如果想要在程序运行阶段访问某个类的所有信息,并支持修改类的状态或者行为的话,肯定会用到反射,而反射靠的就是Class类.Java的动态代理也用到了这个东西,所以了解其基本操作在苦逼的CRU ...
- centos 端口测试之nc使用
服务器端口测试是否正常,运维一般使用telnet来检查,但它有局限性,服务器的端口必须存在服务运行. 这时使用nc可以在服务端模拟开启一个端口,再通过nc测试此端口,好用! nc是netcat工具的简 ...