笔记----深刻浅出《React和Redux》第三章Redux框架 (使用React-Redux库)

在直接使用React-Redux库以前,须要作一个铺垫html

 

3、容器组件(也叫Smart Component)和展现组件(也叫Dumb Component)react

一、用处:这个知识点主要创建在上一章基础上,在上一章中Redux和React进行配合,单个组件处理的任务太多,为了“让每一个组件专作一件事”,把组件按处理的任务类型进行拆分,分红容器组件和展现组件,如下是他们的分工redux

 

       展现组件:接受props,并渲染出来ide

       容器组件:和Store打交道,处理State函数

 

 

二、容器组件和展现组件是父子级组件关系,容器组件在外层,展现组件在内层this

 

           

     

      展现组件就是一个纯函数,根据容器组件传递过来的props进行渲染spa

 

 三、代码实践  (修改Counter.js文件)3d

 

  这次把以前的Counter组件,按功能分红两个组件,一个是Couter,做为展现组件,另外一个是CounterContainer,做为容器组件htm

   

   Counter对象

   

 

  CounterContainer

  

    

  

    在这里CounterContainer(外层的容器组件)负责和Store进行交互,并将从Store中获取到的状态,经过props传递给Counter(内层的展现组件),而后展现组件将拿到的props值进行渲染,而后在结果一层层的提交出来。在整体看来,和以前的效果同样,可是分工更加细致了

 

      另外,React 支持用函数来表示无状态组件,展现组件Couter也能够写成,结果同样生效

  

 

  最后结果: 

      

 

 

 

 

4、组件Context

 一、用处:提供全局的store,不用考虑store文件在哪一个位置,而避免react组件引入store带来的麻烦,

          实现方式就是把这个store塞进组件的context属性中,这样子每一个组件都能直接访问到store的状态值了

 

    

 二、在根组件中,将store放入context,以后其余全部子组件就能够经过this.context.store访问到context中store,从而避免了屡次引入store带来的麻烦

                        

 

三、代码实现

 

书中是按context旧版本使用方式,新版使用方式虽然略有不一样,可是总体思路仍是差很少

 

  在主入口文件中App.js

  

  说明:为了避免是ControlPanel组件工做变得复杂,在此另写一个根组件Provider,并将store引入,做为Provider组件的属性值

 

 

  Provider.js   

    

  关键的步骤来了,这一步是将store塞进context中,方便以后的子孙组件们轻松调用。

  

  注意注意!!!!!

  (i)这里使用到了须要借助一个函数getChildContext(),他会返回一个context对象,咱们须要把store放在这里面

  (ii)在这里还须要用childContextTypes指定context的结构类型,如不指定,会产生错误

 

 

 此时若是将指定类型注释了

 

  

     能够看出getChildContext和childContextTypes搭配使用

 

  

 

  ControlPanel.js

   

  这个保持不变

 

 

    Counter.js

  

  

  这个组件做为PropTypes子组件,能够从context拿去store,而不须要像以前同样,在当前组件中引入store文件以后才能够访问子组件

  

 

  注意注意!!!!!

  在须要调用store的组件中,首先在constructor和super中加入参数context,进行初始化

    而后使用contextTypes指定的store结构类型,记住,若是contextTypes没有被定义,context只是一个空对象

 

 为了在控制台看一下效果,咱们打印当前组件进行观察

 

 

 对比注释先后的变化

   

   

 

 

   

   

   最后能够经过this.context.store进行访问了

 

 

   总结:旧版本使用须要

       根组件:

                      getChildContext()放入须要共享的数据

                      childContextTypes指定context中数据的数据类型

                 子组件:

                      contextTypes指定须要接受的context中哪一部分的数据类型

 

 

5、react-redux

   以前三和四的“容器/展现组件”以及“访问store方式”,实现“react-redux”库中最主要的两个功能:

  (1)connect:链接容器组件和展现组件;

  (2)Provider:提供了包含store的context

 

  一、使用react-redux以后的代码

 

  Summary.js

  

  由于展现组件不涉及状态,在这里我以函数形式进行书写,能够对比下面的Summary展现组件以类的形式书写

 

  Counter.js

  

   

 

  App.js入口文件

      

 

   其余代码照旧

 

  (1)connect:

 

      connect(mapStateToProps,mapDispatchToProps)(Counter)

       

这个方法接受两个参数mapStateToProps和mapDispatchToProps,执行结果仍然是一个函数,因此以后继续加了一个小括号,其中小括号里放了展现组件,通过这两个执行后产生容器组件

      

mapStateToProps和mapDispatchToProps是两个函数,mapStateToProps负责将Store上状态转化为内层组件的props,mapDispatchToProps负责将动做进行派发

      

 

  (2)Provider

 

react-redux中封装了相似咱们以前写的Provider类,可是里面更加严谨,好比不只要求store是一个object,还要求store是一个包含subscribe,dispatch,getState函数的store

 

 

 

 

 

部分参考

https://reactjs.org/docs/legacy-context.html

相关文章
相关标签/搜索