reducer在react使用
编写store.js 小state
reducer 怎么来 纯函数
state+action 生成新的state
actions type
return{
}
state
action === setstate(()=>{})
reducer.js 生成新的state 计算
action.js 修改state (数据初始化,和操作方法)
_actionsType.js
页面引入
import {connent}from 'react-redux'
1.src 下面有一个大的store>store.js
import {createStore, combineReducers,applyMiddleware} from 'redux';
import thunk from 'redux-thunk';
import {reducer as twoReducer} from '../views/TwoRedux/_index.js';
import {reducer as downupReducer} from '../views/Xiala/_index';
import {reducer as wueRling} from '../views/expers/_index';
import {reducer as shuJu} from '../views/shixian/_index';
const reducer = combineReducers({
two:twoReducer,
downup:downupReducer,
wuer:wueRling,
shixia:shuJu,
})
export default createStore(reducer,applyMiddleware(thunk));

2.在Route.js注入
import React from "react";
import { BrowserRouter, HashRouter } from "react-router-dom";
import App from "./App.js";
import { Provider } from "react-redux";
import Store from "./store/store";
const Router = () => (
<BrowserRouter>
<Provider store={Store} >
<App />
</Provider>
</BrowserRouter>
);
export default Router;

3.在src>view>创建action.js ActionTye.js Reducer.js文件
Action.js
import * as ActionType from './ActionType'
import Unit from '../../../Un'
// 数据
export const getData = (text,data={},prevData)=>{
// console.log(prevData)
// data.data.push.apply(data.data,prevData);
// data.data = data.data.concat(prevData);
data.data = [...prevData,...data.data]
return{
type:ActionType.LISTDATA,
text:text,
pageData:data
}
}
// 方法
// 首次加载 或 刷新 时 都是第一页
// res.data 10 [] 10
// for X
// ...
// [...prevData,...res.data.data] 10 20
export const getFn = (text,ajax,dispatch,prevData)=>{
return{
type:ActionType.GETPDD,
text:text,
ajaxFn:Unit.getApi(ajax).then((res)=>{
// console.log(res.data)
dispatch(getData('发送请求',res.data,prevData))
})
}
}

ActionTye.js
export const LISTDATA="TODO_LISTDATA";
export const GETPDD="TODO_GETPDD";

Reducer.js
import * as ActionType from './ActionType.js';
export default (state={},action)=>{
switch (action.type) {
case ActionType.LISTDATA:
return {
action:{
type:action.type,
text:action.text
},
pddApi:action.pageData
}
default:
return state;
}
}

4.在src>view里面创建app.jsx 和_index.js
_index.js
import * as actions from './_store/Action';
import reducer from './_store/Reducer';
export {actions,reducer};

app.jsx
import React, { Component } from 'react';
import {connect} from 'react-redux';
import {actions} from './_index';
//import ReactPullLoad, { STATS } from "react-pullload";
//import './ReactPullLoad.scss'
class View extends Component {
constructor(props){
super(props);
this.state={
ajaxCfg:{
url:'/home/mediareports',
cfg:{
page_number:'1',
page_size:'10',
},
headers:{
}
},
hasMore: true,
action: STATS.init,
index: 6,
page:1
}
}
handleAction = action => {
// console.info(action, this.state.action, action === this.state.action);
//new action must do not equel to old action
if (action === this.state.action) {
return false;
}
if (action === STATS.refreshing) {
//刷新
this.handRefreshing();
} else if (action === STATS.loading) {
//加载更多
this.handLoadMore();
} else {
//DO NOT modify below code
this.setState({
action: action
});
}
}
handRefreshing = () => {
if (STATS.refreshing === this.state.action) {
return false;
}
setTimeout(() => {
//refreshing complete
this.setState({
hasMore: true,
action: STATS.refreshed,
index: 6
});
// console.log('刷新');
this.init();
}, 3000);
this.setState({
action: STATS.refreshing
});
}
handLoadMore = () => {
const { down } = this.props;
if (STATS.loading === this.state.action) {
return false;
}
//无更多内容则不执行后面逻辑
if (!this.state.hasMore) {
return;
}
setTimeout(() => {
if (this.state.index === 0) {
this.setState({
action: STATS.reset,
hasMore: false
});
} else {
this.setState({
action: STATS.reset,
index: this.state.index - 1
});
}
console.log('加载更多');
this.setState((state,props)=>{
page:state.page++
})
this.getPddFn(this.state.page,down.pddApi.data)
}, 3000);
this.setState({
action: STATS.loading
});
}
init(){
// 代码初始化
this.getPddFn(1,[])
}
getPddFn(page,prevData){
const { getPddFn } = this.props;
const { ajaxCfg } = this.state;
ajaxCfg.cfg.page_number = page;
getPddFn('首次启用',ajaxCfg,prevData)
}
componentDidMount(){
this.getPddFn(1,[])
}
lists(){
const { down } = this.props;
return down.pddApi.data.map((val,index)=>{
return(
<li key={val.id}>
{index}-----{val.main_title}
</li>
)
})
}
render(){
const { down } = this.props;
console.log(down)
const { hasMore } = this.state;
// console.log(down)
return(
<React.Fragment>
<ReactPullLoad
downEnough={150}
action={this.state.action}
handleAction={this.handleAction}
hasMore={hasMore}
distanceBottom={1000}
>
<div className="div1">111</div>
<div className="div1">111</div>
<div className="div1">111</div>
<div className="div1">111</div>
<div className="div1">111</div>
<div className="div1">111</div>
<div className="div1">111</div>
{
down.pddApi
?
<ul>{this.lists()}</ul>
:
''
}
</ReactPullLoad>
</React.Fragment>
)
}
}
const mapStateToProps = (state)=> {
return {
down:state.downup
}
}
const mapDispatchToProps = (dispatch, ownProps) => {
return {
getPddFn:(text,ajaxcfg,prevData)=>
dispatch(actions.getFn(
text,
ajaxcfg,
dispatch,
prevData
))
}
};
export default connect(mapStateToProps,mapDispatchToProps)(View);

reducer在react使用的更多相关文章
- React 和 Redux理解
学习React有一段时间了,但对于Redux却不是那么理解.网上看了一些文章,现在把对Redux的理解总结如下 从需求出发,看看使用React需要什么 1. React有props和state pro ...
- React内容
React Fiber 16版本 registerServiceWorker 的作用 PWA progressive web application 写手机app应用 在断网的情况下,第二 ...
- react 结合gitte 创建项目(详情步骤)
创建项目第一步 基本搭建 在创建之前,需要有一个git 仓库,我们要把项目搭建到git 中 目录介绍 cd 到某个盘 mkdir workspace 创建workspace文件夹 cd works ...
- react 创建项目 sass router redux
创建项目第一步 基本搭建 在创建之前,需要有一个git 仓库,我们要把项目搭建到git 中 目录介绍 cd 到某个盘 mkdir workspace 创建workspace文件夹 cd works ...
- [开源]React/Vue通用的状态管理框架,不好用你来打我👀
为了防止被打,有请"燕双鹰"镇楼️♀️️️...o... 话说新冠3年,"状态管理框架"豪杰并起.群雄逐鹿,ReduxToolkit.Mobx.Vuex. ...
- redux相关专业名词及函数提要
redux: 用来管理react app 状态(state)的一个架构. store: 通过createStore()创建,用来存放state,与react app是完全分离的.createStore ...
- react+redux状态管理实现排序 合并多个reducer文件
这个demo只有一个reducer 所以合并reducer这个demo用不到 ,但是我写出来这样大家以后可以用到,很好用,管理多个reducer,因为只要用到redux就不会只有一个reducer所以 ...
- [React] How to use a setState Updater Function with a Reducer Pattern
In this lesson we'll walk through setting up an updater function that can receive an action argument ...
- React学习(2)——action,reducer
action creator 是一个函数,格式如下: var actionCreator = function() { // 构建一个 action 并返回它 return { type: 'AN_A ...
随机推荐
- [R]在dplyr函数的基础上编写函数-(3)tidyeval
dplyr的优点很明显,数据框操作简洁,如filter(df, x == 1, y == 2, z == 3)等于df[df$x == 1 & df$y ==2 & df$z == 3 ...
- Linux内网时钟同步问题(ntp和chrony)
我们都知道时钟同步可以使用外网服务器,在内网内不能连接外网的时候也需要时钟同步,那怎么进行呢? 选择内网的一台稳定的服务器作为时钟源,然后让其他机器都来同步这台机器即可. 注:其实ntp服务和chro ...
- PHP-FPM运行状态的实时查看及监控详解
https://www.jb51.net/article/97640.htm https://blog.csdn.net/Dr_cokiy/article/details/105580758
- Excel-姓名列中同一个人汇总金额列,得出总金额
8.姓名列中同一个人求和金额列,得出总金额. 方法一: P2处公式=SUMPRODUCT(($M$2:$M$20=$M2)*($N$2:$N$20)) 解释函数: 引用:https://zhinan. ...
- 2.MaxSubArray-Leetcode
题目:最大连续子序列和 思路:动态规划 状态转移方程 f[j]=max{f[j-1]+s[j],s[j]}, 其中1<=j<=n target = max{f[j]}, 其中1<=j ...
- Excel-计算年龄、工龄 datedif()
函数名称:DATEDIF 主要功能:计算返回两个日期参数的差值. 使用格式:=DATEDIF(date1,date2,"y").=DATEDIF(date1,date2," ...
- 通过yum安装 memcache
. 通过yum安装 复制代码代码如下: yum -y install memcached#安装完成后执行:memcached -h#出现memcached帮助信息说明安装成功 2. 加入启动服务 复制 ...
- C#最大值
dtToSList = sqlAccess.ExecuteTable(CommandText); ToSNo = Convert.ToString(dtToSList.Rows[i].ItemArra ...
- 【STM32】晶振,主时钟,外设频率介绍
首先,我用的是STM32F407,下方所有图片都是出自这芯片的文档,如果型号和我不同,需要找到对应的芯片说明文档,也许会有出入 先看一张时钟图 这里会着重说明高速的部分,低速(不管内部还是外部)只给R ...
- Oracle中分割逗号函数REGEXP_SUBSTR
最近优化FORM中的查询条件遇到某个字段可以选取多个值的问题,思路当然就是选取时将多个值通过某个符号拼接起来,查询数据的时候将拼接后的字符串按照符号分割开,在分割逗号的时候用到了一个新的方法REGEX ...