// 所支持的 Action 的常量定义,都定义为字符串,也可以理解为 Action 的类型,常量名字基本上都可以望文知意
const BACK = 'Navigation/BACK'; // 返回:关闭当前路由,返回当前路由关闭后栈中的最顶层路由屏幕
const INIT = 'Navigation/INIT';//
const NAVIGATE = 'Navigation/NAVIGATE'; // 导航跳转到指定路由屏幕
const POP = 'Navigation/POP'; // 弹出当前路由:当前路由总是在栈顶,所以此Action效果跟BACK一致
const POP_TO_TOP = 'Navigation/POP_TO_TOP'; //
const PUSH = 'Navigation/PUSH'; //
const RESET = 'Navigation/RESET';//
const REPLACE = 'Navigation/REPLACE';//
const SET_PARAMS = 'Navigation/SET_PARAMS';//
const URI = 'Navigation/URI';//
const COMPLETE_TRANSITION = 'Navigation/COMPLETE_TRANSITION';//
/**
* Higher Order Component,
* 以上各种 action 的创建函数(action creator)的工厂方法
* @param type 指定 action type
* @param fn 目标 action creator 函数的基础逻辑
* @returns 目标 action creator 函数,
* 目标 action creator 函数接收一个 payload 对象作为参数,用于创建类型为 type 的 action 对象,
* 实际上, 目标 action creator 函数创建的 action 有一个 type 属性,其值为参数 type 的值
*/
const createAction = (type, fn) => {
// 重定义目标 action creator 函数的 toString 函数使其总是返回相应的 action type,
// 其实也就是上面定义的 Action 常量之一
fn.toString = () => type;
return fn;
};
const back = createAction(BACK, (payload = {}) => ({
type: BACK,
key: payload.key,
immediate: payload.immediate,
}));
const init = createAction(INIT, (payload = {}) => {
const action = {
type: INIT,
};
if (payload.params) {
action.params = payload.params;
}
return action;
});
const navigate = createAction(NAVIGATE, payload => {
const action = {
type: NAVIGATE,
routeName: payload.routeName,
};
if (payload.params) {
action.params = payload.params;
}
if (payload.action) {
action.action = payload.action;
}
if (payload.key) {
action.key = payload.key;
}
return action;
});
const pop = createAction(POP, payload => ({
type: POP,
n: payload && payload.n,
immediate: payload && payload.immediate,
}));
const popToTop = createAction(POP_TO_TOP, payload => ({
type: POP_TO_TOP,
immediate: payload && payload.immediate,
key: payload && payload.key,
}));
const push = createAction(PUSH, payload => {
const action = {
type: PUSH,
routeName: payload.routeName,
};
if (payload.params) {
action.params = payload.params;
}
if (payload.action) {
action.action = payload.action;
}
return action;
});
const reset = createAction(RESET, payload => ({
type: RESET,
index: payload.index,
key: payload.key,
actions: payload.actions,
}));
const replace = createAction(REPLACE, payload => ({
type: REPLACE,
key: payload.key,
newKey: payload.newKey,
params: payload.params,
action: payload.action,
routeName: payload.routeName,
immediate: payload.immediate,
}));
const setParams = createAction(SET_PARAMS, payload => ({
type: SET_PARAMS,
key: payload.key,
params: payload.params,
}));
const uri = createAction(URI, payload => ({
type: URI,
uri: payload.uri,
}));
const completeTransition = createAction(COMPLETE_TRANSITION, payload => ({
type: COMPLETE_TRANSITION,
key: payload && payload.key,
}));
export default {
// Action constants
BACK,
INIT,
NAVIGATE,
POP,
POP_TO_TOP,
PUSH,
RESET,
REPLACE,
SET_PARAMS,
URI,
COMPLETE_TRANSITION,
// Action creators
back,
init,
navigate,
pop,
popToTop,
push,
reset,
replace,
setParams,
uri,
completeTransition,
};
React Navigation源代码阅读 : NavigationActions.js
最新推荐文章于 2025-03-25 21:58:09 发布