美文网首页
Redux 和 React-redux

Redux 和 React-redux

作者: 月满轩尼诗大人 | 来源:发表于2016-12-07 19:55 被阅读0次

    题外话:
    这只是一篇入门的文章而已,如果这些您已经会了,请跳过此章节。

    自从学习了React之后,感觉在坑里出不来了,我觉得React真是一个巨坑,巨坑!如果想要使用React,单单使用React也可以,但是总感觉不对劲!发挥不出来React的真正作用!在开发的时候也体验不到那种流畅的感觉!所以我们得学习配套的一系列的东西,俗称 “React全家桶”

    React的语法,可以用jsx的语法,也可以用ES6的语法,这个就看个人喜好了。而且在使用React的时候,一定要注意版本号,不同版本下面的API也是有很大区别的,甚至在有些版本里已经废弃了很多API。当你遇见一个问题解决不了的时候,回头看看版本号,没准就豁然开朗了!让你用React遇见解决不了的状态问题的时候,你可能需要使用Redux了!还有,尽量去官网或者GitHub上面去寻找第一手的答案。不要怕英文,看的多了自然你就慢慢融入进去了,否则 只能永远吃别人翻译过的!

    Redux介绍:
    Redux是用来管理状态的,比如我们需要服务器的返回值,或者localStore的存储数据,也或者是各种标签切换的状态,当状态非常多的时候,我们不确定到底是哪个状态引起了应用的错误,这个时候我们使用Redux可以轻松的查看state的变化状态!让所有问题变得都可以预测。

    三大原则:
    1,单一数据源。也就是整个应用中只有一个store,这个store中存储state的信息

    2,state的状态是只读的,不能直接修改的,唯一修改state的方式就是通过action的方式

    3,使用纯函数来进行修改,纯函数就是输入相同,输出相同。

    Redux组成
    1,Action:action就是数据载体!也就是相当于一个数据包!action中必须存在一个type属性,这个type属性表明要执行的动作!同时这个action也是store的唯一数据来源!如果想要修改store中state的数据。

    例如:定义一个普通的action

    
    const  Action = {
    
             type:"ADD",
    
             todo:"Go Home"
    
    }
    
    

    可以通过:

    
    store.dispatch( Action )  这样就是相当于向store发送数据
    
    

    2,Reducer

    Action只是要发送给store的数据包,但是并没有进行数据处理!所以数据在发送到store的时候,需要被reducer进行处理。

    reducer是一个纯函数,接收两个参数 一个旧的state,一个action。返回一个新的state!!reducer中绝对不能进行以下三种操作

    reducer也是createStore中的参数

    
    let Store = createStore( reducer );
    
    

    1,修改传入的参数,也就是说reducer中这两个参数是固定的,旧的state,和action 。

    2,执行有副作用的操作,比如各种请求啊,跳转啊等等!

    3,不要执行非纯函数。(至于什么是非纯函数,我理解的就是返回值不确定的这种。比如Math.random() )
    在这里着重强调一下: reducer 函数中state参数! 我们都知道reducer接收一个旧的state,返回一个新的state, 那么这个旧的state是整个应用的state还是reuder对应的那一段state呢? 我之前在阅读文档的时候这段非常疑惑,如果每次接收的是整个应用的state,如果一个应用的state层级非常的深!那么这是非常消耗性能的! 但是等我又阅读文档的时候我发现 这个state其实只是reducer处理的对应的state。并不是全局state;但是返回的时候必须返回一个全新的state,也就是说,这其中我们是有一个合并操作! 把reducer处理的那部分state 同全局state进行了一个对比,把同全局state差异化的地方进行了合并!

    
    var globalState = {
    
    name:"Tom",
    
    age:20,
    
    add:"BJ"
    
    LikeGirl:[ '安吉娜朱丽叶' , '唐嫣' , ' 凤姐 ' ] ;
    
    }
    
    /****定义修改LikeGirl数据****/
    
    const LikeGirl = {
    
            type:"changeLikeGirl ",
    
            arr: '郭德纲' 
    
    }
    
    var initState = { LikeGirl :[] }
    
    function Reducer(state , action )
    
           switch ( action.type ){
    
                    case "changeLikeGirl" : 
    
                         return {
    
                                LikeGirl : [...globalState . LikeGirl  , action.arr ] 
    
                         }
    
           }
    
    

    在上面的代码中,定义了一个全局state , 然后发送一个LikeGirl的action ,在这个action中,携带了一个arr属性,这个值是我们准备合并到全局state中的值。 通过定义的type字段,来执行不同的动作,最后返回一个新的全局state,这个全局state中就包含了action中携带的值!

    3,store

    store就是一个大仓库,仓库中存储这一个state,state中包含各种各样的数据

    store定义了几种方法

    store.dispatch ()通过这个方法,向store中发送action

    store.getState() 通过这个方法可以获取store中state的信息

    store.subscribe( listener ) 给store设置监听事件,当store中的state发生改变的时候,就会触发回调函数。

    store.subscrbie( listener ) 这个返回值来取消监听事件!

    4,数据流

    Redux中执行严格的单向数据流动。

    Redux中应用数据的声明周期遵循下面4个步骤。

    1,调用store.dispatch( action )

    这个回调函数可以在任何地方进行调用,比如组件,XHR,定时器!

    2,Redux中调用传入的reducer函数。

    3,根reducer应该把多个子reducer输出合并到一个单一的state树

    4,Redux Store中保存了根reducer 返回的完整的state树!

    React-redux
    如果想要React 和 Redux 一起使用 ,需要使用react-redux这个绑定库。

    在这个绑定库当中,提供了2个重要的内容 一个是Provider,一个是connect()

    
    <Provider store = { store }>
    
           <MyApp  />
    
    </Provider>
    
    

    使用Provider来包裹我们的组件,这样默认在所有组件内部都可以使用store中的数据

    connect这个方法是重中之重!这个方法接收4个参数。

    connect ( mapStateToProps , mapDispatchToProps , merProp ,options)

    mapStateTopProps:这个函数接受一个参数state,返回一个对象。把state中返回对象的key当做props传递到组件中,这样在组件内部可以通过this.props[key]来获取到对应的值。

    这个方法也叫输入方法,通俗的说也就是将state映射到UI上的数据

    mapDispatchToProps:这个方法也叫做输出方法,将用户的操作转换成action对象,传递到store中!

    也就是将用户对UI的操作映射为action,用来建立UI组件的参数到store.dispatch方法的映射!

    相关文章

      网友评论

          本文标题:Redux 和 React-redux

          本文链接:https://www.haomeiwen.com/subject/urkjmttx.html