React-redux-webpack项目总结之reduce、action、store、components 是如何开车的

下面这些东西是今年八月份实习过程中最让人头痛的一段历程。。特么就会那么点html、css、js还写不明白呢。咣咣来了一堆前端新技术。。。没办法这个行业遇到这种事情,硬着头皮也得上,印证了需要程序员需要快速学习的能力。就像一个网友说的 最爽的一件事,就是项目经理丢来一堆新东西,让你一周学完。。。不过那时候只是把数据流跑通了直接干活了。。具体细节不想看。。。因为不喜欢前端。当时就模仿人家的语法,把页面套路出来了。。。
下面是两个流程图来表示react在redux下的数据流动


这是当时鑫哥给开发小组的解释:
state就是数据,组件就是数据的呈现形式,action是动作,action是通过reducer来更新state的

我们可以做个形象的比喻,把 js 比喻成巴士,把 store,container,reducer 比喻为三个车站,再把 state 和 action 比喻成两种乘客。这是一趟环路巴士:
js巴士 从 store车站 出发,载上 state乘客 ,state乘客 到达某个 container车站 下车并把自己展示出来
过了一会,有一个 action乘客 上车了,js巴士 把 action乘客 送到 reducer车站,在这里 action乘客 和 state乘客 生了一个孩子 new state,js巴士把 new state 送回了 store车站(好像是人生轮回→_→)
然后在结合图看看好像确实那么回事,但是因为没有demo。只是理论上的认知,反正就是上车了!虽然大伙儿一脸懵逼。
用白话描述就是
一些网上学习资料:
http://reactjs.cn/react/docs/getting-started.html
http://www.runoob.com/nodejs/nodejs-tutorial.html
https://github.com/reactjs/react-router/blob/latest/docs/guides/Histories.md
http://react-guide.github.io/react-router-cn/docs/guides/basics/RouteMatching.html
http://www.cnblogs.com/lewis617/p/5145073.html
https://github.com/camsong/redux-in-chinese
http://cordova.apache.org/
http://adt.aicai.com/index.php/archives/179/
https://github.com/liangzhenghui/cordova-qdc-baidu-location
http://www.cnblogs.com/xianyulaodi/p/5314868.html
http://www.jb51.cc/article/p-ndouusrc-c.html

但是就是硬着头皮看了上面那些链接的教程, 没办法谁坚持不下来谁翻车。。
那么接下来我会解释一些上面名词的概念,以及在代码中他们究竟是怎么来相互玩耍的。不过下面我已经把业务代码剔除,行业原则嘛。

store

承接了react的state,store里面的数据是不可修改的,只能返回一个new state。
页面中所有的渲染操作所需数据来是从store拽下来的
store有四个方法
getState: 获取应用当前State。
subscribe:添加一个变化监听器。
dispatch:分发 action。修改State。
replaceReducer:替换 store 当前用来处理 state 的 reducer。
常用的是dispatch,这是修改State的唯一途径

Provider

Provider这个模块是作为整个App的容器,原有的App Container的基础上再包上一层,它的工作很简单,就是接受Redux的store作为props,并将其声明为context的属性之一,子组件可以在声明了contextTypes之后可以方便的通过this.context.store访问到store。不过我们的组件通常不需要这么做,将store放在context里,是为了给下面的connect用的。

// config app root
const history = createHistory()
const root = (
  <Provider store={store} key="provider">
    <Router history={history} routes={routes} />
  </Provider>
)

component

就是我们真正要渲染的组件,组件里面的数据是从store里面搞出来的,注意这个组件(一个文件)可以导入其他模块,比如这是个列表页列表页可以拆分成两部分:分类内容列表展示,那么这个模块就要导入import这两个组件,在render中渲染。组件中还会包含action的导入,因为要在组件中用store的dispatch方法,请求action去向服务器做请求。组件中也包含connect模块,这个模块是真正意义上的redux和react的连接了,component组件就是通过这个模块把数据从store上拽下来的,注意组件可以有constructor构造方法,里面做一些方法绑定和初始化参数认值,并且这些认值可以是不归redux的store所管理的,当时还巧妙地利用了这一特性。

"use strict";

import React from 'react';
import {connect} from 'react-redux'
//导入action模块
import { 
    request,request2,selectRestScrollTop
} from '../../../action/wandaochi/restListAction'
export default class ChiAnYi extends React.Component {
    constructor(props) {
     super(props);
        this.handleUpdateRestsList2 = this.handleUpdateRestsList2.bind(this);
        this.handleUpdateRestsList = this.handleUpdateRestsList.bind(this);
        this.unmountType = 0;
        this.activeColor = "#69D8C5";
        this.defaultColor = " #898989";
    }
    componentwillReceiveProps(nextProps) {

    }
    //一系列生命周期方法.......
    render() {
     return (
            <div>
             </div>

        );
    }
    function mapStatetoProps(state) {
    }
    export default connect(mapStatetoProps)(ChiAnYi);

connect

来仔细看一下这个connect
mapStatetoProps 需要负责的事情就是 返回需要传递给子组件的State,然后connect会拿到返回的数据写入到react组件中,然后组件中就可以通过props读取数据

function mapStatetoProps(state) {

    let { getRestSortList,getRestList,getRestScrollTop } = state.restReducer;
    return {
        restReducer:{
            category: {
                type:getRestSortList.type,
                data:getRestSortList.data,
                isFetching: getRestSortList.isFetching
            },restsList: {
                type:getRestList.type,
                data:getRestList.data,
                isFetching: getRestList.isFetching,}
        },scrollTop:getRestScrollTop.scrollTop,sortId : getRestScrollTop.sortId,areaId : getRestScrollTop.areaId
    }
}

//通过react-redux提供的connect方法将我们需要的state中的数据和actions中的方法绑定到props上
//第一个参数,必须是function,作用是绑定state的指定值到props上面。
//第二个参数,可以是function,也可以是对象,作用是绑定action创建函数到props上。
//返回值,是绑定后的组件
export default connect(mapStatetoProps)(ChiAnYi);

action

action也是action目录中的一个文件,只不过里面全都是action的内容 ,可以看到用到了Promise模式的异步请求。

export const RESTLIST_REQUEST_TYPE = 'RESTLIST_REQUEST_TYPE'
//获取列表
export function request2(area_id,sort_id,page,cusPerPage,dispatch) {
    const config = {
        params: {
            mt: 2,oper: 'findRestsList',page: page,sort:sort_id,area_id:area_id,cusPerPage: cusPerPage
        }
    }

    // 获取接口数据
    api.rest.get('/test/test-app',config)
        .then(response => response.data )
        .then(data => dispatch(complete(data)));
    return {
        type: RESTLIST_REQUEST_TYPE,isFetching: true,data:""
    }
}

/** * 获取数据完成 */
function complete(data) {
    return {
        type: REST_REST_TYPE,isFetching: false,data: data
    }
}

reducer

Redux提供了一个方法 combineReducers 专门来管理这些小Reducer。reduce中通过action中的type来判断是哪个action。在reduce中把action的数据assign到各自的state中

import { combineReducers } from 'redux';
import  {RESTLIST_REQUEST_TYPE} from '../../action/restListAction'
import  {FETCH_REST_REQUEST} from '../../action/wandaochi/restListAction'
import assign from 'lodash/assign';

// 返回饭店分类
function getRestSortList (
    state = {
        type:"",isFetching: false,data: {}
    },action
) {
    switch (action.type) {
        // 请求
        case FETCH_REST_REQUEST:
            return assign({},state,{
                type: action.type,isFetching: action.isFetching
            });
            break;
        // 请求成功
        case REST_REQUEST_TYPE:
            return assign({},isFetching: action.isFetching,data: action.data
            });
            break;
        default :
            return state;
    }
}
//。。。。其他reduce
const restSortListReducer = combineReducers({
    getRestSortList,getRestScrollTop
});

export default restSortListReducer;

下一篇说一说我们在react的组件生命周期内都做一些什么

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom