学习完redux 和react-redux的总结

redux是 独立的和react完全解耦的状态管理;

react-redux才是和react有耦合的特制状态管理库;


redex的操作步骤

1,安装 cnpn i redux --save ;

2, 创建 reducer 配置规则; 创建 action生成器; 把他们都输出下;

3,在index.js页面把render 函数封装 -》调用 ,利用reducer生成 store【store.createStore(counter)】;store利用 subscribe方法 绑定reder方法(一旦调用dispatch方法那么就触发渲染机制),在app组件内传入store 和action;

4,在app页面  引入store,插入到组件内 ,如果是state,那么利用store.getStore()获得到store,如果是action,那么 通过事件 触发 传入调用 store.disptch(action());

在此基础之上 ,如果 处理异步 那么需要引入插件 react-thunk;-------他是redux中间件

安装 cnpm i --save redux-thunk;

redux中中间件的使用需要使用借助redux的applyMiddleware 方法(在那行createStore那个位置引入);

扫描二维码关注公众号,回复: 1718387 查看本文章

import thunk from "redux-thunk";

然后 在创建store那行 插进去:

const store = createStore(counter,applyMiddleware(thunk));

这样就可以用执行异步操作了,和其他的action生成器一样;

action生成器 这边如果是异步 就不能再输出对象了  要输出一个函数 这个函数接受两个参数

export function ADDgunAsync(){

return  (dispatch,getState,)=>{

           // dispatch 可以执行一个分发任务;

             dispatch(Add())

           // getstate 这边调用可以得到state; 用作逻辑的处理判断;    

      }

}

这边 可以去安装一下工具包,方便在浏览器中查看redux;

先翻墙去下载一个吧 redux-tools;

下面就详细来操作一遍

这边 如果需要借助redux的整合方法 compose;

import {createStore,applyMiddleware,compose} from "redux";

然后 在下面生成store的地方改写

const store= createStore(counter,

                   compose(  applyMiddleware(thunk),

       window.devToolsEXtension?window.devToolsExtension():()=>{};  //win若有这个方法,那么执行一遍,没有那么就使用一个空对象

                      )


);

然后就刷新 就完事了

这个位置还是状态还是要一层一层传递下去的;这是个地狱 ;

那么就轮到 react-redux上场了;

这边 的render方法 和subscribe 方法 都不要了 他们都被封装在了 provider里面

react-redux 多出来了 2个组件  Provider  connect ;

import {Provider} from "react-redux";

这边进行改造把action生成器去掉 ; 不需要一层一层传了 ; 把App 放到Provider里; 现在store 也由 Provider组件去传递 ;

import {connect} from "react-redux";

connect 需要四个参数 ;然后紧接着再调用一次  ----》App=connect(mapStateToProps,actionCreator)(App);

第一个参数 是你期待的state的那个key的值 ,一个函数 并且返回一个对象;

第二个参数是 你要传入 函数生成器,在页面里调用的话都被dispatch过了 ,一个由action生成器组成的的对象 ;


connect 会以  props把这些全都输出出来;

现在 这样写还是不够少 ,那么装饰器了解下 ;

安装 插件  cnpm i --save-dev babel-plugin-transform-decorators-legacy

然后去 cli的package.json 里配置 babel : plugins :[“transform-decorators-legacy”];

这样就可以 使用装饰器来书写connect了;

直接在class的上面

@connect(state=>{return {num:state}},{...reducers})
一行搞定connect  哪有那么麻烦


  





















猜你喜欢

转载自blog.csdn.net/wangrong111222/article/details/80714226