| 版权声明:本文为博主原创文章,未经博主允许不得转载。
Redux框架篇系列文章总目录:
《ReactNative实战讲义》Redux框架篇—(一)基础知识
《ReactNative实战讲义》Redux框架篇—(二)基础应用
《ReactNative实战讲义》Redux框架篇—(三)高级知识
《ReactNative实战讲义》Redux框架篇—(四)高级应用
今天给大家介绍一个新的框架—Redux,这个框架在项目中的位置很重要,基本可以算作项目基础框架的核心。在以后的项目中我们会围绕Redux框架打造一个框架群,因此Redux框架战略地位很重要,当然理解起来还是有相当程度的难度,本篇文章为大家介绍一些关于Redux的基础概念,我会通过一系列的文章带大家认识Redux,理解Redux,使用Redux,首先我们先来看看Redux是个什么东东。
无论是做过React开发,还是ReactNative开发的小伙伴应该都清楚在开发的过程中每个页面中或多或少都会出现状态(State),这是React的基础元素。随着项目不断的迭代,功能不断地增加,复杂程度不断地提高,有越来越多的State值需要我们去管理,复杂的会遇到多页面共用一个状态值,反过来说,一个状态值会影响多个页面的显示。这时,对于状态的管理要求就更高了。而Redux的出现就是为了解决这一问题。
讲到这里我们知道了Redux的出现和项目的State有关,那么它能做到什么呢?
将所有的State变化进行统一流程的处理,会使我们的程序状态变化清晰可变。Redux的最终目的就是让状态变化变得可预测。
以上几点串联起来就是Redux框架工作的流程,这只是笼统的概括,细节的地方我们后面会讲到。
Redux框架使用时的三大元素
// 定义区分动作类型的常量
const LOAD_LIST = 'LOAD_LIST';
// 不成文的规定第一个参数我们设置成type,后面表示发起Action的类型
// 比如:LOAD_LIST 加载列表内容,response后面所带内容为需要加载的列表数据
// 原则上这个普通的JS对象里面的参数都是可以自定义的,根据项目实际需求来定。
{ type: 'LOAD_LIST', response: { ... } }
// 实战中创建ActionCreater的标准样式
export const getList = (listData) => {
return { type: 'LOAD_LIST', response: listData }
}
// 初始化的State值
let initialList = { list: [] }
// 前面讲到了Action就是一个普通的JS对象,里面包含了自定义的参数。
export const listData = (state = initialList, action) => {
switch(action.type) {
case: 'LOAD_LIST':
return {
...state,
list: action.response
}
return state;
}
}
import { createStore } from 'redux';
import { listData } from './reducers';
import { getList } from './actions';
let store = createStore(listData);
// 打印初始状态
console.log(store.getState());
// 每次state更新时,打印日志
// 注意subscribe()返回一个函数用来注销监听器
const unsubscribe = store.subscribe(
() => console.log(store.getState())
);
// 监听一系列action
store.dispatch(getList(
[
{id: 1, name: 'bob'},
{id: 2, name: 'fsf'}
]));
// 停止监听state更新
unsubscribe();
注:关于Store做了些什么工作,我们后续讲解。
严格的单向数据流
下面我们整体串联一下Redux框架每个使用步骤,从中体会一下数据流单向流动的特点。
示例代码:
{ type: 'LIKE_ARTICLE', articleId:42 }
{ type: 'FETCH_USER_SUCCESS', response: { id: 3, name: 'bob' } }
{ type: 'ADD_TODO', text: 'Read the Redux docs' }
内部代码示例
// 当前应用的 state(todos 列表和选中的过滤器)
let previousState = {
visibleTodoFilter: 'SHOW_ALL',
todos: [
{
text: 'Read the docs.',
complete: false
}
]
}
// 将要执行的 action(添加一个 todo)
let action = {
type: 'ADD_TODO',
text: 'Understand the flow.'
}
// reducer 返回处理后的应用状态
let nextState = todoApp(previousState, action);
// 以下代码演示了combineReducers()函数的使用方法
function todos(state = [], action) {
// 省略处理逻辑...
return nextState;
}
function visibleTodoFilter(state = 'SHOW_ALL', action) {
// 省略处理逻辑...
return nextState;
}
let todoApp = combineReducers({
todos,
visibleTodoFilter
})
let nextTodos = todos(state.todos, action);
let nextVisibleTodoFilter = visibleTodoFilter(state.visibleTodoFilter, action);
return {
todos: nextTodos,
visibleTodoFilter: nextVisibleTodoFilter
};
这个新的树就是应用的下一个state!所有订阅store.subscribe(listener)的监听器都将被调用;监听器里可以调用store.getState()获取当前state,最后根据新的state更改UI。
小结:以上就是Redux框架的核心工作流程,其中也蕴含着Redux的设计理念。