• react-redux


    Redux

    一. 基本概念

    1.Stroe

             Store是保存数据的地方,可以看成是一个数据的容器,整个应用只能有一个Store。

       生成store:

              

     import { createStore } from ‘redux’
    
     const store = createStore(fn)

        其中fn是一个函数。

    2.State

        Store包含所有的数据,如果想得到某一类数据,就要对Store生成快照。

    State 可以通过store.getState()拿到

    import { createStore } from ‘redux’
    
    const store = create

    3.Action

        State的变化会导致视图的变化。但是用户只能看到呈现出来的视图,看不见state,所以用户的操作若要改变state,则必须向state发出一个通知,比如提交等,Action就是这个通知,表示State应该要发生变化了。

    Action是一个对象,其中type属性是必须的,表示Action的名称。

    const action = {
       type:'ADD_TODO',
       payload:'Learn Redux'
    };

    改变数据的唯一方法就是使用Action,它会将数据的改变送到Store中

    4.store.dispatch()

    store.dispatch()是view发出Action的唯一方法

    import { createStore } from 'redux';
    const store = createStore(fn)
    
    store.dispatch({
        type:'ADD_TODO',
        payload:'Learn Redux'
    });

    Action作为store.dispatch方法的参数

    5.Reducer

    Store收到了Action,必须给出一个新的State,这样用户的视图才会发生变化,这个就是State的计算过程。

    const reducer = function(state,action){
    
        // ......
      return new_state;
    }

    实际应用中,store.dispatch方法会触发Reducer的自动执行。为此,Store需要知道Reducer函数,在生成Store的时候将reducer传入,如下:

    import { createStore } from 'redux';
    const store = createStore(reducer);

    注意:reducer是一个纯函数。

    6.store.subscribe()

      Store允许使用store.subscribe方法设置监听函数,一旦State发生变化,就自动执行这个函数。

    import { createStore } from 'redux';
    const store = createStore(reducer);
    
    store.subscribe(listener);

    总结:

    (1)createState创建一个store,它是所有数据的一个容器

    (2)getState:得到一个state,它是某一个时间点或者某个对象的数据

    (3)Action:view发出的通知,它是对store的一个改变,送去改变后的数据

    (4)reducer:是对Action的一种计算,返回的是一个新的state

    (5)dispath:执行reducer这种计算(要先将reducer传入store中)

    (6)subscribe:对store状态的监听

    7.Reducer的拆分

       实际应用中state和action数量可能使十分多的,如果Reducer函数过于庞大,肯定不利于维护,

    所以可以将每个reducer分开来写,最后再把它们全部合起来。

    import { combineReducers } from 'redux'
    
    const chatReducer = combineReducers({
      chatLog,
      statusMessage,
      userName
    });
    
    export default todoApp;

    这里的chatLog,statusMessage,userName就是每个子reducer。

    8.工作流程

        

         (图片来自http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_usages.html)

    ------------------------------------------------------------------------------------------------------------

    回顾了Redux的一些基本概念,接下来介绍react-redux

    1.安装:

    npm install --save react-redux

    2.Provider

      react-Redux提供了<Provider/>,这能够让你的整个应用的范围内(provider包裹内)使用一个Store。

    import React from "react";
    import ReactDOM from "react-dom";
    
    import { Provider } from 'react-redux';
    import  { reducer } from '....';
    import { createStore } from 'redux';
    import App from '....';
    
    const store = createStore(reducer);
    
    
    ReactDOM.render(
       <Provider store={ store }>
       <App/>
        </Provider>,
        document.getElementById("root")
     
    );

    3.connect

    React-Redux 提供一个connect 函数来将你的组件和store连接起来

    import { connect } from "react-redux";
    import { increment, decrement, reset } from "./actionCreators";
    
    // const Counter = ...
    
    const mapStateToProps = (state /*, ownProps*/) => {
      return {
        counter: state.counter
      };
    };
    
    const mapDispatchToProps = { increment, decrement, reset };
    
    export default connect(
      mapStateToProps,
      mapDispatchToProps
    )(Counter);

    mapStateToProps:表示传入state中的state数据(方法的形式)

    mapDispatchToprops:表示传入state中的方法

    Counter:的位置时要将上面的数据和方法用到counter组件中去。这样在counter中就可以直接用this.props. 。。。使用传入的数据和方法。

    这里的connect可以使用装饰器装一波,更加直观:

    import React from "react"
    import { connect } from "react-redux"
    import register from "./register/register"
    
    @connect(
        state=>state.main,
        { register }
    )
    class App extends React.Component{
        render(){
        ......
       }
    }

    与上面一样这里connect中的两个参数就是mapStateToProps和mapDispatchToprops

     说明:用装饰器需要安装模块babel-plugin-transform-decorators-legacy,然后在babel中配置:

    {
        "plugins":[
            "transform-decorators-legacy"
        ]
    }
  • 相关阅读:
    @Autowired 注解是如何实现的?
    工作 3 年的同事不懂 isEmpty 和 isBlank 的区别,我真是醉了。。
    4 个单词,谷歌返回 16 个 SQL 注入漏洞...
    MySQL 更新不成功,事务问题搞清楚了吗?
    Python Web应用如何部署?
    mapbox加载postgis矢量切片
    tile2lon:地图瓦片编号与经纬度的换算关系
    shp2pgsql:将shapefile导入postgis数据库
    postgreSQL表添加ID自增列
    postgreSQL连接配置
  • 原文地址:https://www.cnblogs.com/Mrfanl/p/10015820.html
Copyright © 2020-2023  润新知