跳至主要内容
版本: 6.x

CommonActions 参考

导航操作是一个至少包含 type 属性的对象。在内部,操作可以由 路由器 使用 getStateForAction 方法从现有的 导航状态 返回一个新状态。

每个导航操作至少可以包含以下属性

  • type (必填) - 一个表示操作名称的字符串。
  • payload (可选) - 一个包含有关操作的附加信息的对象。例如,它将包含 navigatenameparams
  • source (可选) - 应被视为操作来源的路由键。这用于某些操作来确定对哪个路由应用操作。默认情况下,navigation.dispatch 添加了调度操作的路由键。
  • target (可选) - 应应用操作的 导航状态 的键。

重要的是要强调,当操作未处理时,调度导航操作不会抛出任何错误(类似于当您调度一个未由 redux 中的 reducer 处理的操作时,什么也不会发生)。

常见操作

该库在 CommonActions 命名空间下导出了一些操作创建者。您应该使用这些操作创建者,而不是手动编写操作对象。

navigate 操作允许导航到特定路由。它接受以下参数

  • name - 字符串 - 已在某处注册的路由的目标名称。
  • key - 字符串 - 要导航到的路由的标识符。如果该路由已存在,则导航回该路由。
  • params - 对象 - 要合并到目标路由的参数。

传递的选项对象至少应包含 keyname 属性,以及可选的 params。如果同时传递了 keyname,则堆栈导航器将在未找到匹配项的情况下使用指定的键创建一个新路由。

import { CommonActions } from '@react-navigation/native';

navigation.dispatch(
CommonActions.navigate({
name: 'Profile',
params: {
user: 'jane',
},
})
);

堆栈导航器 中,使用屏幕名称调用 navigate 将根据屏幕是否已存在而产生不同的行为。如果屏幕已存在于堆栈的历史记录中,它将返回到该屏幕并删除该屏幕之后的任何屏幕。如果屏幕不存在,它将推送一个新屏幕。

默认情况下,屏幕由其名称标识。但您也可以使用 getId 属性将其自定义为考虑参数。

重置

reset 操作允许将 导航状态 重置为给定状态。它接受以下参数

  • state - 对象 - 要使用的新的 导航状态 对象。
import { CommonActions } from '@react-navigation/native';

navigation.dispatch(
CommonActions.reset({
index: 1,
routes: [
{ name: 'Home' },
{
name: 'Profile',
params: { user: 'jane' },
},
],
})
);

reset 中指定的 state 对象将使用新的对象替换现有的 导航状态。这意味着,如果您提供没有键的新路由对象,或具有不同键的路由对象,它将删除这些路由的现有屏幕并添加新屏幕。

如果您想保留现有屏幕,但只想修改状态,您可以将一个函数传递给 dispatch,您可以在其中获取现有状态。然后,您可以根据需要更改它(确保不要修改现有状态,而是为您的更改创建新的状态对象)。并返回一个包含所需状态的 reset 操作

import { CommonActions } from '@react-navigation/native';

navigation.dispatch((state) => {
// Remove all the screens after `Profile`
const index = state.routes.findIndex((r) => r.name === 'Profile');
const routes = state.routes.slice(0, index + 1);

return CommonActions.reset({
...state,
routes,
index: routes.length - 1,
});
});
警告

将导航器的状态对象视为内部对象,并且可能会在次要版本中发生更改。避免使用 导航状态 状态对象中的属性,除非您确实需要它。如果您无法在不依赖状态对象结构的情况下实现某些功能,请打开一个问题。

使用 reset 重写历史记录

由于 reset 操作可以使用新的状态对象更新导航状态,因此它可以用来重写导航历史记录。但是,在大多数情况下,不建议重写历史记录以更改后退栈

  • 这会导致用户体验混乱,因为用户期望能够返回到他们之前所在的屏幕。
  • 在支持 Web 平台时,浏览器的历史记录仍然会反映旧的导航状态,因此如果用户使用浏览器的后退按钮,他们将看到旧的屏幕 - 导致根据用户按下的后退按钮的不同体验。

因此,如果您有这样的用例,请考虑使用其他方法 - 例如,在用户返回到已更改的屏幕后更新历史记录。

goBack

goBack 操作创建者允许返回历史记录中的上一条路线。它不接受任何参数。

import { CommonActions } from '@react-navigation/native';

navigation.dispatch(CommonActions.goBack());

如果您想从特定路线返回,可以添加一个 source 属性,它引用路线键,以及一个 target 属性,它引用包含路线的导航器的 key

import { CommonActions } from '@react-navigation/native';

navigation.dispatch({
...CommonActions.goBack(),
source: route.key,
target: state.key,
});

默认情况下,发出操作的路线的键将作为 source 属性传递,target 属性为 undefined

setParams

setParams 操作允许更新特定路线的参数。它接受以下参数

  • params - object - required - 要合并到现有路线参数中的新参数。
import { CommonActions } from '@react-navigation/native';

navigation.dispatch(CommonActions.setParams({ user: 'Wojtek' }));

如果您想为特定路线设置参数,可以添加一个 source 属性,它引用路线键

import { CommonActions } from '@react-navigation/native';

navigation.dispatch({
...CommonActions.setParams({ user: 'Wojtek' }),
source: route.key,
});

如果显式地将source属性设置为undefined,它将设置当前聚焦路由的参数。