/**
*
* 此模块导出一个函数,该函数用于增强一个 navigation 的功能,
* 为其添加各种导航函数,所添加的各个导航函数的逻辑其实是
* 构造相应的 action,然后使用 navigation 的 dispatch 方法
* 派发出去
*/
import NavigationActions from './NavigationActions';
import invariant from './utils/invariant';
export default function(navigation) {
return {
// 使用展开运算符将带增强对象属性全部复制到目标对象
...navigation,
/**
* goBack 导航函数
* @param key
*/
goBack: key => {
let actualizedKey = key;
if (key === undefined && navigation.state.key) {
invariant(
typeof navigation.state.key === 'string',
'key should be a string'
);
actualizedKey = navigation.state.key;
}
return navigation.dispatch(
NavigationActions.back({ key: actualizedKey })
);
},
/**
* navigate 导航函数
* @param navigateTo
* @param params
* @param action
*/
navigate: (navigateTo, params, action) => {
if (typeof navigateTo === 'string') {
return navigation.dispatch(
NavigationActions.navigate({ routeName: navigateTo, params, action })
);
}
invariant(
typeof navigateTo === 'object',
'Must navigateTo an object or a string'
);
invariant(
params == null,
'Params must not be provided to .navigate() when specifying an object'
);
invariant(
action == null,
'Child action must not be provided to .navigate() when specifying an object'
);
return navigation.dispatch(NavigationActions.navigate(navigateTo));
},
/**
* pop 导航函数
* @param n
* @param params
*/
pop: (n, params) =>
navigation.dispatch(
NavigationActions.pop({ n, immediate: params && params.immediate })
),
/**
* popToTop 导航函数
* @param params
*/
popToTop: params =>
navigation.dispatch(
NavigationActions.popToTop({ immediate: params && params.immediate })
),
/**
* For updating current route params. For example the nav bar title and
* buttons are based on the route params.
* This means `setParams` can be used to update nav bar for example.
*/
/**
* 设置路由参数
* @param params
*/
setParams: params => {
invariant(
navigation.state.key && typeof navigation.state.key === 'string',
'setParams cannot be called by root navigator'
);
const key = navigation.state.key;
return navigation.dispatch(NavigationActions.setParams({ params, key }));
},
/**
* 获取路由参数
* @param paramName
* @param defaultValue
* @returns {*}
*/
getParam: (paramName, defaultValue) => {
const params = navigation.state.params;
if (params && paramName in params) {
return params[paramName];
}
return defaultValue;
},
/**
* push 导航函数
* @param routeName
* @param params
* @param action
*/
push: (routeName, params, action) =>
navigation.dispatch(
NavigationActions.push({ routeName, params, action })
),
/**
* replace 导航函数
* @param routeName
* @param params
* @param action
*/
replace: (routeName, params, action) =>
navigation.dispatch(
NavigationActions.replace({
routeName,
params,
action,
key: navigation.state.key,
})
),
};
}
React Navigation源代码阅读 : addNavigationHelpers.js
最新推荐文章于 2021-06-11 23:45:40 发布
本文介绍了一个增强Navigation组件的方法,通过添加多种导航功能如goBack、navigate、pop等,并详细解释了这些函数的工作原理及如何通过构造action并使用dispatch方法实现导航。
2216

被折叠的 条评论
为什么被折叠?



