react|react hook redux useReducer useContext 实现redux 可在外部js访问
创建主文件
- 根目录
src
创建reducer
文件夹 - 文件夹下创建
useDataX.js
文件
//useDataX.jsimport { createContext, useContext, useReducer } from "react";
//? 抛出,创建context上下文,可被访问(通过DataContext.provider的value)
export const DataContext = createContext({});
//? 定义初始值(创建useReducer使用)
const creatData = https://www.it610.com/article/{
loading:false
}//? 抛出,方法可以在普通js中访问
export function dispatchRef(value){
return {
current: value
};
}//? 这样的形式就叫reducer (通过useReducer传来的值,接收到state:原始值(改变creatData后)、action:变化后的值(dispatch传来的值)
function reducer(state, action) {
if(action.type==='loading'){
let stateClone = {...state}// 这里需要深拷贝复制,可以用JSON.parse(JSON.stringify(state))转化一下
stateClone.loading=action.value
return stateClone
}
}//? 抛出,可获取DataContext里的value值
export function useData(){
const { Xdata } = useContext(DataContext);
return Xdata;
};
// 主函数(可包裹根组件)
export function GlobalLoadingProvider(props) {
//todo useReducer 接受一个 reducer 函数作为参数,reducer 接受两个参数一个是 state 另一个是 action 。
//todo 然后返回一个状态 count 和 dispath,count 是返回状态中的值,而 dispatch 是一个可以发布事件来更新 state 的。
//? 修改dispath后更新dataArr!
const [dataArr, dispatch] = useReducer(reducer, creatData);
//? 普通js中访问
dispatchRef.current = dispatch;
return (
{props.children}
);
}
使用
index.js
主入口文件添加包裹标签
//index.js
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App.jsx";
// import reportWebVitals from './reportWebVitals';
import { GlobalLoadingProvider } from "./reducer/useDataX";
ReactDOM.render(
,
document.getElementById("root")
);
- 获取数据
import { useData } from "./reducer/useDataX";
function Test() {
const { loading } = useData();
return {loading};
}
export default Test;
- 组件内修改数据
import React, { useContext } from "react";
import { DataContext } from "./reducer/useDataX";
function Test() {
const { dispatch } = useContext(DataContext);
return ();
}
export default Test;
- 普通js修改数据
import { dispatchRef } from "../reducer/useDataX";
dispatchRef.current({type:'loading',value:true});
结束 【react|react hook redux useReducer useContext 实现redux 可在外部js访问】到这里就完成了,引用的时候要注意路径是否正确。现在主文件都是写在一起的,后面业务逻辑复杂后可以做一些封装。
推荐阅读
- react|react 安装
- React.js学习笔记(17)|React.js学习笔记(17) Mobx
- React.js的表单(六)
- 【React|【React Native填坑之旅】从源码角度看JavaModule注册及重载陷阱
- react-navigation|react-navigation 动态修改 tabBar 样式
- Flutter|Flutter SwiftUI React 对比
- React|React refs和onRefs的使用
- 有手就行7——*项目构建细节2-钩子(webhook)|有手就行7——*项目构建细节2-钩子(webhook) 配置
- 手写|手写 React-Native 方法调用式的 Modal 弹框、Toast 提示
- 大众点评(redux架构)