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 ...
 
随机推荐
- [NOI2020] 制作菜品
			
看懂题目是生产第一要素. 考虑\(m = n - 1\)则必定有解.我们每次选择最小的和最大的拼在一起即可. 当\(m\)大于\(n\),那么我们只要每次选择最大的给他消掉即可. \(m = n - ...
 - Codeforces 559E - Gerald and Path(dp)
			
题面传送门 真·难度 *3000 的 D1E hb 跟我们说"做不出来不太应该". 首先我们将所有线段按 \(a_i\) 从小到大排序,一个很显然的想法是 \(dp_{i,j,d} ...
 - window修改dns本地文件
			
文件地址: C:\Windows\System32\drivers\etc 先修改权限: 最后用记事本打开编辑保存即可
 - STM32驱动直流电机的程序与电路设计(IR2110S自举电路+H桥+高级定时器和死区PWM)
			
https://blog.csdn.net/geek_monkey/article/details/82079435
 - vim 的使用
			
基本操作: 命令行模式 进入命令行 打开文本的时候,直接进去命令行模式 在其它模式按ESC,可以进入命令行模式 新建进入了命令行模式 光标进入末行"G"(shift+按键g,自学 ...
 - lua table与json的之间的互相转换高性能c++实现
			
请自行约束两种语言数据结构语法上的不同,避开如下问题: 1.json本身不约束key是否符合一个编程语言中的变量名,所以编写用于和编程语言数据结构交互的json代码时应该注意key是否正确. 2.lu ...
 - day02 MySQL基本操作
			
day02 MySQL基本操作 昨日内容回顾 数据库演变史 1.纯文件阶段 2.目录规范 3.单机游戏 4.联网游戏 # 数据库就是一款帮助我们管理数据的程序 软件开发架构及数据库本质 cs架构与bs ...
 - map和forEach的区别
			
总结 forEach()可以做到的东西,map()也同样可以.反过来也是如此. map()会分配内存空间存储新数组并返回,forEach()不会返回数据. forEach()允许callback更改原 ...
 - 内存管理——placement new
			
C++给我们三个申请内存的方式,new(new operator),array new 和placement new. placement new意思是 让对象构建在已经分配好的内存上. (这里我再把 ...
 - Postman 中 Pre-request Script 常用 js 脚本
			
1. 生成一个MD5或SHA1加密的字符串str_md5,str_sha1 string1 = "123456"; var str_md5= CryptoJS.MD5(string ...