1、回顾

cnpm i redux react-redux redux-thunk -S

store/index.js

src/index.js

src/views/home/index.jsx + UI.jsx

2、redux 分模块

2.1 分页面创建页面需要的状态,以首页为例

views/home/reducer.js

const reducer = (state = {
bannerlist: [],
prolist: []
}, action) => {
const { type, data } = action;
switch (type) {
case 'CHANGE_BANNER_LIST':
return { ...state, ...{ bannerlist: data } };
case 'CHANGE_PRO_LIST':
return { ...state, ...{ prolist: data } }
default:
return state
}
} export default reducer;

views/kind/reducer.js + views/cart/reducer.js

2.2 创建仓库 store/index.js

import { createStore, combineReducers } from 'redux'

import home from '@/views/home/reducer';
import kind from '@/views/kind/reducer';
import cart from '@/views/cart/reducer'; // combineReducers 合并reducer
const reducer = combineReducers({
home,
kind,
cart
}) const store = createStore(reducer); export default store;

2.3 入口文件处兼容仓库的变化

import store from './store';
function render () {
ReactDOM.render(
<Router>
<Switch>
<Route path="/" component = { App } />
</Switch>
</Router>,
document.getElementById('root')
)
} render() store.subscribe(render)

2.4 页面组件使用仓库

// 触发状态改变
store.dispatch({type: '', data: ''})
// 获取状态
store.getState() // {home: {}, kind: {}, cart: {}}

3、redux + react-redux + reducer分模块

3.1 页面组件分为容器组件和UI组件 index.jsx + UI.jsx + reducer.js

  • index.jsx
import { connect } from 'react-redux';
import UI from './UI'; export default connect()(UI)
  • UI.jsx 就是各个页面 -- 以首页为例
import React, { Component } from 'react';
export default class extends Component {
componentDidMount () {
}
render () {
return (
<div className="box">
<header className = "header">首页</header>
<div className = "content">
首页
</div>
</div>
)
}
}
  • reducer.js 首页的状态
const reducer = (state = {
bannerlist: [],
prolist: []
}, action) => {
const { type, data } = action;
switch (type) {
case 'CHANGE_BANNER_LIST':
return { ...state, ...{ bannerlist: data } };
case 'CHANGE_PRO_LIST':
return { ...state, ...{ prolist: data } }
default:
return state
}
} export default reducer;

3.2 store/index.js整合reducer

import { createStore, combineReducers } from 'redux'

import home from '@/views/home/reducer';
import kind from '@/views/kind/reducer';
import cart from '@/views/cart/reducer'; const reducer = combineReducers({
home,
kind,
cart
}) const store = createStore(reducer); export default store;

3.3 入口文件处处理 仓库

import store from './store';
import { Provider } from 'react-redux';
ReactDOM.render(
<Provider store={ store }>
<Router>
<Switch>
<Route path="/" component = { App } />
</Switch>
</Router>
</Provider>,
document.getElementById('root')
)

3.4 容器组件获取状态

import { connect } from 'react-redux';
import UI from './UI'; // const mapStateToProps = ({ home: { bannerlist, prolist } }) => ({ bannerlist, prolist }) const mapStateToProps = (state) => {
return {
bannerlist: state.home.bannerlist,
prolist: state.home.prolist
}
}
export default connect(mapStateToProps)(UI)

3.5 容器组件提供UI组件需要的业务逻辑

import { getBannerlist, getProlist } from '@/utils/api';
const mapDispatchToProps = (dispatch) => {
return {
getBannerlist () {
getBannerlist().then(data => { dispatch({ type: 'CHANGE_BANNER_LIST', data: data.data } ) })
},
getProlist () {
getProlist().then(data => { dispatch({ type: 'CHANGE_PRO_LIST', data: data.data } ) })
}
}
}
export default connect(mapStateToProps, mapDispatchToProps)(UI)

3.6 UI组件使用状态和触发业务逻辑

import React, { Component } from 'react';
export default class extends Component {
componentDidMount () {
this.props.getBannerlist();
this.props.getProlist();
}
render () {
let { bannerlist, prolist } = this.props
return (
<div className="box">
<header className = "header">首页</header>
<div className = "content">
首页
{
bannerlist.map((item) => (
<p key={ item.bannerid }> { item.img } </p>
))
}
{
prolist.map((item) => (
<p key={ item.proid }> { item.proname } </p>
))
}
</div>
</div>
)
}
}

4、redux + react-redux + reducer分模块 + 异步操作redux-thunk

目前异步操作在容器组件内部,需要把异步操作抽离出来 ---- actionCreator.js

以首页为例

i

4.1 仓库中引入异步操作的中间件 store/index.js

import { createStore, combineReducers, applyMiddleware } from 'redux'
import thunk from 'redux-thunk';//+++++ import home from '@/views/home/reducer';
import kind from '@/views/kind/reducer';
import cart from '@/vews/cart/reducer'; const reducer = combineReducers({
home,
kind,
cart
}) const store = createStore(reducer, applyMiddleware(thunk));//+++++ export default store;

4.2 views/home/actionCreator.js

import { getBannerlist, getProlist } from '@/utils/api';

export default {
getBannerlist (dispatch) {
getBannerlist().then(data => {
dispatch({
type: 'CHANGE_BANNER_LIST',
data: data.data
})
})
},
getProlist (dispatch) {
getProlist().then(data => {
dispatch({
type: 'CHANGE_PRO_LIST',
data: data.data
})
})
}
}

4.3 容器组件处触发actionCreator

react状态管理器(分模块)之redux和redux + react-redux + reducer和redux + react-redux + reducer分模块 + 异步操作redux-thunk的更多相关文章

  1. 对于React各种状态管理器的解读

    首先我们要先知道什么是状态管理器,这玩意是干啥的? 当我们在多个页面中使用到了相同的属性时就可以用到状态管理器,将这些状态存到外部的一个单独的文件中,不管在什么时候想使用都可以很方便的获取. reac ...

  2. 借鉴redux,实现一个react状态管理方案

    react状态管理方案有很多,其中最简单的最常用的是redux. redux实现 redux做状态管理,是利用reducer和action实现的state的更新. 如果想要用redux,需要几个步骤 ...

  3. react状态管理器之mobx

    react有几种状态管理器,今天先来整理一下mobx状态管理器,首先了解一下什么是mobx 1.mobx成员: observable action 可以干嘛: MobX 的理念是通过观察者模式对数据做 ...

  4. React状态管理相关

    关于React状态管理的一些想法 我最开始使用React的时候,那个时候版本还比较低(16版本以前),所以状态管理都是靠React自身API去进行管理,但当时最大的问题就是跨组件通信以及状态同步和状态 ...

  5. 纯粹极简的react状态管理组件unstated

    简介 unstated是一个极简的状态管理组件 看它的简介:State so simple, it goes without saying 对比 对比redux: 更加灵活(相对的缺点是缺少规则,需要 ...

  6. vue状态管理器(用户登录简单应用)

    技术点:通过vue状态管理器,对已经登录的用户显示不同的页面: 一  vue之状态管理器应用 主要用来存储cookie信息 与vue-cookies一起使用 安装:npm install vue-co ...

  7. VueX状态管理器 的应用

    VueX状态管理器 cnpm i vuex axios -S 1 创建Vuex 仓库 import Vue from 'vue' import Vuex from 'vuex' vue.use(Vue ...

  8. vue项目--vuex状态管理器

    本文取之官网和其他文章结合自己的理解用简单化的语言表达.用于自己的笔记记录,也希望能帮到其他小伙伴理解,学习更多的前端知识. Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态 ...

  9. vue - 状态管理器 Vuex

    状态管理 vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性.

  10. React状态管理之redux

    其实和vue对应的vuex都是差不多的东西,这里稍微提一下(安装Redux略过): import { createStore, combineReducers, applyMiddleware } f ...

随机推荐

  1. 音标s ed

    1 p /s/ cups  2 t /s/ hats puts3 k /s/ cakes books desks works worked /t/4 f /s/ roofssiz ziz s加其他清辅 ...

  2. 当你的数据集是hdf5格式的文件时,肿么办?

    最近,自己构建了一个卷积神经网络,从网上下载到的数据集是hdf5格式的,希望用这个数据集来训练一下自己构建的这个神经网络. 1. 什么是hdf5? HDF5是二进制数据格式,用于在磁盘上存储巨大的数值 ...

  3. C#中的范围类型(Range Type)

    //语法糖Rangestatic void Main(string[] args) { var myArray = new string[] { "Item1", "It ...

  4. JAVA基础Day3-用户交互Scanner/顺序结构/选择结构/循环结构

    一.用户交互Scanner JAVA提供了一个工具类,可以用来获取用户的输入. java.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入. 基本语法: Scan ...

  5. OO课程第三阶段(实验和pta试题)总结Blog3

    OO课程第三阶段(实验和pta试题)总结Blog3 前言:学习OOP课程的第三阶段已经结束了,在此进行对于知识点,题量,难度的个人看法. 学习OOP课程的第三阶段已经结束了,较第一次阶段学习难度加大, ...

  6. BGP反射器

    路由反射器是一种减少自治系统内IBGP对等体连接数量的方法. 根据BGP路由通告原则,要求一个AS内的所有BGP Speaker将建立全连接关系(BGP Speaker两两建立邻接关系).当AS内的B ...

  7. Monterey 12.3 I225-V有线网卡导致死机或无法使用问题

    问题:升级Monterey12.3后启动到桌面死机 解决方法: 1.关闭/去掉所有有线网卡驱动.补丁.网卡设备ID注入: 2.启动命令中加入:dk.e1000=0: 3.启动不死机后,进入网络设置,手 ...

  8. api进阶Day3使用文件流对文件进行复制、使用块读写一组字节,使用byte数组提高读写的效率、返回当前时间。

    使用文件流对文件进行复制: package io; import java.io.FileInputStream; import java.io.FileNotFoundException; impo ...

  9. matlab解析毫米波雷达bin文件数据 得到复数

    来源:TI提供的Mmwave Radar Device ADC Raw Data Capture %%% This script is used to read the binary file pro ...

  10. idea导入数据库

    yml文件(在启动项文件(main)里,eg:springbook文件里面) sh-bean里org.example.sh.beans的Category类   CategoryDAO名字要和Categ ...