Redux入门

参考阮一峰文章
阮一峰

运用到Redux的情况

  • 某个组件的状态,需要共享
  • 某个状态需要在任何地方都可以拿到
  • 一个组件需要改变全局状态
  • 一个组件需要改变另一个组件的状态

架构跟React有点相似,语法都是使用jsx语法,以下的例子需要结合webpack进行操作打包,才可以在网页中显示。

Store

就是保存数据的地方,你可以把它看成一个容器。整个应用只能有一个 Store
Redux提供createStore这个函数,用来生成Store

    import { createStore } from 'redux';
    const store = createStore(fn);

上面代码中,createStore函数接受另一个函数作为参数,返回新生成的 Store 对象。fn函数返回的值就作为store的数据存储起来。所以可以用这样的方式调用fn函数。

State

Store对象包含所有数据。StateStore某个时刻的值。
当前时刻的 State,可以通过store.getState()拿到。

    import { createStore } from 'redux';
    const store = createStore(fn);
    const state = store.getState();

在该例子中,state是只读的。最好把 State 对象设成只读。你没法改变它,要得到新的 State,唯一办法就是生成一个新对象。这样的好处是,任何时候,与某个View对应的 State总是一个不变的对象

Action

state 的变化,会导致 View的变化。但是,用户接触不到 State,只能接触到View。所以,State 的变化必须是 View 导致的。Action就是View发出的通知,表示 State应该要发生变化了。
Action是一个对象。其中的type属性是必须的,表示Action 的名称。其他属性可以自由设置

    var action = addTodo('add','okok');
    function addTodo (TYPE,TEXT) {
      return {
          type:TYPE,
          text:TEXT
    }
  }

可以通过函数的形式创建action,也可以直接创建

       var action = {
          type: 'add',
          text: 'okok'
  }

store.dispatch()

store.dispatch()View 发出 Action 的唯一方法,view的变化带动dispatch发出action,引发下一个行为。

    store.dispatch(action)

Reducer

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

       function reducer(){
                if (typeof(state) !== 'undefined')
                defaultState = state;
                  switch (action.type) {
                                    case 'add':
                                        return defaultState + action.text;
                                    default:
                                        return defaultState;
                                }
                        };

reducer必须是个函数,若不是个函数就会报错。

纯函数

Reducer 函数最重要的特征是,它是一个纯函数。也就是说,只要是同样的输入,必定得到同样的输出。

判断纯函数的几个特征
  • 给出相同输入,总是返回相同的输出。
  • 不产生副作用
  • 不依赖外部状态

store.subscribe()

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

    import { createStore } from 'redux';
    const store = createStore(reducer);
    store.subscribe(listener);

只要把 View的更新函数(对于 React 项目,就是组件的render方法或setState方法)放入listen,就会实现View的自动渲染。

store.subscribe方法返回一个函数,调用这个函数就可以解除监听。

    let unsubscribe = store.subscribe(() =>
        console.log(store.getState())
      );

    unsubscribe();

Reducer的拆分

redux中不同的函数负责处理不同属性,最终把它们合并成一个大的 Reducer。用combineReducers()方法合并起来,该函数根据 Statekey 去执行相应的子 Reducer,并将返回结果合并成一个大的State对象

工作流程

  1. view的变化,可以是点击事件
  2. 引发dispatch发出action
  3. Store自动调用Reducer,并且传入两个参数当前 State和收到的ActionReducer会返回新的 State
  4. 观察变化,用subscribe时刻监听变化

Redux一般是跟React一起合作构成ui数据的相互配合,当然,Redux还可以与其他架构配合,不一定需要与React合作。
示例:

      //app.jsx
    import ReactDOM from 'react-dom';
    import { createStore } from 'redux';
    import React from 'react';

      var action = addTodo('add','okok');
      function addTodo (TYPE,TEXT) {
                                  return {
                                            type:TYPE,
                                        text:TEXT
                                                    }
                                      }
        var defaultState = 0;
        const store = createStore(reducer);
            function reducer(){
                        if (typeof(state) !== 'undefined')
                        defaultState = state;
                        switch (action.type) {
                                      case 'add':
                                        return defaultState + action.text;
                                      default:
                                        return defaultState;
                                            }
                            };

        const state = store.getState();
        console.log(store);
        store.subscribe(reducer);

        //webpack.config.js
            var webpack = require('webpack');

            module.exports = {
                        entry: './app.jsx',
                        output: {
                                filename: 'bundle.js'
                                  },
                       module: {
                              loaders:[
                                      {
                                      test: /\.js[x]?$/,
                                      exclude: /node_modules/,
                                      loader: 'babel-loader?presets[]=es2015&presets[]=react'
                                  },
                              ]
                          }
                      };

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

推荐阅读更多精彩内容