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猜字游戏(用函数)(最新版)

#codingutf-8#猜字游戏#导入随机数 import random#判断数的大小与答案的大小 def guess_judge(num):while (True):guess_judge_num get_input_num()if (guess_judge_num num):print("太棒了,答对了")breakelif (guess_judge_num > num):print("…

java文件名判断练习

public class HelloWorld { public static void main(String[] args) { // Java文件名 String fileName "HelloWorld.java"; // 邮箱 String email "laurenyangimooc.com"; // 判断.java文件名是否正确:合法的文件名应该以.java结尾 /* 参考…

node中间件KOA函数

const Koa require(koa);const app new Koa()//应用程序对象 中间件// 发送HTTP KOA 接手HTTP//中间件(其实就是 函数)function test(){console.log("seven month");}//当请求发送过来的时候,将函数(中间件)注册到程序上//前端发…

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, …

brython的问题

brython 挺不错,但有bug。 再brython中使用mpmath做精确计算。 发现: int((10365497382627524465995480721708502202835782160567615922664140839297673785867108053215069740783364534873417778099632142363871844991858866483475618976713337522230394…

xshell下载及连接Linux

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

PageHelper只对紧跟着的第一条SQL起作用

这个sql的中心思想就是根据查询到的schema然后分别查询schema中的相关数据再用union all将结果及拼接在一起。LocServiceImpl.findAllLoc(Loc loc) Overridepublic List<Loc> findAllLoc(Loc loc) {try {HashMap<String,Object> map new HashMap<String,Object…

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

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

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

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

xftp连接linux及xftp下载安装

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

洛谷 P2722 总分题解

题目描述 我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并…

xshell与xftp如何实现相互连接

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

洛谷 P2725 邮票题解

题目背景 给一组 N 枚邮票的面值集合&#xff08;如&#xff0c;{1 分&#xff0c;3 分}&#xff09;和一个上限 K —— 表示信封上能够贴 K 张邮票。计算从 1 到 M 的最大连续可贴出的邮资。 题目描述 例如&#xff0c;假设有 1 分和 3 分的邮票&#xff1b;你最多可以贴 5 张…

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

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

java 拷贝文件夹的实现

public class CopyFiles {public static void main(String[] args) throws Exception {String src "C:\\Users\\Administrator\\Desktop\\java\\workspace\\Day01\\sources\\a";//源路径String tar src1; //目标路径copyFolder(sr…

Linux简单实用小技巧

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

java ArrayList的实现

public class ArrayListDemo {public int size0;//当前数组容量public int capacity2;//默认容量public Object[] objects new Object[capacity];public ArrayListDemo() {}public void add(Object object) {//检查数组是否已经装满&#xff0c;如果数组装满&#xff0c;数组容…