基于RN的自建公用组件-Page

2018-03-29  本文已影响0人  蚊小文

首先要搭建React Native的开发环境

要引入RN的基础组件,View、Text,还有关于导航返回的组件react-navigation,这里我为了兼容iphonex引入了Dimensions和Platform两个组件

import React from 'react';
import { View, Text, Dimensions, Platform } from 'react-native';
import { StackNavigator, NavigationActions } from 'react-navigation';

下面我们就开始写最大的容器组件了,这个组件包括头部导航部分

// 兼容ihponex
const X_WIDTH = 375;
const X_HEIGHT = 812;
const SCREEN_WIDTH = Dimensions.get('window').width;
const SCREEN_HEIGHT = Dimensions.get('window').height;
function isIphoneX() {
    return (
        Platform.OS === 'ios' &&
        ((SCREEN_HEIGHT === X_HEIGHT && SCREEN_WIDTH === X_WIDTH) ||
            (SCREEN_HEIGHT === X_WIDTH && SCREEN_WIDTH === X_HEIGHT))
    )
}
// 头部标题部分
function Header({ title, headBg, headColor }) {
    return <View style={{ backgroundColor: headBg, width:'100%', height: 44, flexDirection: 'row', justifyContent: 'center', alignItems:'center', position: 'relative' }} >
        <TouchableOpacity onPress={() => {
            const { navigate, goBack } = navigation;
            goBack();
        }}
            style={{ width: 44, height: 44, position: 'absolute', top: 0, left: 0 }}>
            <Image source={require('../img/arrow.png')} style={{ width: 44, height: 44 }} />
        </TouchableOpacity>
        <Text
            numberOfLines={1}
            style={{ width: '70%', fontSize: 18, color: headColor, lineHeight: 44, textAlign: 'center', fontWeight: 'bold' }} >
            {title}
        </Text>
    </View >
}
/**
 * page组件开始
 */
export class Page extends React.Component {
    render() {
        let { style, title, children, headBg = '#3285ff', headColor = '#fff', dom, other } = this.props;
        let styles = {
            height: '100%',
            width: '100%'
        }
        return (
            <View ref={dom} style={[styles, { paddingBottom: (isIphoneX()) ? 34 : 0 }]} {...other}>
                {/* 判断:如果没有头部直接显示空 */}
                {title ? <Header title={title} headColor={headColor} headBg={headBg} /> : null}
                <View style={{ flex: 1 }} >
                    {children}
                </View>
            </View >
        )
    }
}
上一篇下一篇

猜你喜欢

热点阅读