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

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

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

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

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

redux使用教程

回归正题

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

  1. 首先使用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对象)即可

最新文章

  1. php基础语句2
  2. Android TextView内容过长加省略号,点击显示全部内容
  3. 解析Ceph: Snapshot
  4. laravel 模板 blade
  5. jQuery多版本的使用,同一文件多个版本引用
  6. illegal to have multiple occurrences of contentType with different values (old: text/html; charset=UTF-8, new: text/html; charset=utf-8)
  7. 2014年辛星解读Javascript之用DOM动态操纵HTML元�
  8. PAT (Advanced Level) 1059. Prime Factors (25)
  9. Java高级工程师进阶路线
  10. WordPress设置圆形旋转头像的方法
  11. php程序报错:PHP Core Warning/cannot open shared object file: No such file or directory
  12. 【ASP.NET 问题】ASP.NET 网站404页面返回200,或者302的解决办法
  13. 一种比较简单的实现ping的方式
  14. 最小生成树(prime算法 &amp; kruskal算法)和 最短路径算法(floyd算法 &amp; dijkstra算法)
  15. php-config
  16. 9.8Django
  17. ElasticSearch(九):springboot项目集成消息中间件activeMQ
  18. Bailian 2808 校门外的树(入门线段树)
  19. java批量生成excel文件
  20. alibaba之Nacos

热门文章

  1. 条件竞争(race condition)
  2. Linux—账号管理及命令使用详解
  3. Resis常用命令及数据类型
  4. C006:多项式求值 horner法则
  5. Java8 :lambda表达式初体验
  6. 求学生单科流水表中单科最近/最新的考试成绩表的新增可行性方案 使用Oracle提供的分析函数rank
  7. Java Web项目实现写日志功能
  8. C Primer Plus 学习笔记
  9. windows和linux开启防火墙时允许特定IP和端口
  10. 吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 2 - Neural Network Basics(第二周测验 - 神经网络基础)