redux

redux

  1. 下载redux工具
    cnpm i redux -S

  2. 创建store

const store = createStore(reducer)

  1. 创建reducer纯函数

  2. 为store挂载默认状态

为reducer的state参数设置默认值,再返回出新的state,这样的话,store就有state了

  1. 组件使用store的state

组件通过调用store.getState()来获得store中的state

  1. 创建actionCreator

actionCreator里的方法,作用是执行一些自定逻辑之后,创建一个带有标识性信息的action,交由reducer处理


let action = {
type: _TODO,//_TOOD 是一个常量
todos
}
store.dispatch(action)

  1. 在reducer中,根据action上的标识信息做出判断之后,返回一个新状态,这个时候store里的状态已经更改了

import _state from './state'
import {
_TODO, //定义的常量
} from './const'
const reducer = ( state = _state, action) => {
let new_state = Object.assign({}, state)//此方法为原生方法,作用看最后面注释

switch ( action.type ) {
  case _TODO:;break;

  default:break;
}

//reducer一定要返回状态
return new_state

}

export default reducer

  1. 让组件去获取最新的状态

在组件的初始化阶段的生命周期钩子函数componentWillMount () {}中给store.subscribe传入回调函数,当状态更改的时候这个回调函数就会触发,在这个回调里就可以让组件获取最新的状态之后进行setState,当然,如果发现所用的状态没有更改可以做出判断来决定是否进行setState

componentWillMount () {
//当store里的zhuangt改变的时候,store.subscribe方法里传入的函数就会执行
store.subscribe(() => {
this.setState({todos: store.getState().todos})
})
}

reducer划分

当我们协同开发的时候,或者项目独立功能模块较多的时候,把状态放在一个reducer中处理的话会导致更新维护比较麻烦

在这里我们研究将store进行模块化的管理

actionCreator、state本身与store耦合度很低,最主要的是把reducer拆分开

我们可以利用combindReducers函数,将分离开的renducer整合成一个,这样的话,需要注意的是在使用的时候,state也会根据划分的reducer有一个不同的分布

react-redux

这是一个好东西!

对比redux与vue中的vuex,vuex要比redux用起来简单、方便!

因为vuex是vue的一个工具、插件,与vue的耦合度高,所以里面很多东西作者已经给我们封装好了

但是redux不只是react可以用,很多地方都能去用,所以在react中使用redux的时候,很多东西都需要我们自己写~

麻烦的地方:

  1. 组件获取状态较为麻烦
  2. 状态更新之后,组件需要手动的获取最新状态
  3. 组件使用actionCreator的方法也不是很方便

所以现在学习使用react-redux工具,这个工具是准么将react和redux连接起来的

下载 npm i react-redux -S

在react-redux中,有一个概念:

组件应该划分一下类别:容器组件(智能组件)、UI组件(木偶组件)

这样的话,任何一个组件都可以分离成一个容器组件和一个UI组件的组合

容器组件去和store进行交互,获取状态...然后再将这些东西传递给UI组件,UI组件从属性里接收基于可以了

容器组件可以利用react-redux去根据现有的UI组件去自动生成

也就是说只是要需要和store进行交互的组件,我们就将其处理成容器组件和UI组件的结合,我们只需要写UI组件就可以了,容器组件会自动生成的

使用方法:

  1. 在根组件外部包裹上Provider组件,并为其传入store

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

目的,让Provider里面的所有的容器组件都可以使用到store里的东西

Provider是通过context属性将自己的东西传递到内部子级组件中的

  1. 把需要使用到全局状态的组件处理成容器组件和UI组件

  2. ContainerComponnet = connect()(UIComponent)

    让容器组件将自己context里的store相关的东西传递给UI组件

  3. actionCreator的方法只负责创建对应的action就可以了,无需再去dispatch

  4. 现在要让组件去调用store.dispatch,也就是说让组件得到store.dispatch的方法,这也属性在使用store的东西,这个时候也要生成一个容器组件

    传入mapDispatchToProps方法可以将一些方法传入到UI组件的属性上,而这些方法都能调用到dispatch,将actionCreator创建好的action传入到dispatch里就可以了

  5. 可以利用bindActionCreators将actionCreator的方法处理一下产生新方法,在新方法里已经自动的将原方法里产生action给dispatch了

  6. 这个时候,actionCreator变得纯粹了很多,不用去dispatch,专注的返回action就可以了,但是,如果我们有异步动作的话,现在放在action里直接不生效了

    在这里,我们使用redux的中间件来处理,redux的中间件有很多:redux-thunk、redux-promise、redux-saga......

    在这里我们学习使用redux-thunk

redux-thunk的使用方法

  1. npm i redux-thunk -S
  1. 将thunk中间在在创建store的时候加入进去

import { createStore, applyMiddleware } from 'redux'

import thunk from 'redux-thunk'

import reducer from './reducer'

const store = createStore(reducer, applyMiddleware(thunk))

  1. actionCreator里的方法就可以返回一个函数。这个函数会接收到dispatch

    所以,如果有异步的动作,就在对应的actionCreator的方法里返回一个接收到dispatch的函数,在这个函数中创建action再手动的dispatch

注释:

Object.assign()方法的用法
合并多个对象

克隆对象(浅);

为对象添加多个方法

Object.assign(SomeClass.prototype, {
someMethod(arg1, arg2) {
},
anotherMethod() {
}
});​
// 原来的方法
SomeClass.prototype.someMethod = function (arg1, arg2) {
};
SomeClass.prototype.anotherMethod = function () {
};

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

推荐阅读更多精彩内容