啟動
認識一下index.js檔案,程式碼如下:
複製程式碼
import { AppRegistry } from 'react-native'; #從‘react-native’庫中引入‘AppRegistry’元件
import App from './App'; #引入‘App.js’檔案,並起個別名叫‘App’(這個名字可以隨便起)
AppRegistry.registerComponent('HelloWorld', () => App); #註冊js入口
複製程式碼
AppRegistry負責註冊執行RN應用程式的js入口。'HelloWorld'這個是專案名稱,不要隨便修改哦!可還記得上面文章中:
複製程式碼
react-native init HelloWorld
複製程式碼
這句程式碼,你建立工程時候的名字。如果這個對應不上你就會出現以下情況:
複製程式碼
相信不少小夥伴都遇見過這個問題吧!
複製程式碼
體驗跳轉
API簡介 - StackNavigator
背景介紹:從0.44版本開始,Navigator被從react native的核心元件庫中剝離到了一個名為
react-native-deprecated-custom-components的單獨模組中。社群今後主推的方案是一個單獨的導航庫
react-navigation,它的使用十分簡單。所以我們使用StackNavigator來進行跳轉
複製程式碼
先來一波程式碼
Nav.js原始碼:
import {StackNavigator} from 'react-navigation'
import Hello from "./Hello";
import World from "./World"
export default NavData = StackNavigator({Hello: {screen: Hello}, World: {screen: World}})
複製程式碼
建立一個StackNavigator(有android經驗的小夥伴,仔細看看有點Androidmanifest.xml的味道),註冊了別稱‘Hello’的
Hello.js檔案和稱‘World’的World.js檔案
複製程式碼
index.js原始碼:
import {AppRegistry} from 'react-native';
import App from './src/solide/testNavagation/Nav';
AppRegistry.registerComponent('HelloWorld', () => App); #這裡要注意是StackNavigator去註冊啟動
複製程式碼
應用預設啟動第一個元素Hello
複製程式碼
Hello.js原始碼:
import React, {Component} from 'react';
import {View, Text} from 'react-native'
import {} from 'react-navigation'
export default class Hello extends Component {
//設定導航欄標題
static navigationOptions = {
title: 'Hello'
};
render() {
const {navigate} = this.props.navigation;
return <View>
//設定點選事件
<Text onPress={() => navigate('World')}>Hello Hello</Text>
</View>
}
}
複製程式碼
World.js原始碼就不放了,只有一個view展示。
專案地址
https://github.com/yzj0487/StackNavigator
複製程式碼
詳細分析一波
如果你是下載的完成專案或者copy的程式碼,那麼相信你已經體驗過跳轉了。程式碼只簡單的幾行,如果你是自己寫的,那麼
我相信你會遇見不少問題,或者你會問為什麼要這樣寫?
來來小問題走一波:
複製程式碼
有木有很興奮,又是熟悉的紅色。標題很清晰,navigate物件找不到,引起原因:
複製程式碼
const {navigate} = this.props.navigation;
複製程式碼
就是這行程式碼引起的,引起的原因大致兩種:
1、你沒有寫這行程式碼
2、這行程式碼的作用域沒有覆蓋到(例如你把click方法定義在外面,那麼這行程式碼也要寫在click方法裡面,如果你寫在
render裡面就會報錯)
小知識點:這裡this.props不知道小夥伴是怎麼理解的?今後他會和我們經常見面,這裡我對它也不是特別瞭解,反正它
的作用很多,我們暫且把他理解為——元件的屬性
好學的小夥伴,肯定還會有很多問題,我們再簡單看個問題,為咩‘static navigationOptions’這麼一個靜態變數就能設定屬性?
回答這個問題我們必須去看看StackNavigator的原始碼了
複製程式碼
StackNavigator.js原始碼:
export default (routeConfigMap, stackConfig = {}) => {
const {
initialRouteKey,
initialRouteName,
initialRouteParams,
paths,
headerMode,
headerTransitionPreset,
mode,
cardStyle,
transitionConfig,
onTransitionStart,
onTransitionEnd,
navigationOptions,
} = stackConfig; //配置資訊
const stackRouterConfig = {
initialRouteKey,
initialRouteName,
initialRouteParams,
paths,
navigationOptions,
};
const router = StackRouter(routeConfigMap, stackRouterConfig);
// Create a navigator with CardStackTransitioner as the view
const navigator = createNavigator(router, routeConfigMap, stackConfig)(
props => (
<CardStackTransitioner
{...props}
headerMode={headerMode}
headerTransitionPreset={headerTransitionPreset}
mode={mode}
cardStyle={cardStyle}
transitionConfig={transitionConfig}
onTransitionStart={onTransitionStart}
onTransitionEnd={(lastTransition, transition) => {
const { state, dispatch } = props.navigation;
dispatch(NavigationActions.completeTransition({ key: state.key }));
onTransitionEnd && onTransitionEnd(lastTransition, transition);
}}
/>
)
);
return createNavigationContainer(navigator);
};
複製程式碼
檢視一下原始碼是不是豁然開朗了?如果沒有,那麼我簡單說兩句,config中直接引用常量屬性‘navigationOptions’,
那麼你在元件中‘static navigationOptions’就是override這個屬性了。
附上官方解釋:the options can be a function that takes the following arguments, and returns an object of
navigation options that will be override the route-defined and navigator-defined navigationOptions
文件地址:https://reactnavigation.org/docs/stack-navigator.html
複製程式碼