网站首页 > 教程文章 正文
依赖版本:"react-redux": "^9.2.0","redux": "^5.0.1","redux-thunk": "^3.1.0"
文件:store/index.ts、 store/infoStatus/.、page1.tsx
store/index.ts
// import reducer from "./reducer";
// window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()????
// const store = legacy_createStore(
// reducers,
// window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
// );
import {
legacy_createStore,
combineReducers,
applyMiddleware,
compose,
} from "redux";
import { thunk } from "redux-thunk";
import infoStatus from "./infoStatus/reducer.ts";
//模块化 reducers 合并交给 store 管理
const reducers = combineReducers({ infoStatus });
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION__COMPOSE__
? window.__REDUX_DEVTOOLS_EXTENSION__COMPOSE__({})
: compose;
//创建仓库, composeEnhancers(applyMiddleware(thunk)) 实现异步功能
const store = legacy_createStore(
reducers,
composeEnhancers(applyMiddleware(thunk))
);
export default store;
store/infoStatus/. 每个reducers 独自维护
业务逻辑文件index.ts
文件reducers.ts
import infoStatus from "./index";
const reducer = (
state = { ...infoStatus.state },
action: { type: string; val: number }
) => {
const newState = JSON.parse(JSON.stringify(state));
//默认使用 switch...case
// switch (action.type) {
// case "add":
// newState.num++;
// break;
// case "reduce":
// newState.num--;
// break;
// }
//动态处理封装转化switch...case实现
//拿到 infoStatus.actionNames 收集 actions 内的方法名 遍历实现actions对应方法
for (const key in infoStatus.actionNames) {
//如果 dispath 传过来的 type 和 infoStatus.actionNames 里的方法一直,则调用 infoStatus.actions 的方法
if (action.type === infoStatus.actionNames[key]) {
//调用 infoStatus.actions 的方法
infoStatus.actions[infoStatus.actionNames[key]](newState, action);
break;
}
}
return newState;
};
export default reducer;
使用的文件 page1.tsx
import { useSelector, useDispatch } from "react-redux";
import infoStatus from "../../store/infoStatus";
function Page1() {
const { num } = useSelector((state: RooState) => ({
num: state.infoStatus.num,
}));
const dispatch = useDispatch();
const clockNumAdd = () => {
//同比直接使用 dispatch
dispatch({ type: "add", val: 100 }); //同步
};
const clockNumAdd2 = () => {
// dispatch({ type: "add" });
//异步,这里使用了 infoStatus.asyncActions 定义的方法
dispatch(infoStatus.asyncActions.asyncAdd as any);
};
return (
<div>
<p>Page {num} </p>
<button onClick={clockNumAdd}>添加</button>
<button onClick={clockNumAdd2}>异步添加</button>
</div>
);
}
export default Page1;
最后别忘了,入口文件 main.tsx引入 store
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import "reset-css";
import "@/assets/styles/global.scss";
// import Router from "./router";
import App from "./App.tsx";
import { Provider } from 'react-redux'
import store from './store'
createRoot(document.getElementById("root")!).render(
<Provider store={store}>
<StrictMode>
{/* 组件式 */}
{/* <Router /> */}
<BrowserRouter>
<App />
</BrowserRouter>
</StrictMode>
</Provider>
);
猜你喜欢
- 2025-06-18 让 React 代码行数减少78%的 htmlx 有这么神?
- 2025-06-18 如何做 React 性能优化?(react 项目优化)
- 2025-06-18 React 渲染流程可视化,有大佬实现了!
- 2025-06-18 与 Vue 相伴四年,终究还是没抵住 React 的巨大诱惑
- 2025-06-18 25、Tailwind:魔法速记术——React 19 样式新思路
- 2025-06-18 推荐!React 生态不容错过的6大顶级虚拟滚动库?
- 2025-06-18 React18 Hook中的useState和useEffect
- 2025-06-18 8.3K star!React Bits,让你拥有全网几乎所有动画效果
- 2025-06-18 前端开发React18 - useEffect(前端开发工程师是干什么的)
- 2025-06-18 再见Cursor!Trae Pro 登场(cursor中的热门插件)
- 最近发表
-
- 一课译词:一刀两断(一刀两断成语解释)
- 核心短语break up用法解析(breakd短语)
- HTML+CSS 实现商品图片列表放大视觉效果 复制完整代码即可马上调用
- 前端实现右键自定义菜单(前端实现右键自定义菜单怎么设置)
- Python中docx与docxcompose批量合并多个Word文档并添加分页符
- Java 将Excel转为XML(java将xls转换成xlsx)
- jq+ajax+bootstrap改了一个动态分页的表格
- css兼容性问题及一些常见问题汇总大全,赶快收藏!
- Java 的业务逻辑验证框架 之-fluent-validator
- 小程序cover-view踩坑系列2(微信小程序overflow)
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)