react navigation - stackNavigator详细配置(中文版)

说明

本文是根据 navigation action 的官方最新文档一步一步写出来的配置,没个配置都有加详细的说明,如果说明不够理解请将页面滚动到最底部 加 qq 群一起讨论
下面代码注释可以取消看效果

如果你觉得该文章对你有帮助加个喜欢,github 加个 start 谢谢
import React, { Component } from 'react'
import { Platform, StyleSheet, View, Text, Button, Image } from 'react-native'
import { StackNavigator } from 'react-navigation'

class MyHomeScreen extends Component {
    static navigationOptions = ({ navigation }) => {
        const { state: { params } } = navigation
        return {
            title: `Home ${params.user}`
        }
    }
    render() {
        const {
            state: { params, routerName, key },
            navigate,
            setParams
        } = this.props.navigation
        const { user } = params
        return (
            <View style={[styles.disFlex]}>
                <Text style={{ fontSize: 20 }}>
                    HomePage {params.user}
                </Text>
                <Button
                    onPress={() => {
                        navigate('Users', { user: params.user })
                    }}
                    title={`User with ${params.user}`}
                />
                <Button
                    onPress={() => {
                        let newUser = user === 'Sawyer' ? 'Lucy' : 'Sawyer'
                        setParams({ user: newUser })
                    }}
                    title="change header title"
                />
            </View>
        )
    }
}

class MyUserScreen extends Component {
    // 以静态方法的形式配置 navigationOptions
    static navigationOptions = ({ navigation }) => {
        const { state: { params } } = navigation
        return {
            title: `User is ${params.user}`
        }
    }
    render() {
        const { state: { params } } = this.props.navigation
        return (
            <View style={styles.disFlex}>
                <Text style={{ fontSize: 20 }}>
                    UserName: {params.user}
                </Text>
            </View>
        )
    }
}

const styles = StyleSheet.create({
    disFlex: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center'
    }
})

export default StackNavigator(
    {
        Home: {
            screen: MyHomeScreen,
            navigationOptions: {}
        },
        Users: {
            screen: MyUserScreen,
            navigationOptions: {}
        }
    },
    {
        /**
         * header 头部标题切换过渡效果
         * 
         * float:切换页面时保持顶部固定显示 从右至左 平滑显示 这是 ios 上常见的模式
         * screen:切换时整屏淡入淡出,每个屏幕上都有自身的标题  这是 android 常见的模式
         * none: 头部标题隐藏
         */
        headerMode: 'float',
        /* 
         * 屏幕切换时的过渡效果
         * 
         * card: 使用 ios 或 android 默认切换动画。
         * modal: 从底部向上划入,此为 ios 常见效果,对 android 无效
         * 
         * @type {String}
         * @default 'card'
         */
        mode: 'card',
        /**
         * 使用这个属性可以覆盖或者扩展堆栈中单个屏幕的默认样式
         * 配置来自reactnative所支持的样式
         */
        cardStyle: {
            backgroundColor: '#ffffff',
            borderColor: '#ff0000',
            borderWidth: 0
        },
        transitionConfig() {},
        /**
         * 当屏幕切换动画开始的时候执行
         */
        onTransitionStart() {
            console.log('动画开始了,干点啥吧~')
        },
        /**
         * 当屏幕切换动画结束的时候执行
         */
        onTransitionEnd() {
            console.log('动画结束了,干点啥吧~')
        },
        navigationOptions: {
            /**
             * 用作于 headerTitle 的备用标题字符串。
             * 当前套在 TabNavigator 中 将用作于 tabBarLabel 的备用标题字符串
             * 或
             * 当前套在 DrawerNavigator 中 将用作于 drawerLabel 的备用标题字符串
             */
            title: 'home',
            /**
             * 自定义 header 接受一个组件,也可是是自定义组件,你也可
             * 以传入 props 进去进行动态显示你想展示的内容
             * 
             * 本案例作影藏处理,如果你想看效果请把注释取消
             */
            // header: (
            //     <View
            //         style={{
            //             height: 90,
            //             backgroundColor: '#fff',
            //             // flex: 1,
            //             justifyContent: 'center',
            //             alignItems: 'center'
            //         }}
            //     >
            //         <Text style={{ fontSize: 18 }}>首页</Text>
            //     </View>
            // ),
            /**
             * 头部导航标题可以是字符串也可以是一个 react 组件 如果
             * 是组件使用方法如上所示不做阐述
             * 允许字体缩放
             */
            // headerTitle: (
            //     <View style={{ flex: 1, width: 200, height: 40,justifyContent: 'center',
            //     alignItems: 'center' }} allowFontScaling={true}
            //     numLines={1}>
            //         <Text
            //             style={{
            //                 overflow: 'hidden',
            //                 fontSize: 20,
            //                 width: 200
            //             }}
            //             allowFontScaling={true}
            //             numberOfLines={1}
            //         >
            //             哈哈dfasfas sd fads asd fasf asdf sadf asf af f sa asf
            //             asdf asf asf asf asf你好啊阿卡丽的风景阿卡丽就
            //         </Text>
            //     </View>
            // )
            // headerTitle: '你好你好你好啊啊啊啊  离开点击分类阿斯利康减肥哎算了大姐夫',
            /**
             * 不知道咋玩的,测试没啥效果
             */
            headerTitleAllowFontScaling: true,
            /**
             * 是否允许滑动手势来取消当前屏幕  ios 默认为 true 在 android 上默认为false
             */
            gesturesEnabled: true,
            /**
             * 手势响应距离
             */
            gestureResponseDistance: {
                //横向手势距离
                horizontal: 25
                //竖向手势距离
                // vertical: 135
            },
            /**
             * 手势方向 默认 left-to-right
             * inverted 反向
             */
            // gestureDirection: 'inverted',
            /**
             * 返回显示的文字,默认为上一级页面的名称,null为不显示
             */
            // headerBackTitle: null,
            /**
             * 如果返回显示的文字过长,则用该属性的字符串替代
             */
            headerTruncatedBackTitle: '返回',
            /**
             * header 右侧显示的元素,react 元素
             */
            headerRight: <Text>fdsa</Text>,
            headerBackTitleStyle: {
                color: '#000000'
            },
            /**
             * header 样式
             */
            headerStyle: {},
            /**
             * header 标题样式
             */
            headerTitleStyle: {
                color: '#000000'
            },
            /**
             * header 色调
             */
            headerTintColor: '#ff0000'
        },
        /**
         * 过渡配置
         * 更多玩法待研究
         */
        transitionConfig: () => ({
            // transitionSpec: {
            //     duration: 100,
            //     // easing: Easing.out(Easing.poly(4)),
            //     // timing: Animated.timing
            // },
            // screenInterpolator: sceneProps => {
            //     const { layout, position, scene } = sceneProps
            //     const { index } = scene
            //     const height = layout.initHeight
            //     const translateY = position.interpolate({
            //         inputRange: [index - 1, index, index + 1],
            //         outputRange: [height, 0, 0]
            //     })
            //     const opacity = position.interpolate({
            //         inputRange: [index - 1, index - 0.99, index],
            //         outputRange: [0, 1, 1]
            //     })
            //     return { opacity, transform: [{ translateY }] }
            // }
        }),
        initialRouteParams: {
            // 设置初始参数
            user: 'Sawyer'
        }
    }
)

如果你对文章感兴趣 或者有其他技术问题探讨

qq群:218618405
github 地址:https://github.com/Sawyer-china/
本实例 地址: https://github.com/Sawyer-china/react-navigation-demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容