React Navigation源代码阅读 : NavigationActions.js

// 所支持的 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,
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值