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

posted @ 2021-07-02 14:13  眼里有激光  阅读(92)  评论(0编辑  收藏  举报