React Native 封裝頁面基類BaseComponent

我在react native 開發(fā)時颤陶≡忧睿基本每個頁面都要處理下面的問題烛卧。
1.為每個頁面包裹一層SafeArea用于適配iPhoneX以及后續(xù)機型
2.處理每一個頁面的安卓返回鍵
3.狀態(tài)欄的顏色等配置
移動端原生開發(fā)時予颤。我們會給每一個一面寫一個基類踢步。封裝一些配置和功能绞佩。后續(xù)的頁面都繼承這個基類寺鸥,起到便捷作用。所以我封裝了一個這樣的基類品山,用于快捷處理上面遇到的問題胆建。

import React, { Component } from "react";
import { StatusBar, StyleSheet, Platform } from "react-native";
import { SafeAreaView } from "react-navigation";
import { BackHandler } from "react-native";

export default class Base extends Component {
    constructor(props) {
        super(props);
        if (props.navigation) {
            //如果是在nav中的組件。添加安卓返回鍵監(jiān)聽
            this._didFocusSubscription = props.navigation.addListener(
                "didFocus",
                payload =>
                    BackHandler.addEventListener(
                        "hardwareBackPress",
                        this._onBackButtonPressAndroid
                    )
            );
        }
    }
    /**
     * 可以在繼承類中重寫的方法
     */
    //狀態(tài)欄配置文件
    _statusBarConfig = {};
    //處理安卓返回鍵肘交,默認直接可以返回笆载,子繼承類中重寫此方法可以自定義處理安卓返回鍵
    _onBackButtonPressAndroid = () => {
        //當return true時,會阻止默認的返回事件
        return false;
    };

    /**
     * LifeCircle
     * 在被繼承的Component中重寫這兩個方法作為新的生命周期使用
     * !!!!!一定要使用箭頭函數(shù)的形式
     * 不要重寫舊的componentDidMount和DidUnmount
     */

    BaseComponentWillMount = () => {};
    BaseRender = () => {};
    BaseComponentDidMount = () => {};
    BaseComponentWillUnmount = () => {};
    /**
     * 原有l(wèi)ifeCircle
     */

    componentDidMount = () => {
        if (this.props.navigation) {
            //添加狀態(tài)欄以及安卓返回鍵監(jiān)聽
            Platform.OS === "android" && this.setAndroidBackListener();
            this.setStatusBarListener();
        }
        this.BaseComponentDidMount();
    };
    UNSAFE_componentWillMount = () => {
        this.BaseComponentWillMount();
    };
    componentWillUnmount = () => {
        this._statusBarListener && this._statusBarListener.remove();
        this._didFocusSubscription && this._didFocusSubscription.remove();
        this._willBlurSubscription && this._willBlurSubscription.remove();
        this.BaseComponentWillUnmount();
    };

    //添加頁面切換時狀態(tài)欄監(jiān)聽
    setStatusBarListener = () => {
        const barConfig = {
            contentType: "dark-content", //狀態(tài)欄文字顏色 enum('default', 'light-content', 'dark-content')
            androidTranslucent: true, //狀態(tài)欄是否沉浸式涯呻。需要配合backgroundColor為透明色來一起配置
            androidBarBackgroundColor: null, //狀態(tài)欄背景顏色
            hidden: false, //是否隱藏狀態(tài)欄
            ...this._statusBarConfig
        };
        this._statusBarListener = this.props.navigation.addListener(
            "didFocus",
            () => {
                StatusBar.setBarStyle(barConfig.contentType);
                StatusBar.setHidden(barConfig.hidden);
                //安卓沉浸式
                if (Platform.OS === "android") {
                    StatusBar.setTranslucent(barConfig.androidTranslucent);
                    if (barConfig.androidTranslucent) {
                        //安卓沉浸式
                        StatusBar.setBackgroundColor("transparent");
                    } else {
                        barConfig.androidBarBackgroundColor &&
                            StatusBar.setBackgroundColor(barConfig.androidBarBackgroundColor);
                    }
                }
            }
        );
    };
    setAndroidBackListener = () => {
        this._willBlurSubscription = this.props.navigation.addListener(
            "willBlur",
            payload =>
                BackHandler.removeEventListener(
                    "hardwareBackPress",
                    this._onBackButtonPressAndroid
                )
        );
    };

    render = () => {
        return (
            <SafeAreaView
                style={[baseStyles.safeArea, this.safeAreaStyles]}
                forceInset={this.forceInset}
            >
                {this.BaseRender()}
            </SafeAreaView>
        );
    };
}

const baseStyles = StyleSheet.create({
    safeArea: {
        backgroundColor: '#ffffff',
        flex: 1
    }
});

然后在新建頁面時繼承這個類,新建的頁面如下

import React from "react";
import { View } from "src/Utility/PathExport";
import BaseComponent from "src/UI/Pages/BaseComponent";
import MainView from "./view";


/**
 * 新建頁面中用BaseComponentDidMount等代替原有的ComponentDidMount等生命周期凉驻,方法一定要寫成箭頭函數(shù)的形式,否則不識別
 */

//新建的類繼承于BaseComponent
export default  class index extends BaseComponent {
    static navigationOptions = {title:'Example'};
    //狀態(tài)欄配置复罐。BaseComponent會讀取,涉及到樣式配置全都寫在view.js里
    statusBarConfig = {
        contentType: "light-content",
        androidTranslucent: false,
        androidBarBackgroundColor: 'red', //狀態(tài)欄背景顏色
        hidden: false, //是否隱藏狀態(tài)欄
    };;

    _onBackButtonPressAndroid = () => {
        //當return true時涝登,會阻止默認的返回事件,false時則會響應
        alert("Back On Press");
        return true;
    };

    //新的生命周期寫法
    BaseComponentDidMount = () => {
    };
    BaseComponentWillUnmount = () => {};


    BaseRender = () => {
        return (
            <View style={{ flex: 1 }}>
              <MainView />
            </View>
        );
    };
}

這樣。我們就把上面的結(jié)構問題封裝到基類中了效诅。如果用別的常用配置也可以自己再添加在基類里缀拭。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市填帽,隨后出現(xiàn)的幾起案子蛛淋,更是在濱河造成了極大的恐慌,老刑警劉巖篡腌,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐荷,死亡現(xiàn)場離奇詭異,居然都是意外死亡嘹悼,警方通過查閱死者的電腦和手機叛甫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門层宫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人其监,你說我怎么就攤上這事萌腿。” “怎么了抖苦?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵毁菱,是天一觀的道長。 經(jīng)常有香客問我锌历,道長贮庞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任究西,我火速辦了婚禮窗慎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卤材。我一直安慰自己遮斥,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布扇丛。 她就那樣靜靜地躺著术吗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晕拆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天材蹬,我揣著相機與錄音实幕,去河邊找鬼。 笑死堤器,一個胖子當著我的面吹牛昆庇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闸溃,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼整吆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辉川?” 一聲冷哼從身側(cè)響起表蝙,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乓旗,沒想到半個月后府蛇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡屿愚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年汇跨,在試婚紗的時候發(fā)現(xiàn)自己被綠了务荆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡穷遂,死狀恐怖函匕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚪黑,我是刑警寧澤盅惜,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站祠锣,受9級特大地震影響酷窥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伴网,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一蓬推、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澡腾,春花似錦沸伏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至澜公,卻和暖如春姆另,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坟乾。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工迹辐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甚侣。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓明吩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親殷费。 傳聞我的和親對象是個殘疾皇子印荔,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,093評論 1 32
  • 在一個方法內(nèi)部定義的變量都存儲在棧中,當這個函數(shù)運行結(jié)束后详羡,其對應的棧就會被回收仍律,此時,在其方法體中定義的變量將不...
    Y了個J閱讀 4,413評論 1 14
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫实柠、插件染苛、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 校區(qū):科學創(chuàng)想樂高機器人茂業(yè)校區(qū) ?班級: 【周六下午12:10--1:10。學員:劉穆澤,張圣群茶行,王梓圖躯概,吳皓森...
    A越單純越幸福閱讀 710評論 0 0
  • 這幾天練字群里人頭攢動娶靡,學員拋出的問題層出不窮,像大海里那些泡沫一樣看锉,層層疊疊姿锭,大大小小,一堆堆伯铣,一簇簇呻此。蔚為壯觀...
    蝶化文瀾閱讀 428評論 1 2