Redux基本使用

news/2024/11/23 23:09:53/

目录

简介

redux 基本思路

redux 基本使用

单独使用 redux

配合 react-redux 使用

redux-devtools

使用修饰器


简介

本文介绍 redux 的使用方法。

主要包括以下几个部分

  • redux 基本思路
  • 单独使用 redux
  • 配合 react-redux 使用
  • redux-devtools
  • 使用修饰器

redux 基本思路

        ·redux 是用来管理公共状态,公共 state 都存放在 store 中。使用 createStore() 方法新建一个 store

        ·直接修改容易引起误操作,需要有条件的操作 store ,不能直接修改

        ·使用 store.getState() 来获取 state

        ·使用 store.dispatch(action) 修改 state

        ·使用 store.subscribe(listener) 实现监听,如果有改动,进行对应的响应操作

        ·action 是一个对象,基本格式 { type: TEST, payload: { name: 'ddd' } }

        ·action creator 是 action 生成函数,根据传入的参数生成对应的 action

redux 基本使用

  • redux 安装命令:npm i redux --save
  • 新建 reducer 文件
// action type
const COUNT_ADD = "数量增加"
const COUNT_MINUS = "数量减少"// initial state
const initState = {test: 'test'count: 10
}// reducer
export default function(state = initState, action) {switch(action.type) {case COUNT_ADD:return {...state,count: state.count + 1}case COUNT_MINUS:return {...state,count: state.count - 1}default:return state}
}// action creator
export function countAdd() {return { type: COUNT_ADD }
}
export function countMinus() {return { type: COUNT_MINUS }
}
  • 如果有多个 reducer ,可以使用 combineReducers 方法将多个 reducer 合并成一个
import { combineReducers } from 'redux'import app from './app'
import user from './user'export default combineReducers({ app, user })
  • 使用 createStore 生成 store
import { createStore } from 'redux'
import rootReducer from './reducers'
export default createStore(rootReducer)// 使用中间件
import { createStore, applyMiddleware } from 'redux'
import thunk from 'redux-thunk'
import rootReducer from './reducers'
export default createStore(rootReducer, applyMiddleware(thunk))

单独使用 redux

const init = store.getState()
console.log(init)function listener() {const { count } = store.getState()console.log(`目前计数为:${count}`)
}
store.subscribe(listener)// 派发事件
store.dispatch(countAdd())
store.dispatch(countAdd())
store.dispatch(countMinus())

配合 react-redux 使用

  • 在 react 项目中一般配合 react-redux 使用
  • react-redux 安装命令:npm i react-redux --save
  • react-redux 提供了 Provider ,该组件将 store 放到 context 中,方便子孙组件直接使用 store
  • react-redux 提供了 connect(mapStateToProps, mapDispatchToProps) 用来将对应的 state 和 dispatch 放到组件的 props 下
// ...
import { Provider } from 'react-redux'
import store from './store'ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
);
import React from 'react'
import { connect } from 'react-redux'
import { countAdd, countMinus } from '../../store/reducers/app'
import { WingBlank, WhiteSpace,Button } from 'antd-mobile'class Demo extends React.Component {render() {return (<WingBlank style={{marginTop: 50}}><p>目前计数:{this.props.count}</p><WhiteSpace /><Button type="warning" onClick={this.props.countAdd}>+1</Button><WhiteSpace /><Button type="primary" onClick={this.props.countMinus}>-1</Button></WingBlank>)}
}
export default connect(({ app }) => app,{ countAdd, countMinus }
)(Demo)

备注

  • connect 高级组件处理之后,在 props 中就有对应的 state 和 action 了
  • connect 的第一个参数是将 state 转为 props 的方法 mapStateToProps ,当然也可以直接传对象
  • connect 的第二个参数是将 dispatch 转为 props 的方法 mapDispatchToProps ,当然也可以直接传对象

redux-devtools

redux-devtools 是谷歌浏览器的插件,方便调试

需要在代码中打开

// 没有中间件时开启devToolsExtension
import { createStore } from 'redux'
import rootReducer from './reducers'
export default createStore(rootReducer, window.devToolsExtension ? window.devToolsExtension() : f=>f)// 使用中间件并开启devToolsExtension
import { createStore, applyMiddleware, compose } from 'redux'
import thunk from 'redux-thunk'
import rootReducer from './reducers'
export default createStore(rootReducer, compose(applyMiddleware(thunk),window.devToolsExtension ? window.devToolsExtension() : f=>f
))

使用修饰器

修饰器相关知识参考:装饰器模式(Decorator模式)理解、使用

create-react-app 项目为例:

  • 如果 babel 版本低于 7.x ,需要下载babel-plugin-transform-decorators-legacy 
npm i babel-plugin-transform-decorators-legacy --save
  • 修改 package.json 文件
{// ..."babel": {// ..."plugins": ["transform-decorators-legacy"// ...]},// ...
}
  • 如果是 babel 7.x 及以上版本,需要下载 @babel/plugin-proposal-decorators 
npm i @babel/plugin-proposal-decorators --save
  • 修改 package.json 文件
{// ..."babel": {// ..."plugins": [// ...["@babel/plugin-proposal-decorators", { "legacy": true }],]},// ...
}
  • 在组件中 connect 就可以使用修饰器格式了。其他的,比如 withRouter 都可以用修饰器格式
// ...
@connect(({ test }) => ({ count: test.count}),{ testCountAdd }
)
class Demo extends React.Component {// ...
}
export default Demo

http://www.ppmy.cn/news/278342.html

相关文章

集权攻防——身份认证协议之NTLM

在Kerberos出现之前&#xff0c;NTLM被广泛应用于工作组和域环境&#xff0c;是更早的用于对用户进行身份验证的协议。 相比于Kerberos&#xff0c;NTLM的认证原理比较简单&#xff0c;主要通过对比客户端和服务端加密后的数据&#xff0c;判断其是否一致&#xff0c;以确定用…

嵌入式软件工程师招聘

当您招聘嵌入式软件工程师时&#xff0c;以下是一些建议和关键要点&#xff0c;可以帮助您吸引和筛选合适的候选人&#xff1a; 职位描述&#xff1a;清晰地定义嵌入式软件工程师的职责和要求。包括对硬件和软件开发经验的要求、熟练掌握的编程语言&#xff08;如C、C、Python等…

Java + lua

luaj 主要特征 luaj 用法示例 luaj 实现原理 查找并调用指定的 Java 方法 从 Java 方法获取返回值 将 Lua function 作为参数传递给 Java 方法 在某些业务场景下&#xff0c;我们可能会遇到 lua 中要调用 java 代码情况&#xff0c;当然这个用 JNI 肯定是可以做到的&…

【笔试强训选择题】Day21.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言 一、…

搭建lanproxy客户端与服务端实现内网穿透

一、首先要配置java环境 1.可以使用这个&#xff0c;或者官网下载&#xff0c;或者其他版本皆可。https://download.csdn.net/download/qq_44821149/87878658 2.采用jdk-8u144-linux-x64.zip压缩包。java version 为1.8.0_144。 3.具体操作为&#xff1a; mkdir /usr/java u…

insightface 人脸检测与识别

参考&#xff1a;https://huaweicloud.csdn.net/638088d7dacf622b8df89c0c.html insightface模型下载可能需要连接外网&#xff0c;模型自动下载保存再models\buffalo_l下&#xff0c;人脸注册自动保存再face_db目录下 1、具体人脸录入 python face_label.py --picture 刘亦…

25款美轮美奂的壁纸改变你的心情

越是漂亮&#xff0c;精美的桌面壁纸&#xff0c;越能挑战我们的想象力和影响我们日常的心情。 在这些搜集里面&#xff0c;你会发现非常漂亮和高品质正好你也喜欢的壁纸。有这么多可供选择的出色桌面墙纸&#xff0c;您的桌面永远不会乏味和单调了。好好享受吧&#xff01; …

华为路由器:ospf协议三张表及邻居建立过程

说明&#xff1a;本篇接上一篇继续讲解 拓扑图 为了方便&#xff0c;我把R1/2/3/4/5的router id改成了回环网卡的IP。 ospf协议三张表 邻居表&#xff08;neighbortable&#xff09; OSPF用邻居机制来发现和维持路由的存在&#xff0c;邻居表存储了双向通信的邻居关系OSPF路…