zoukankan      html  css  js  c++  java
  • react 学习(1) redux、react-redux

    前言

      1.redux是一个js库,她和react没有任何的依赖关系,你可以在vue、react甚至原生的js中使用redux

      2.react-redux,是一个连接redux和react的库,里面封装了一些api,使你在react中使用redux更加的方便,这块,我们后续在做展开

    redux

      核心概念

        state:数据仓库

        action:数据行动

        reducer:对数据的处理函数

      运行代码,先使用再学习

    import {createStore} from "redux"
    //定义state,定义初始数据结构
    const state={
        default1:"初始化数据"
    }
    
    //定义reduce,用来实现对state的更改。严格来讲,一个reduce只有一个reduce,针对不同的action.type执行的只是reduce中不同的逻辑而已。
    const reduce=(state:any,action:any)=>{
    
        //参数 state:就是下面在createStore(reduce,state)中的state,
        //参数 action: 就是store.dispatch()中的第一个参数
    
        //可以通过action来控制执行哪段逻辑
        if(action.type==1){
            state.default="type等于1时,修改state数据";
        }
        if(action.type==2){
            state.default="type等于2时,修改state数据";
        }
        return state;//修改state之后,必须返回
    }
    //定义action,用来描述对数据进行何种操作
    const action={
        type:"ACTION_1",
        payload:{
            props1:1
        }
    }
    //通过redux提供的createStore函数生成一个store
    const store=createStore(reduce,state);
    
    //分发一个action
        store.dispatch(action);//可以用我们预先定义的action变量
        store.dispatch({type:"ACTION2",payload:"001"});//也可以直接定义一个对象
    
    export default store;

      常用的api

        store:store是通过createStore创建的数据对象

          getState():获取最新的state

    store.getState();//return 最新的state

          dispatch(action):执行一个action

    store.dispatch({type:"ACTION2",payload:{prop1:"001"}});

          subscribe(listener):监听store,当store调用dispatch的时候触发

    //添加一个变化监听器。每当 dispatch action 的时候就会执行
    store.subscribe(listener)
        //事件处理函数
    function listener(){
        console.log("listener",store);
    }

          replaceReducer(function):调用dispatch并用指定的函数作为reduce

    //相当与store立即调用一次dispatch,并且使用自定义的reduce
    store.replaceReducer((state)=>{
        //参数 state是当前store的state对象
        state.default="replaceReducer value";
        return {...state}
    })

        createStore:redux提供的创建store对象的方法

    import { createStore } from "redux";
    
    //第三个参数 enhancer
    const enhancer = (fn) => {
      return fn;
    };
    //参数:接收三个参数
    //1. reduce
    //2. 默认的state对象 statedefaule
    //3. 是一个组合 store creator 的高阶函数,返回一个新的强化过的 store creator。这与 middleware 相似,它也允许你通过复合函数改变 store 接口。
    //(2).这个东西比较复杂,本文不作展开,文章末尾会有对enhancer参数详细解析的文章
    const store = createStore(reduce, stateDefaul, enhancer);

        combineReducers:reducer过于复杂的时候,可以通过combineReducers来进行拆分,每一个子reducer管理一部分state。

                 ps:你不一定要使用combineReducers,这只是redux为了防止新手使用一些错误的规则,而指定的一个分割方案,说实话,个人感觉它并不好用。如果你想的话,你完全可以使用自己的方式去管理庞大的state

    import { createStore, combineReducers } from "redux";
    //定义state,定义初始数据结构
    const stateDefault = {
      default1: "初始化数据",
    };
    //combineReducers() 接收的参数是一个以state的key名为key,以fuction为value一个对象
    const reducerObj = {
      //在这里使用的key(default1)与stateDefault中的key一致,那么val参数的值就为,stateDefault中的default1对应的值
      default1: function (val, action) {
        console.log("action", action, val);
        if (action.type == "action1") {
          return "改变后的数据"; //通过return 来改变state对应key的值,这里将state中的default1属性的值改变为"改变后的数据"
        }
        return val || ""; //每个函数必须要有一个返回值
      },
    };
    const rootReducer = combineReducers(reducerObj);
    
    const store = createStore(rootReducer, stateDefault);

        appltMiddleware:一个中间件函数,可以是store在每次dispatch的时候,执行定义的方法,方法中可以访问本次dispatch的action参数

    import { createStore, applyMiddleware } from "redux";
    //定义state,定义初始数据结构
    const stateDefault = {
      default1: "初始化数据",
    };
    const reducer = (state:any,action:any) => {
      return {...state};
    };
    //执行的函数
    function log(obj:any){
      return (next:any)=>(action:any)=>{
        let newAction=next(action)
        console.log('newVal',newAction,action);
        return newAction;
      }
    }
    //有两种方法使用applyMiddleware,两种方法效果一致
        //第一种
    const middStoreCreate = applyMiddleware(log)(createStore);//得到一个store的增加创建函数middStoreCreate
    let store = middStoreCreate(reducer, stateDefault);//使用middStoreCreate 创建store
        //第二种 
    let store=createStore(reducer,stateDefault,applyMiddleware(log));
    store.dispatch({type:"test"})
    store.dispatch({type:"test2"})
    export default store;

        compose:compose代码其实很简单,他只是把[fn1,fn2,f3]变成fn0(fn1(fn2()))而已,它会返回一个新的函数,新函数中从右到左依次调用函数,并把上一个函数调用的结果传递给下一个函数,作为第一个参数

    import { createStore, applyMiddleware,compose } from "redux";
    //定义state,定义初始数据结构
    const stateDefault = {
      default1: "初始化数据",
    };
    const reducer = (state:any,action:any) => {
      return {...state};
    };
    
    function log0(action:any){
      console.log("log0",action);
      return (next:any)=> (action:any)=>{
        return next(action);
      };
    }
    
    function log1(prop:any){
      console.log("log1",prop);
      return (next:any)=> (action:any)=>{
        // return next(action);
      };
    }
    
    let store=createStore(reducer,stateDefault,applyMiddleware(compose(log0,log1)));
    
    store.dispatch({type:"test"})
    export default store;

    react-redux

      react的作者为了方便在react使用redux,开发了一个react-redux库,在这一篇文章中会介绍在react中使用react-redux连接redux

  • 相关阅读:
    【原创】Silverlight之TextBox的LostFocus、GotFocus事件
    SQL Cursor 基本用法[用两次FETCH NEXT FROM INTO语句?]
    cannot convert from 'wchar_t *' to 'char *' 问题
    TEXTMETRICW 结构记录
    【D3D】Direct3D中LPRECT(上左右底)和LPoint(x,y)之前转换
    【原创】有关Silverlight中自动生成的类中 没有WCF层edmx模型新加入的对象 原因分析。
    【原创】有关Silverlight中异常“XmalParseEception” 通用解决思路
    hdu 1011(Starship Troopers,树形dp)
    hdu 2196(Computer 树形dp)
    树形dp(poj 1947 Rebuilding Roads )
  • 原文地址:https://www.cnblogs.com/wrhbk/p/14945609.html
Copyright © 2011-2022 走看看