Redux概览

简介

  • Redux 是一个有用的架构
  • Redux 的适用场景:多交互、多数据源

工作流程图

流程图

action

用户请求

//发出一个action
import { createStore } from 'redux';
const store = createStore(fn);//其中的type属性是必须的,表示 Action 的名称。其他属性可以自由设置
const action = {type: 'ADD_TODO',data: 'Learn Redux'
};store.dispatch(action);

Reducer

状态机
Reducer 是一个函数,它接受 Action 和当前 State 作为参数,返回一个新的 State。
Reducer 是纯函数,就可以保证同样的State,必定得到同样的 View。但也正因为这一点,Reducer 函数里面不能改变 State,必须返回一个全新的对象

const defaultState = 0;
const reducer = (state = defaultState, action) => {switch (action.type) {case 'ADD':return {...state,data: action.data}default: return state;}
};
Recucer的拆分
//index
import {combineReducers} from 'redux';
import proIndex from './proIndex';
import product from './product'
export default combineReducers({proIndex,product,
});//product
import actions from '../action/index'
import {getDocMenu} from "../action/user/product";const {GET_PRODUCT_DOCUMENT_SUCCESS
} = actions;export default (state = {},action) =>{switch (action.type) {case GET_PRODUCT_DOCUMENT_SUCCESS:return{...state,getDocMenu: action.data,}default:return state;}
}//proIndex
import actions from '../action/index';const {GET_SERVICE_CLASSIFICATION_SUCCESS,GET_SERVICE_SUBJECT_SUCCESS,
} = actions;export default (state = {},action) => {switch (action.type) {case GET_SERVICE_CLASSIFICATION_SUCCESS:return {...state,getServiceClass: action.data,};case GET_SERVICE_SUBJECT_SUCCESS:return {...state,getServiceSubject: action.data,};default:return state;}
};

store

数据仓库

import { createStore } from 'redux'
import todoApp from './reducers'
//创建store仓库
const store = createStore(todoApp)
//createStore方法还可以接受第二个参数(),表示 State 的最初状态。这通常是服务器给出的(window.STATE_FROM_SERVER就是整个应用的状态初始值)
const store = createStore(todoApp, window.STATE_FROM_SERVER)//引入action
import {addTodo,toggleTodo,setVisibilityFilter,VisibilityFilters
} from './actions'//打印当前状态
console.log(store.getState())// 订阅state变化
// subscribe()方法返回一个函数用于取消监听
const unsubscribe = store.subscribe(() => console.log(store.getState()))// 发出一些action
store.dispatch(addTodo('Learn about actions'))
store.dispatch(addTodo('Learn about reducers'))
store.dispatch(addTodo('Learn about store'))
store.dispatch(toggleTodo(0))
store.dispatch(toggleTodo(1))
store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED))//取消监听状态更新
unsubscribe()

配置中间件

import { createStore } from 'redux'
import reducer from '../reducer/index'
import thunk from 'redux-thunk'
import promise from 'redux-promise'
import logger from 'redux-logger'const store = createStore(reducer,applyMiddleware(thunk, promise, logger)
);

redux-thunk

store.dispatch()只能传入一个action对象,redux-thunk中间件则将其扩展为一个方法

//配置
import { createStore } from 'redux'
import reducer from '../reducer/index'
import thunk from 'redux-thunk'const store = createStore(reducer,applyMiddleware(thunk)
);//使用
export function getDocMenu(query='') {return async(dispatch) => {try {const data = (await axios(`${baseUrl}doc.do?${Qs.stringify(query)}`)).data;//这里的dispatch相当于store.dispatchdispatch({type: GET_PRODUCT_DOCUMENT_SUCCESS,data: data})}catch(error){dispatch({type: GET_PRODUCT_DOCUMENT_FAILURE,error: new Error('获取文档菜单失败')})}}
}

redux-saga

解决异步的另一种方法

//配置
import { createStore, applyMiddleware } from 'redux'
import createSagaMiddleware from 'redux-saga'import reducer from './reducers'
import mySaga from './sagas'// create the saga middleware
const sagaMiddleware = createSagaMiddleware()
// mount it on the Store
const store = createStore(reducer,applyMiddleware(sagaMiddleware)
)// then run the saga
sagaMiddleware.run(mySaga)//使用
// action creators
export function GET_USERS(users) {return { type: RECEIVE_USERS, data }
}export function GET_ERROR(error) {return { type: FETCH_USERS_ERROR, data }
}export function Begin_GET_POSTS() {return { type: BEGIN_GET_POSTS }
}//saga.js
import { takeEvery } from 'redux-saga';
import { call, put } from 'redux-saga/effects';
import axios from 'axios';
import { BEGIN_GET_POSTS, GET_POSTS, GET_POSTS_ERROR } from '../reducers';// worker saga
function* showPostsAsync(action) {try {const response = yield call(axios.get, 'https://jsonplaceholder.typicode.com/posts');yield put({type: GET_POSTS,data: response.data});} catch(e) {yield put({type: GET_ERROR,error: new Error('some error')});}
}// wacther saga
function* watchGetPosts() {yield takeEvery(BEGIN_GET_POSTS, showPostsAsync);
}// root saga
export default function* rootSaga() {yield watchGetPosts()
} //user.jscomponentWillMount() {this.props.dispatch(Begin_GET_POSTS());
}

转载于:https://www.cnblogs.com/Lazy-Cat/p/11406304.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解python中的yield(生成器)

yield1.yield与return的异同点2.yield使用的好处3.具体实例理解生成器的用法实例一实例二实例三1.yield与return的异同点 相同:都可以返回函数执行的结果 不同点: return是用来返回具体的某个值。 yield一般与循环一起用,被称之生成器&…

洛谷 P1219 八皇后题解

题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相…

python不定长参数详解

不定长参数1.不定长参数两种基本形式:2.实例2.1实例一2.2实例二2.3实例三2.4实例四2.5实例五https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处&#xff0…

TypeError: missing 1 required keyword-only argument-python中的报错问题

如下图所示,报错为TypeError: JayChou() missing 1 required keyword-only argument: ‘c’ 翻译过来是:TypeError:JayChou()缺少1个仅限关键字的参数:“c” 报错代码: #codingutf-8def JayChou(a, *b, …

xshell下载及连接Linux

xshell的下载及连接Linux一、下载二、连接Linux一、下载 网址:https://www.netsarang.com/zh/xshell/ 1进入主页后下滑点击下载 2.不要去安装盗版,会出现一些问题。选择家庭版即可,点击免费授权页面 3.填上你的姓名和邮件,再勾…

xshell更改背景颜色,解决乱码问题及更改字体及字体大小

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 这三个键分别是更改背景颜色,解决乱码问题&…

PL/SQL Developer的错误提示弹框的文本显示乱码问题

问题:Windows中文环境下,PL/SQL Developer的错误提示弹框文本为乱码,如下: 解决过程:1.使用SELECT * FROM v$nls_parameters;查询得知服务器的字符集编码为:  NLS_LANGUAGESIMPLIFIED CHINESE  NLS_CHA…

xftp连接linux及xftp下载安装

xftp一、下载二、安装三、Xftp连接linux一、下载 网址:https://www.netsarang.com/zh/xftp/ 1.打开这个网址后,点击下图的下载 2.不要去下载盗版,我们可以下载官网的免费版,点击家庭版的免费授权页面 3.接下来再填写你的姓名和…

xshell与xftp如何实现相互连接

xshell与xftp互联工具操作步骤1.xftp连接xshell2.xshell连接xftphttps://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载&#xff0…

xftp如何显示隐藏的文件详解

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) xftp可以帮助在Windows和Linux系统之间传输文件&#xff0…

Linux简单实用小技巧

常用小技巧1.键盘上下键2.Tab键的使用3.ctrlc4.ctrle5.ctrla6.clearhttps://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究&…

Linux用户、权限及改变文件所有者及文件所属组多例详解 附python代码

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) Linux用户、权限及改变文件所有者及文件所属组多例详解一、…

linux管道举例理解

linux管道举例理解一、管道的定义:“|”二、查找2.1统计当前目录下有多少个文件2.2查看当前目录下的前n(3)个文件2.3查看wang.txt文件包含i的字符行2.4查看内存使用情况2.5查询进程三、更改https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎…

Sublime Text 3安装GoSublime

GoLand IDE工具虽然在编程时很好用,但是在使用中也有个问题,有时我们可能只是写一个简单的脚本来测试,对于我而言在打开IDE太重量级了,所以捣鼓了GoSublime工具来满足平时最基本的需求。 下载GoSublime源码 官方地址:h…

计算机二进制、八进制、十进制、十六进制的转换(计算机基础进制的转换)

常用进制转换1.进制特点2.十进制与二进制的转换2.1对应关系2.2举例一:二进制1011转换十进制2.3举例二:二进制10111转换十进制2.3举例三:十进制45转换成二进制2.4举例四:十进制小数0.25转换成二进制3.八进制与二进制3.1对应关系3.2…

Pycharm如何导入python文件,及出现报错解决办法

导入及解决报错导入py文件解决报错问题https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请注明出处(…

快速排序算法理解-python

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录快速排序定义举例代码快速排序定义 定义一个基准值&a…

AutoCAD2013 以上利用AccoreConsole+ c# NetApi Windows Froms 封装

1# 封装类 1 public static class CmdHelper2 {3 /// <summary>4 /// 调用AutoCAD 安装目录下的AccoreConsole.exe来实现批量处理图纸(Net Api dll)5 /// </summary>6 /// <param name"cmsStr">NetApi中注册…

SQL Server 输出 XML

一、概述 SELECT 查询将结果作为行集返回。在 SQL 查询中指定 FOR XML 子句&#xff0c;从而将该查询的正式结果作为 XML 来检索。FOR XML 子句可以用在顶级查询和子查询中。顶级 FOR XML 子句只能用在 SELECT 语句中。而在子查询中&#xff0c;FOR XML 可以用在 INSERT、UPDAT…

linux重定向输出命令

目录一、符号二、“>”举例2.1举例一2.2举例二三、“>>”举例3.1举例一3.2举例二https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行&#x…