Redux笔记

学习目的

    了解和熟练使用 Redux,能够在实际项目中运用。

    学习方法:类比 VueX

    Redux 比较 学,要多按照 步骤 练习,要多码 最简单的 文中的示例。

Redux介绍

    Redux不是必须的

        如果你的UI层非常简单,没有很多互动,Redux 就是不必要的,用了反而增加复杂性。

        什么情况下需要使用 Redux

        ① 某个组件的状态,需要共享

        ② 某个状态需要在 任何地方 都可以拿到

        ③ 一个组件需要改变全局状态

        ④ 一个组件需要改变另一个组件的状态

        这点和 VueX 基本一致,毕竟都是状态管理工具。

Redux 安装

        npm install --save redux 

        在入口文件 index.js引入  import { createStore } from 'redux';

Redux 三大原则

        ① 单一数据源

            整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。

      ② State 是只读的

            唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。

      ③ 使用纯函数来执行修改

            为了描述 action 如何改变 state tree ,你需要编写 reducers

            Reducer 只是一些纯函数,它接收先前的 state 和 action,并返回新的 state;

Redux 工作流程

工作流程图

            用户发出 Action---------store.dispatch(action);

            Store 自动调用 Reducer,并且传入两个参数:当前 State 和 收到的 Action。 Reducer 会返回新的 State ---------------- function counter(state=0, action){ return Newstate }

            State 一旦有变化,Store 就会调用监听函数-------------store.subscribe(render);这时可以触发重新渲染 View。

Redux 基本概念

        ① Store

            Store 就是保存数据的地方,跟 VueX 定义的 store 一样,整个应用只能有一个 Store

          Store 将state, action 与 reducer 联系在一起的对象

            store包含了完整的 state  和 reducer

          定义 store

            const store = createStore( reducers ) 

        内部会第一次调用reducer函数,得到初始state,所以switch的default必须返回state!!

        核心方法:getState( )  :得到state

                        dispatch(action)  :分发action,触发reducer调用, 产生新的state

                        subscribe(listener):注册监听,当产生了新的state时, 自动调用

        ② Action

            action 作用于 store,标识要执行行为的对象

            包含2个方面的属性

            1) type : 标识属性, 值为字符串, 唯一, 必要属性

            2) xxx : 数据属性, 值类型任意, 可选属性

            例子:

            const action = {

                type: 'INCREMENT',

                data: 2

                }

                Action Creator( 创建Action的工厂函数 )

                    const increment = (number) => ({type: 'INCREMENT', data: number})

        ③ Reducer 

                Reducer 是相应的抽象,是纯方法,传入旧状态state 和 action ,返回新状态。

                注意

                1)返回一个新的状态

                2)不要修改原来的状态

        步骤:1定义规则,即 reducer    switch

                    2根据计算规则 生成 store      const store = createStore(fn) ;

                    3 定义数据(即state)变化之后派发规则 subscribe

                    4 触发数据变化 dispatch

        具体示例步骤

目录结构

              components 中写 app.jsx 组件

静态效果

                index.js

                Store 允许使用store.subscribe方法设置监听函数,一旦 State 发生变化,就自动执行这个函数

            ① redux / action-types.js

action-types.js

            ② redux / actions.js

                改变 State 的唯一办法,就是使用 Action。它会运送数据到 Store。

actions.js

            ③  redux / reducers.js

                    定义规则,即 reducer  /  switch

                    Store 收到 Action 以后,必须给出一个新的 State,这样 View 才会发生变化。这种 State 的计算过程就叫做 Reducer。

                    Reducer 是一个函数,它接受 Action 和当前 State 作为参数,返回一个新的 State。

reducers.js

            ④ components / app.jsx

app.jsx

                ⑤  redux / store.js

                        Redux 提供 createStore 这个函数,用来生成 Store。

                        createStore 函数接受另一个函数(counter)作为参数,返回新生成的 Store 对象。以后每当store.dispatch发送过来一个新的 Action,就会自动调用 Reducer,得到新的 State。

store.js

  React-Redux 的用法

        Redux 上述写法的问题

        1) redux与react组件的代码耦合度太高

                在react组件 app.jsx 中写 redux 代码, 耦合度 太高

        2)编码不够简洁

                例如,this.props.store.dispatch(actions.increment(number))

        React-Redux 是 一个react插件库,专门用来简化react应用中使用 redux,React-Redux 将所有组件分成两大类:  UI组件 和  容器组件

            UI组件

                1)只负责UI的呈现,不带有任何业务逻辑

                2)通过props接收数据(一般数据和函数)

                3)不使用任何Redux的 API

                4)一般保存在components文件夹下

            容器组件(containers)

              1)负责管理数据和业务逻辑,不负责UI的呈现

              2)使用Redux的 API

              3)一般保存在containers文件夹下

            核心API

            connect( )

                将 UI组件 包装成 容器组件

                import { connect } from 'react-redux'

                connect( mapStateToprops,    mapDispatchToProps )( Counter )

          mapStateToProps( )

                将外部的数据(即state对象)转换为UI组件的标签属性

                const mapStateToprops = function (state) {  return {    value: state  }  }

            mapDispatchToProps( )

                将分发action的函数转换为UI组件的标签属性

                简洁语法可以直接指定为actions对象或包含多个action方法的对象

            <Provider>组件

                让所有组件都可以得到state数据

              <Provider store={ store }>

                    <App />

              </Provider >

            安装 react-redux :npm install --save react-redux

            具体示例步骤

目录结构

              redux/action-types.js

                不变

                redux/actions.js

                不变

                redux/reducers.js

                不变

                components / counter.jsx      UI组件

components / counter.jsx

                完全没有 redux 代码 ,和普通的 ui 组件一样

                containters/ app.js

containters/ app.js

            index.js

index.js

    redux异步编程

                redux默认是不能进行异步处理的,但是实际中又需要在redux中执行异步任务(ajax, 定时器)。

        下载redux插件(异步中间件)

                npm install --save redux-thunk

            index.js

index.js

            redux / actions.js

actions.js

            components/counter.jsx

counter.jsx

                containers/app.js

app.js

          redux调试工具

            ① 安装chrome浏览器插件  redux-devtools.crx

            ② 下载工具依赖包  npm install --save-dev redux-devtools-extension

redux-devtools-extension

            打开浏览器,F12

出现这个界面就成功了
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容