跳到主要內容
版本:6.x

常用動作參考

導覽動作是一個物件,至少包含一個type屬性。在內部,動作可以由具有getStateForAction方法的路由器處理,以從現有的導覽狀態傳回新狀態。

每項導覽動作至少可以包含下列屬性

  • type (必要) - 表示動作名稱的字串。
  • payload (選用) - 包含動作額外資訊的物件。例如,對navigate來說,它會包含nameparams
  • source (選用) - 應視為動作來源的路由金鑰。這用於某些動作,以決定要對哪個路由套用動作。預設情況下,navigation.dispatch會新增發出動作之路由的金鑰。
  • target (選用) - 應套用動作的導覽狀態金鑰。

重要的是,當動作未處理時,發送導覽動作不會引發任何錯誤(類似於在 redux 中發送未由簡化器處理的動作而不會發生任何情況)。

常用動作

此函式庫在 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

reset 動作能將 導航狀態 重設為給定的狀態。它需要下列參數

  • state - 物件 - 要使用的新的 導航狀態 物件。
import { CommonActions } from '@react-navigation/native';

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

reset 中指定的狀態物件會使用新的物件取代現有的 導航狀態。這表示如果您提供沒有關鍵字的新路線物件,或關鍵字不同的路線物件,它將移除那些路線的現有畫面,並新增新的畫面。

如果您想保留現有畫面,但只想要修改狀態,您可以傳遞函式給 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,
});
});
警告

請將 navigator 的狀態物件視為內部物件,並理解在次要版本中可能會變更。除非您真的需要,否則請避免使用 navigation state 狀態物件中的內容,例如 indexroutes。如果您遇到某些功能無法在不依賴狀態物件結構的情況下達成,請務必回報問題。

重新撰寫包含 reset 的歷史記錄

由於 reset 動作可以使用新的狀態物件來更新導覽狀態,因此可以用於重新撰寫導覽歷史記錄。不過,多數情況下不建議重新撰寫歷史記錄來改變返回堆疊。

  • 這麼做可能會造成使用者的困擾,因為使用者會希望返回到他們之前所在的畫面。
  • 支援 Web 平台時,瀏覽器的歷史記錄仍會反映舊的導覽狀態,因此如果使用者使用瀏覽器的返回鍵,就會看到舊畫面 - 根據使用者按下的返回鍵的不同,可能會產生 2 種不同的體驗。

因此,如果您有這樣的使用案例,請考慮不同的方法 - 例如,在使用者導覽返回已變更的畫面時更新歷史記錄。

**goBack**

goBack 動作建立器允許返回歷史記錄中的上一個路由。它不會帶任何引數。

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

navigation.dispatch(CommonActions.goBack());

如果您想從特定路由返回,您可以新增一個參考路由金鑰的 source 屬性,以及一個參考包含路由之 navigator 的 keytarget 屬性

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

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

預設情況下,會將發送動作的路由金鑰傳遞為 source 屬性,而 target 屬性為 undefined

**setParams**

setParams 動作允許更新特定路由的參數。它會帶有以下引數

  • params - 物件 - 必要 - 要合併至現有路由參數的新參數。
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,它會設定焦點路由的參數。