注:本教程针对于有过React/ReactNative开发经验的人群。
阮一峰老师对于react-redux的讲解:
http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_three_react-redux.html
为了方便使用,Redux 的作者封装了一个 React 专用的库 React-Redux,本文主要介绍它。
这个库是可以选用的。实际项目中,你应该权衡一下,是直接使用 Redux,还是使用 React-Redux。后者虽然提供了便利,但是需要掌握额外的 API,并且要遵守它的组件拆分规范。
React-Redux提供了两个方法:
1.Provider
2.connect
写在前面:基本概念
React-Redux 将所有组件分成两大类:UI 组件(presentational component)和容器组件(container component)。通过connect连接。
一:Prcvider详解
唯一作用就是包裹住整个应用,并接收stoer函数。
二:connect
2.1 connect
就是将容器组件也叫状态和UI组件进行连接。
摘录第二讲的Demo代码
function
select
(
store
)
{
return
{
GetWeatherReducer
:
store
.
GetWeatherReducer
,
}
}
export
default
connect
(
select
)(
Redux1
)
;
用connect讲“状态”和“UI”进行连接。
状态:就是Store。
UI:就是你当前组件的类名(Class)。
------------------
class
Redux1
extends
Component
{
------------------
连接后才能使用。这是react-redux的规则。
2.2 mapStateToProps()
connect(参数一)(参数二)
上面已经讲述了,connect要连接参数一的状态和参数二的UI。
参数一也就是所谓的容器组件,又包含两个方法【‘mapStateToProps’、‘mapDispatchToProps’】,我上面的Demo代码中只传了一个参数,也就是mapStateToProps。
mapStateToProps是一个函数。它的作用就是像它的名字那样,建立一个从(外部的)state对象到(UI 组件的)props对象的映射关系。
作为函数,mapStateToProps执行后应该返回一个对象,里面的每一个键值对就是一个映射。请看下面的例子。
const
mapStateToProps
=
(
state
)
=>
{
return
{
todos
:
getVisibleTodos
(
state
.
todos
,
state
.
visibilityFilter
)
}
}
上面代码中,mapStateToProps是一个函数,它接受state作为参数,返回一个对象。这个对象有一个todos属性,代表 UI 组件的同名参数,后面的getVisibleTodos也是一个函数,可以从state算出 todos 的值。
下面就是getVisibleTodos的一个例子,用来算出todos。
const
getVisibleTodos
=
(
todos
,
filter
)
=>
{
switch
(
filter
)
{
case
'
SHOW_ALL
':
return
todos
case
'
SHOW_COMPLETED
':
return
todos
.
filter
(
t
=>
t
.
completed
)
case
'
SHOW_ACTIVE
':
return
todos
.
filter
(
t
=>
!
t
.
completed
)
default
:
throw
new
Error
(
'
Unknown filter:
'
+
filter
)
}
}
mapStateToProps会订阅 Store,每当state更新的时候,就会自动执行,重新计算 UI 组件的参数,从而触发 UI 组件的重新渲染。
mapStateToProps的第一个参数总是state对象,还可以使用第二个参数,代表容器组件的props对象。
// 容器组件的代码
//
// All
//
const
mapStateToProps
=
(
state
,
ownProps
)
=>
{
return
{
active
:
ownProps
.
filter
===
state
.
visibilityFilter
}
}
使用ownProps作为参数后,如果容器组件的参数发生变化,也会引发 UI 组件重新渲染。
connect方法可以省略mapStateToProps参数,那样的话,UI 组件就不会订阅Store,就是说 Store 的更新不会引起 UI 组件的更新。
2.3 mapDispatchToProps()
mapDispatchToProps是connect函数的第二个参数,用来建立 UI 组件的参数到store.dispatch方法的映射。也就是说,它定义了哪些用户的操作应该当作 Action,传给 Store。它可以是一个函数,也可以是一个对象。
如果mapDispatchToProps是一个函数,会得到dispatch和ownProps(容器组件的props对象)两个参数。
const
mapDispatchToProps
=
(
dispatch
,
ownProps
)
=>
{
return
{
onClick
:
()
=>
{
dispatch
(
{
type
:
'
SET_VISIBILITY_FILTER
',
filter
:
ownProps
.
filter
}
)
;
}
};
}
从上面代码可以看到,mapDispatchToProps作为函数,应该返回一个对象,该对象的每个键值对都是一个映射,定义了 UI 组件的参数怎样发出 Action。
如果mapDispatchToProps是一个对象,它的每个键名也是对应 UI 组件的同名参数,键值应该是一个函数,会被当作 Action creator ,返回的 Action 会由 Redux 自动发出。举例来说,上面的mapDispatchToProps写成对象就是下面这样。
const
mapDispatchToProps
=
{
onClick
:
(
filter
)
=>
{
type
:
'
SET_VISIBILITY_FILTER
',
filter
:
filter
,
}
}