由于项目使用 React, React-Router, Redux 来开发项目,采取了前端渲染的方式(如果采用 ssr 就不会有这个问题)。
问题
所以每到一个页面,需要发一个初始化的请求来获取页面数据,然后重新渲染页面,所以之前一个页面从请求到加载完毕的流程是这样的:
Route match -> ComponentWillMount -> render -> ComponentDidMount -> dispatch(init())-> render -> componentDidUpdate
首先是路由匹配,然后准备加载组件,使用通过 Reducer
里面的初始化 state
进行 render
, 然后触发 ComponentDidMount
事件,在这个事件里面去 dispatch
一个执行页面初始化的请求的 Action
异步的 Actions
前几篇的教程里面,我们搭建了一个 todo 应用。这是一个完全同步的,每次一个 action 被 dispatched, state 都会即时更新。
解析来,我们要搭建一个不同的,异步的应用。它使用 Reddit API 来展示一个选中栏目的头条。
Actions
当你调用一个异步的 API 时,有两个至关重要的时刻:你开始调用的时刻,和你收到答复的时刻。
这两个时刻通常都会需要对应用的 state 做出变化;为此,你需要 dispatch 普通的将会被 reducers 同步处理的 actions. 通常,对于任意 API 请求,你将需要 dispatch 至少三次不同的 actions:
- 一个通知 reducers 请求开始的 action
reducers 可能通过切换一个 state 中的
isFetching
flag 来处理这个 action. 用来告诉 UI 是时候显示一个等待标识了。
- 一个通知 reducer
紧接上一篇走进 Redux 之基础篇(一),接下来会跟着文档从下面三个点开始。
- 数据流
- 与 React 配合
- 实例:TodoList
数据流
Redux 的架构围绕与如何搭建一个严格的单向数据流。
这意味着所有的数据都有遵循一个同样的生命周期模式,可以让整个应用变得可预测也更加易于理解。在 Redux 应用中,所有的数据生命周期分为如下四个步骤:
1 你主动调用 store.dispatch(action)
Action 是一个用来描述发生了事情的对象。比如:
{type:'ADD_TODO',text:'todo\'s content'}
{type:
Redux 的三个原则
- 整个应用的状态都以一个对象树的形式保存在一个单一的 store 中
- 唯一去改变这个对象树的方法就是通过去触发 action,一个用来描述发生了什么事情的对象
- 通过编写纯函数 reducers,去描述这个 action 如何改变了整个对象树
Action
Action 就是承载了要从你的应用传送给 store 的信息。它们只是 store 的信息数据来源。可以通过 store.dispatch()
来传递 action.
action 可能长这个样子:
const ADD_TODO = 'ADD_TODO'
{
type: ADD_TODO,
text: 'Bulid my first Redux App'
}
Actions 就是普通的 JavaScript 对象,但是必须有