使用 Redux
在 Taro 中可以自由地使用 React
生态中非常流行的数据流管理工具 Redux 来解决复杂项目的数据管理问题。
首先请安装 redux
、 react-redux
和 redux-thunk
、 redux-logger
等一些需要用到的 redux
中间件
随后可以在项目 src
目录下新增一个 store
目录,在目录下增加 index.js
文件用来配置 store
,按自己喜好设置 redux
的中间件,例如下面例子中使用 redux-thunk
和 redux-logger
这两个中间件
接下来在项目入口文件 app.js
中使用 redux
中提供的 Provider
组件将前面写好的 store
接入应用中
然后就可以开始使用了。如 redux
推荐的那样,可以增加
constants
目录,用来放置所有的action type
常量actions
目录,用来放置所有的actions
reducers
目录,用来放置所有的reducers
例如我们要开发一个简单的加、减计数器功能
新增 action type
新增 reducer
处理
新增 action
处理
最后,我们可以在页面(或者组件)中进行使用,我们将通过 redux
提供的 connect
方法将 redux
与我们的页面进行连接
connect
方法接受两个参数 mapStateToProps
与 mapDispatchToProps
mapStateToProps
,函数类型,接受最新的state
作为参数,用于将state
映射到组件的props
mapDispatchToProps
,函数类型,接收dispatch()
方法并返回期望注入到展示组件的props
中的回调方法
#
Hooks#
在 Redux 中使用 Hooks使用 hooks 的基本设置和使用 connect
的设置是一样的,你需要设置你的 store
,并把你的应用放在 Provider
组件中。
在这样的情况下,你就可以使用 redux
提供的 Hooks API 在函数式组件中使用。
useSelector
#
useSelector
允许你使用 selector 函数从一个 Redux Store 中获取数据。
Selector 函数大致相当于 connect
函数的 mapStateToProps
参数。Selector 会在组件每次渲染时调用。useSelector
同样会订阅 Redux store,在 Redux action 被 dispatch 时调用。
但 useSelector
还是和 mapStateToProps
有一些不同:
- 不像
mapStateToProps
只返回对象一样,Selector 可能会返回任何值。 - 当一个 action dispatch 时,
useSelector
会把 selector 的前后返回值做一次浅对比,如果不同,组件会强制更新。 - Selector 函数不接受
ownProps
参数。但 selector 可以通过闭包访问函数式组件传递下来的 props。
#
使用案例基本使用:
使用闭包决定如何 select 数据:
#
进阶使用 你还可以访问 react-redux 文档 了解如何使用 reselect
缓存 selector。
useDispatch
#
这个 Hook 返回 Redux store 的 dispatch
引用。你可以使用它来 dispatch actions。
#
使用案例当我们使用 dispatch
传递回调到一个子组件时,推荐使用 useCallback
把回调缓存起来,因为组件可能因为引用改变而重新渲染。
useStore
#
useStore
返回一个 store 引用和 Provider
组件引用完全一致。
这个 hook 可能并不经常使用。useSelector
大部分情况是你的第一选择,如果需要替换 reducers 的情况下可能会使用到这个 API。