前端模块化开发--React框架(四):高级应用(redux)
时间:2022-07-25
本文章向大家介绍前端模块化开发--React框架(四):高级应用(redux),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
安装
Code
npm install --save redux
一、 redux要点
1. redux理解
2. redux相关API
3. redux核心概念(3个)
4. redux工作流程
5. 使用redux及相关库编码
1. redux理解
什么?: redux是专门做状态管理的独立第3方库, 不是react插件
作用?: 对应用中状态进行集中式的管理(写/读)
开发: 与react-redux, redux-thunk等插件配合使用
二、redux相关API
redux中包含: createStore(), applyMiddleware(), combineReducers()
store对象: getState(), dispatch(), subscribe() react-redux: <Provider>, connect()()
1、 createStore()
- 1) 作用: 创建包含指定reducer的store对象
- 2) 编码:
javascript
import {createStore} from 'redux'
import counter from './reducers/counter'
const store = createStore(counter)
2、store对象
- 1)作用: redux库最核心的管理对象
- 2)它内部维护着:
state
`reducer` - 3)核心方法:
javascript
getState()
dispatch(action)
subscribe(listener)
- 4)编码:
javascript
store.getState()
store.dispatch({type:'INCREMENT', number})
store.subscribe(render)
3、applyMiddleware()
- 1)作用:
应用上基于redux的中间件(插件库)
- 2)编码:
javascript
import {createStore, applyMiddleware} from 'redux'
import thunk from 'redux-thunk' // redux异步中间件
const store = createStore(
counter,
applyMiddleware(thunk) // 应用上异步中间件
)
4、combineReducers()
- 1)作用:
合并多个reducer函数
- 2)编码:
javascript
export default combineReducers({
user,
chatUser,
chat
})
三、redux核心概念(3个)
action:
默认是对象(同步action), {type: 'xxx', data: value}, 需要通过对应的actionCreator产生,
它的值也可以是函数(异步action), 需要引入redux-thunk才可以
reducer
根据老的state和指定的action, 返回一个新的state
不能修改老的state
store
redux最核心的管理对象
内部管理着: state和reducer
提供方法: getState(), dispatch(action), subscribe(listener)
1、action:
- 1)标识要执行行为的对象
- 2)包含2个方面的属性
Code
a.type: 标识属性, 值为字符串, 唯一, 必要属性
b.xxx: 数据属性, 值类型任意, 可选属性
- 3)例子:
javascript
const action = {
type: 'INCREMENT',
data: 2
}
- 4)Action Creator(创建Action的工厂函数)javascript
const increment = (number) => ({type: 'INCREMENT', data: number})
2、reducer
- 1)根据老的state和action, 产生新的state的纯函数
- 2)样例
javascript
export default function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + action.data
case 'DECREMENT':
return state - action.data
default:
return state
}
}
- 3)注意
Code
a.返回一个新的状态
b.不要修改原来的状态
4、store
- 1)将state,action与reducer联系在一起的对象
- 2)如何得到此对象?
javascript
import {createStore} from 'redux'
import reducer from './reducers'
const store = createStore(reducer)
- 3)此对象的功能?
javascript
getState(): 得到state
dispatch(action): 分发action, 触发reducer调用, 产生新的state
subscribe(listener): 注册监听, 当产生了新的state时, 自动调用
四、redux工作流程
五、 使用redux及相关库编码
需要引入的库:
redux
react-redux
redux-thunk
redux-devtools-extension(这个只在开发时需要)
redux文件夹:
action-types.js
actions.js
reducers.js
store.js
组件分2类:
ui组件(components): 不使用redux相关PAI
容器组件(containers): 使用redux相关API
1、 react-redux
下载依赖包
Code
npm install --save react-redux
理解
- 1)一个react插件库
- 2)专门用来简化react应用中使用redux
React-Redux将所有组件分成两大类
- 1)UI组件
Code
a.只负责 UI 的呈现,不带有任何业务逻辑
b.通过props接收数据(一般数据和函数)
c.不使用任何 Redux 的 API
d.一般保存在components文件夹下
- 2)容器组件
Code
a.负责管理数据和业务逻辑,不负责UI的呈现
b.使用 Redux 的 API
c.一般保存在containers文件夹下
相关API
- 1)Provider 让所有组件都可以得到state数据
javascript
<Provider store={store}>
<App />
</Provider>
- 2)connect() 用于包装 UI 组件生成容器组件
javascript
import { connect } from 'react-redux'
connect(
mapStateToprops,
mapDispatchToProps
)(Counter)
- 3)mapStateToprops() 将外部的数据(即state对象)转换为UI组件的标签属性 javascript
const mapStateToprops = function (state) { return { value: state } }
- 4)mapDispatchToProps() 将分发action的函数转换为UI组件的标签属性 简洁语法可以直接指定为actions对象或包含多个action方法的对象
2、redux异步编程
下载redux插件(异步中间件)
shell
npm install --save redux-thunk
- Selenium2+python自动化66-装饰器之运行失败截图
- 51Nod 1091 线段的重叠(贪心+区间相关,板子题)
- 51Nod 1016 水仙花数 V2(组合数学,枚举打表法)
- Selenium2+python自动化67-用例失败自动截图
- Codeforces Round #404 (Div. 2)(A.水,暴力,B,排序,贪心)
- hihoCoder #1053 : 居民迁移(贪心,二分搜索,google在线技术笔试模拟)
- php开发文章发布示例(正则表达式实例开发)
- Codeforces Round #408 (Div. 2)(A.水,B,模拟)
- php实现文件上传
- Selenium2+python自动化69-PhantomJS使用
- Selenium2+python自动化70-unittest之跳过用例(skip)
- 用php做个简单的日历
- Selenium2+python自动化71-多个浏览器之间的切换
- 总结:JDK1.5-JDK1.8各个新特性
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter ListView 列表控件
- 第18天:NLP实战(二)——用DNN实现手势识别
- 「0821更新」Flutter入门系列教程汇总
- (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能
- 第19天:NLP实战(三)——用CNN实现微博谣言检测
- (Demo分享)利用原生JavaScript-ScrollLeft-实现做轮播广告通知
- Flutter问题:Column里面嵌套两个SingleChildScrollView无法滚动
- 搞不懂JS中赋值·浅拷贝·深拷贝的请看这里
- 第20天:NLP实战(四)——用GRU模型实现电影评论情感分析
- Flutter SingleChildScrollView 滚动控件
- Flutter Stack、Positioned 层叠布局
- Flutter Row、Column 线性布局
- 第21天:NLP实战(五)——词向量Skip-gram实践
- ES10(2019)有哪些更新和新特性?
- Flutter Icon IconFont(图标控件)