常用動作參考
導覽動作是一個物件,至少包含一個type
屬性。在內部,動作可以由具有getStateForAction
方法的路由器處理,以從現有的導覽狀態傳回新狀態。
每項導覽動作至少可以包含下列屬性
type
(必要) - 表示動作名稱的字串。payload
(選用) - 包含動作額外資訊的物件。例如,對navigate
來說,它會包含name
和params
。source
(選用) - 應視為動作來源的路由金鑰。這用於某些動作,以決定要對哪個路由套用動作。預設情況下,navigation.dispatch
會新增發出動作之路由的金鑰。target
(選用) - 應套用動作的導覽狀態金鑰。
重要的是,當動作未處理時,發送導覽動作不會引發任何錯誤(類似於在 redux 中發送未由簡化器處理的動作而不會發生任何情況)。
常用動作
此函式庫在 CommonActions
名稱空間中匯出許多動作建立器。您應該使用這些動作建立器,而不是手動撰寫動作物件。
navigate
navigate
動作能導航至特定路線。它需要下列參數
name
- 字串 - 路線的目的地名稱,其已在某處註冊。key
- 字串 - 要導航至的路線識別碼。如果路線已存在,則導航回該路線。params
- 物件 - 要合併至目的地路線的參數。
傳遞的選項物件至少應包含 key
或 name
屬性,並可選擇 params
。如果傳遞 key
和 name
,則堆疊導航器在找不到符合項時會建立新的路線,其關鍵字為指定的關鍵字。
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 狀態物件中的內容,例如 index
和 routes
。如果您遇到某些功能無法在不依賴狀態物件結構的情況下達成,請務必回報問題。
重新撰寫包含 reset
的歷史記錄
由於 reset
動作可以使用新的狀態物件來更新導覽狀態,因此可以用於重新撰寫導覽歷史記錄。不過,多數情況下不建議重新撰寫歷史記錄來改變返回堆疊。
- 這麼做可能會造成使用者的困擾,因為使用者會希望返回到他們之前所在的畫面。
- 支援 Web 平台時,瀏覽器的歷史記錄仍會反映舊的導覽狀態,因此如果使用者使用瀏覽器的返回鍵,就會看到舊畫面 - 根據使用者按下的返回鍵的不同,可能會產生 2 種不同的體驗。
因此,如果您有這樣的使用案例,請考慮不同的方法 - 例如,在使用者導覽返回已變更的畫面時更新歷史記錄。
**goBack**
goBack
動作建立器允許返回歷史記錄中的上一個路由。它不會帶任何引數。
import { CommonActions } from '@react-navigation/native';
navigation.dispatch(CommonActions.goBack());
如果您想從特定路由返回,您可以新增一個參考路由金鑰的 source
屬性,以及一個參考包含路由之 navigator 的 key
的 target
屬性
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
,它會設定焦點路由的參數。