react redux 简单使用

安装必要的包

bash 复制代码
npm install redux react-redux
md 复制代码
│ └─ store

│ ├─ actions // actions,文件夹内以模块区分

│ │ ├─ count.js

│ │ └─ person.js

│ ├─ constants.js // action type唯一标识常量

│ ├─ index.js // 入口文件

│ └─ reducers // reducers,文件夹内以模块区分

│ ├─ conut.js

│ ├─ index.js // reducers统一暴露文件,合并reducers

│ └─ persons.js

创建Redux Store

在你的React应用中,你需要创建一个Redux store。这个store将持有整个应用的状态。

js 复制代码
// src/store/index.js

import { createStore, applyMiddleware } from "redux";

// 用于支持异步action

import thunk from "redux-thunk";

import reducers from "./reducers";

  


export default createStore(reducers, applyMiddleware(thunk));

创建Actions

定义action对象中type类型的常量值,消除魔法字符串

js 复制代码
// src/store/constants.js

export const INCREMENT = 'increment'

export const DECREMENT = 'decrement'

创建action,普通action返回对象,异步action返回函数

js 复制代码
// src/store/actions/count.js

import { INCREMENT, DECREMENT } from "../constants";

  


// 普通action的值为object `{type: INCREMENT, data }`

export const increment = data => ({ type: INCREMENT, data });

export const decrement = data => ({ type: DECREMENT, data });

  


// 异步action的值为函数

export const incrementAsync = (data, time) => {

return (dispatch) => {

setTimeout(() => {

dispatch(increment(data));

}, time);

};

};

创建Reducers

Reducer是一个纯函数,它接收当前的state和一个action,然后返回一个新的state。

js 复制代码
// src/store/reducers/conut.js

import {INCREMENT, DECREMENT} from '../constants'

// 初始化状态

const initState = 0;

  


export default function count(preState = initState, action) {

const { type, data } = action;

switch (type) {

case INCREMENT:

return preState + data;

case DECREMENT:

return preState - data;

default:

return preState;

}

}
js 复制代码
// src/store/reducers/persons.js

import { ADD_PERSON } from "../constants";

  


const initState = [{ id: "001", name: "jona", age: "23" }];

  


export default function persons(preState = initState, action) {

const { type, data } = action;

switch (type) {

case ADD_PERSON:

// return preState.unshift(data) // 此处不可以这样写,这样会导致preState被改写了,personReducer就不是纯函数了,redux识别不到状态改变,视图不会更新了

return [data, ...preState];

default:

return preState;

}

}
js 复制代码
// src/store/reducers/index.js

import { combineReducers } from "redux";

import count from "./conut";

import persons from "./persons";

  


export default combineReducers({

count,

persons,

});

提供Store给React应用

使用Provider组件将store提供给React应用。这通常在你的应用的顶层进行。

js 复制代码
// index.js 或 App.js

import React from 'react';

import ReactDOM from 'react-dom';

import { Provider } from 'react-redux'; // 引入Provider组件

import store from './store'; // 引入store配置文件

import App from './App'; // 引入你的主组件文件

  


ReactDOM.render(

<Provider store={store}> {/* 将store提供给应用 */}

<App /> {/* 应用组件 */}

</Provider>,

document.getElementById('root')

);

  

连接React组件和Redux Store

你可以使用connect函数来连接React组件和Redux store。这样,你可以在React组件中访问和修改状态。

js 复制代码
// Counter.js 组件文件,展示计数器并允许增加或减少计数器值。

import React from 'react';

import { connect } from 'react-redux'; // 引入connect函数用于连接组件和Redux store。

import { increment, decrement } from './actions'; // 引入action creators。

  


function Counter({ value, onIncrement, onDecrement }) { // 从props接收value, onIncrement, onDecrement。

return (

<div>

<h1>{value}</h1> {/* 显示当前计数器的值 */}

<button onClick={onIncrement}>+</button> {/* 点击增加计数器值 */}

<button onClick={onDecrement}>-</button> {/* 点击减少计数器值 */}

</div>

);

}

  


const mapStateToProps = state => ({ // 将state映射到props上。这里我们只需要counter的值。

value: state.counter.value, // 从store的state中获取counter的值。

});

const mapDispatchToProps = dispatch => ({ // 将dispatch方法映射到props上,以便我们可以调用它来分发action。

onIncrement: () => dispatch(increment()), // 当点击增加按钮时分发increment action。

onDecrement: () => dispatch(decrement()), // 当点击减少按钮时分发decrement action。

});

  


export default connect(mapStateToProps, mapDispatchToProps)(Counter); // 连接Counter组件和Redux store。
相关推荐
墨染天姬16 分钟前
【AI】cursor提示词小技巧
前端·数据库·人工智能
烛阴20 分钟前
TEngine 入门系列(一):TEngine 是什么 & 为什么选它
前端·unity3d
转转技术团队34 分钟前
WebNN:让 AI 推理在浏览器中“零距离”运行
前端
刀法如飞1 小时前
TypeScript 数组去重的 20 种实现方式,哪一种你还不知道?
前端·javascript·算法
IT_陈寒1 小时前
Vite热更新失效?你可能漏了这个小细节
前端·人工智能·后端
海石1 小时前
面试官:说一下你现在使用的 AI IDE,什么,JoyCode 是什么?
前端·ai编程
彩票管理中心秘书长2 小时前
一次搞懂:在Vue里用Showdown渲染Markdown+KaTeX数学公式
前端
m0_738120722 小时前
应急响应(重点)——记一次某公司流量应急溯源分析(附带下载链接)
服务器·前端·数据库·安全·web安全·网络安全
前端Hardy2 小时前
pnpm 11.0 正式登场:安装起飞、安全拉满、彻底告别 npm 依赖
前端
PILIPALAPENG2 小时前
第4周 Day 1:智能体记忆系统——给 Agent 一个"大脑"
前端·人工智能·python