1111// React-Redux 为我们暴露了一个组件中的函数让我们可以使用。
1212
1313// 这个函数就是 Connect , 它让我们可以实现一个组件和 Redux store 的绑定,
14- // 通过这种绑定可以让store通过组件的属性 (prop) 分发函数,
14+ // 通过这种绑定可以让store通过组件的属性 (prop) 分发函数,
1515// 也可以根据我们自己的需要增加任何需要暴露的属性作为store里面state的一部分。
1616
17- // 使用了 Connect , 你可以通过添加很少的代码让一个组件变得更"聪明",
17+ // 使用了 Connect , 你可以通过添加很少的代码让一个组件变得更"聪明",
1818// (https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0).
1919
2020// Connect 是一个接受一些映射函数作为参数, 并返回一个你想要链接的组件类函数, 的函数.
2727// - http://natpryce.com/articles/000814.html
2828
2929// Connect "HOC" 主要被设计用于解决无论简单和困难的使用场景。
30- // 在现有的例子中, 我们不会使用 Connect 最复杂的形式,
31- // 但是你可以在完整的 API 文档中找到有关的全部信息:
30+ // 在现有的例子中, 我们不会使用 Connect 最复杂的形式,
31+ // 但是你可以在完整的 API 文档中找到有关的全部信息:
3232// https://github.com/rackt/react-redux/blob/v4.0.0/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options
3333
3434// 以下是完整的 Connect 特征:
3535// connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])
3636// 它的使用方法如下:
37+
3738/*
3839 const wrappedComponentClass = connect(...)(ComponentClass)
3940*/
4445// 这个函数我们一般称它为 Selector。
4546// 它需要接受两个参数: 当前 store 的状态 (state) 以及当前组件的 prop。
4647// 可以看见我们将这个函数命名为 "mapStateToProps",
47- // 这个名字从字面意义上告诉我们它的作用:
48+ // 这个名字从字面意义上告诉我们它的作用:
4849// 它创造了从 state 到一些组件 props 的映射 (map)
4950
5051// 为了完成提取部分组建的 props 作为 state 的动作, (Ex: state.items[props.someID]).
5455
5556import React from 'react'
5657import { connect } from 'react-redux'
57- // 我们会使用一些 ES6 中的 import 技巧来得到所有的 action creator 并生成一个哈希值,
58+ // 我们会使用一些 ES6 中的 import 技巧来得到所有的 action creator 并生成一个哈希值,
5859// 就跟我们当时在 reducer 部分所做的一样。如果你还没有了解action creator的话, 去看看相关章节吧~ (./action-creators.js).
60+
5961import * as actionCreators from './action-creators'
6062
6163class Home extends React . Component {
6264 onTimeButtonClick ( delay ) {
6365 // 这个按钮处理器在用户的点击事件后会分发一个 action。
6466 // 我们在这里会使用一个 Connect 提供的分发函数,
65- // 也有很多其他的调用被绑定到分发器的 actionCreator 的方式,
67+ // 也有很多其他的调用被绑定到分发器的 actionCreator 的方式,
6668 // 这种方式提供了第二个 Connect 的参数:
6769 // https://github.com/rackt/react-redux/blob/v4.0.0/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options
6870 // 被传到 actionCreators.getTime 的 delay 值是为了在我们能得到当前时间之前模拟异步的工作,
6971 // 试着修改这个值来正确影响我们的 UI
7072 this . props . dispatch ( actionCreators . getTime ( delay ) )
7173 }
7274 render ( ) {
73-
75+
7476 // 因为 Connect 我们能够通过 props 取到特定的数据
7577 var { frozen, time, reduxState } = this . props
7678 var attrs = { }
@@ -94,7 +96,7 @@ class Home extends React.Component {
9496 Try to change this value (in < b > src/home.jsx - line 95</ b > ) to verify that the delay given correctly impacts our UI.
9597 </ i >
9698 < br />
97- { /* 我们在这里定义我们的点击处理器 */ }
99+ { /* 这里注册按钮的 "onClick" 句柄: */ }
98100 < button { ...attrs } onClick = { ( ) => this . onTimeButtonClick ( DELAY ) } > Get time!</ button >
99101 < pre >
100102 redux state = { JSON . stringify ( reduxState , null , 2 ) }
@@ -109,7 +111,7 @@ const mapStateToProps = (state/*, props*/) => {
109111 return {
110112 frozen : state . _time . frozen ,
111113 time : state . _time . time ,
112- // 像(reduxState: state) 这样提供整个 state 是一种不好的实现,
114+ // 像 (reduxState: state) 这样提供整个 state 是一种不好的实现,
113115 // 我们在这里这样写是为了让大家能看到我们页面字符串化的结果。更多信息请访问以下链接:
114116 // https://github.com/rackt/react-redux/blob/v4.0.0/docs/api.md#inject-dispatch-and-every-field-in-the-global-state
115117 reduxState : state ,
@@ -123,19 +125,19 @@ export default ConnectedHome
123125// 也许你会发现因为 Redux 让我们可以拥有需要一些状态 (比如保存当前时间) 的动态组件,
124126// 而这个状态并不在组件当中存在,
125127// 我们的组件只会接受含有需要的数据的 prop。
126- // 我们现在拥有了一个无状态组件 (stateless component), 相比较有状态的组件,
128+ // 我们现在拥有了一个无状态组件 (stateless component), 相比较有状态的组件,
127129// 我们在编码中应该尽可能更多的使用无状态组件, 因为它们更易于被复用。
128130// 正如在 "onTimeButtonClick" 处理器中建议的一样, 我们甚至可以把点击的回调函数作为一个 prop
129131// 从 Connect 的第二个参数 "mapDispatchToProps" 中传入。这么做的话, 我们就可以在组件之外获得按钮的行为,
130132// 通过允许另一种点击行为让我们更易于重用这个按钮。
131133// 可复用性的概念也许看起来被过度强调了, 但是拥有一个可复用的组件通常也意味着
132134// 这个组件能够很简单的被测试 (因为你可以将任何你想要的数据和处理器插入你的组件中,
133- // 从而很简单的保证它的正确运行)
135+ // 从而很简单的保证它的正确运行)
134136
135137// 在去看 ./12_final-words.js 之前, 请仔细看以下另一种使用 Connect HOC 的方法。
136138
137139// 因为 Connect 返回了一个接受一个 class 并返回另一个 class 的函数,
138- // 我们可以用它作为 ES7 的 decorator。Decorator 是一种 ES7 的实验新特性,
140+ // 我们可以用它作为 ES7 的 decorator。Decorator 是一种 ES7 的实验新特性,
139141// 让我们能够在设计的时候注释和修改 class 和属性 (https://github.com/wycats/javascript-decorators).
140142
141143// 作为一个试验中的特性, 也许会有变化或问题。
@@ -154,20 +156,20 @@ export default ConnectedHome
154156 export default class MyClass {}
155157*/
156158
157- // 通过这种特性使用redux connect, 我们可以把如下代码:
159+ // 通过这种特性使用 redux connect, 我们可以把如下代码:
158160
159161/*
160- let mapStateToProps = (state) => { ... }
161- class MyClass {}
162- export default connect(mapStateToProps)( MyClass)
163- */
162+ let mapStateToProps = (state) => { ... }
163+ @connect (mapStateToProps)
164+ export default class MyClass {}
165+ */
164166
165167// 替换成:
166168
167169/*
168170 let mapStateToProps = (state) => { ... }
169- @connect (mapStateToProps)
170- export default class MyClass {}
171+ class MyClass {}
172+ export default connect(mapStateToProps)( MyClass)
171173*/
172174
173175// 正如我们看到的, 高层组件的函数现在被作为隐函数使用 ( @connect(mapStateToProps) )
0 commit comments