redux

一、UI组件
React-Redux将所有组件分成两大类:UI组件和容器组件。
UI组件有以下几个特征:

  • 只负责UI的呈现,不带走任何业务逻辑。
  • 没有状态,即不使用(this.setate这个变量)
  • 所有数据都由(this.props)提供
  • 不适用任何Redux的API

    下面就是一个UI组件的例子
    const Title =
    value =>

    {value}


    因为不含有状态,UI组件又称为 “纯组件”
    二、容器的组件
    容器组件的特征恰恰相反

  • 负责管理数据和业务逻辑,不负责UI的呈现
  • 带有内部状态
  • 使用Redux的API

总之,记住一句话就可以了
UI组件负责UI的呈现,容器组件负责和管理数据逻辑。
你可能会问如果一个组件既有UI又有业务逻辑,怎么办?
回答是,将他拆分成下面的结构:外面是一个容器组件,里面是一个UI组件,前者负责与外部通信,将数组传给后者,由后者渲染出视图。
React-Redux规定,所有的UI组件都由用户提供,容器组件则是由React-Redux生成,也就是说用户负责视觉层,状态管理则是全部交给它。

三、Connect()
React-Redux提供connect方法,用于从UI组件生成容器组件,connect的意思是,就是把两种组件连接起来。

import { connect } from react-redux;
const todoApp = connect(()=>{
        return{
            state
        }
    }
)(Main)

上面代码中Main是UI组件,
todoApp是由React-Redux通过connect方法自动生成的容器组件。
但是因为没有定义业务逻辑,上面这个容器组件毫无意义,只是UI组件的一个单纯包装层,为了定义义务逻辑,需要给出下面两方面的信息。
(1)输入逻辑:外部的数据(即state对象)如何转化为UI组件的参数。
(2)输出逻辑:用户发出的动作如何变为action对象,从UI组件传出去。
因此,connect的完整API如下:

import { connect } from "react-redux";
const todoApp = connect(
    mapStateToProps,
    mapDispatchToprops
)(Main)

上面方法中connect接受两个参数,
mapStateToProps和mapDispatchToProps。
它们定义了UI组件的业务逻辑,前者负责输入逻辑,即将state映射到
UI组件的参数 (props) ,后者用于输出逻辑,即将用户对UI组件的操作映射成Action。
四、mapStateToProps()
mapStateToProps()是一个函数,它的作用就像它的名字一样,建立一个从(外部的)state 对象到(UI组件的)props对象的关系。
作为函数,mapStateToProps执行完之后返回一个对象,里面的每一个键值对就是一个映射,请看下面的例子

const mapStateToProps = (state)  => {
    return {
            todos: getVisibleTodos(state.todos,state.visibilityFilter)
    }
}

上面的代码中,mapStateToProps是一个函数,它接受state作为参数,
返回一个对象,这个对象有todos属性,代表UI组件的同名参数,后面的
getVisibleTodos也是一个函数,可以从state算出todos的值。

五、< Provider >组件
connect方法生成容器组件之后,需要让容器组件拿到state对象,才能生成UI组件的参数。一种解决方法就是将state对象作为参数,传入到容器组件,这样做比较麻烦。尤其是容器组件可能是在很深的层级,一级一级state传下去就很麻烦。

React-Redux提供Provider组件,可以让容器组件拿到state

import { Provider } from "react-redux";
import { createStore } from "redux";
import todoApp from "./reducers";
import Main from "./componnets/Main";

const store = createStore(todoAPP);

render(
    <Provider store={store}>
        <Main />
    </Provider>,
    document.getElementById("root")
)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值