react-native生命週期改造
參考Native的宣告週期,你會發現RN缺少生命週期Hook--進入和離開。
你會發現除了第一次載入,我們沒有辦法再獲取它進入頁面的時機,離開就壓根沒有...
基於HOC和react-native-router-flux庫改造RN生命週期。
參考文章
custom-lifecycle-methods-in-react-native
React高階元件(HOC)模型理論與實踐
react-native-router-flux
廢話少說,直接上程式碼
生命週期Wrapper
import { AppState } from 'react-native';
import React, { Component } from 'react';
export function withWrappedComponent(WrappedComponent) {
let componentInstance = null;
let activeStatus = false;
function componentWillAppear() {
if(componentInstance && componentInstance.componentWillAppear && !activeStatus) {
componentInstance.componentWillAppear()
}
activeStatus = true;
}
function componentWillDisappear() {
if(componentInstance && componentInstance.componentWillDisappear && activeStatus) {
componentInstance.componentWillDisappear();
}
activeStatus = false;
}
return class WrapperComponent extends Component {
// 進入該元件時觸發,react-native-router-flux提供
static onEnter() {
componentWillAppear()
}
// 離開該元件時觸發,react-native-router-flux提供
static onExit() {
componentWillDisappear();
}
constructor(props) {
super(props);
activeStatus = true;
// 監聽RN例項狀態改變
// 1. 切換到Native的頁面
// 2. APP前後臺切換(Home按鈕)
AppState.addEventListener('change', this._handleAppStateChange);
}
_handleAppStateChange = (nextAppState) => {
if (nextAppState === 'active') {
componentWillAppear()
} else {
componentWillDisappear();
}
}
componentDidMount() {
}
componentWillUnmount() {
AppState.removeEventListener('change', this._handleAppStateChange);
// componentInstance = null;
activeStatus = false;
}
handleInstance(c) {
Boolean(c) && (componentInstance = c);
}
render() {
return <WrappedComponent ref={ c => this.handleInstance(c)} {...this.props}/>
}
}
}
使用方式
前置條件
主專案根目錄下執行
npm i --save-dev babel-plugin-transform-decorators-legacy
-
建立.babelrc檔案,內容如下:
{ "presets": ["react-native"], "plugins": ["transform-decorators-legacy"] }
使用方法
import { withWrappedComponent } from 'xxx'
@withWrappedComponent
export class Home extends Component {
componentWillAppear() {
console.log("xxxxxxxxxxxx home componentWillAppear");
}
componentWillDisappear() {
console.log("xxxxxxxxxxxx home componentWillDisappear");
}
}
componentWillAppear在第二次進入該頁面/從後臺進入前臺觸發
componentWillDisappear在離開頁面時觸發/從前臺進入後臺觸發
相關文章
- 生命週期
- View生命週期與Activity生命週期的關係View
- vue - 生命週期Vue
- Fragment生命週期Fragment
- vue生命週期Vue
- spring生命週期Spring
- ubuntu生命週期Ubuntu
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session
- PHP 生命週期PHP
- maven生命週期Maven
- Activity生命週期
- React生命週期React
- Salesforce 生命週期管理(一)應用生命週期淺談Salesforce
- vue 生命週期梳理Vue
- java servlet 生命週期JavaServlet
- Android Activity生命週期Android
- Activity生命週期onDestroy
- React-生命週期React
- IOC與生命週期
- vue 生命週期深入Vue
- React元件生命週期React元件
- JPA概述、生命週期
- viewController的生命週期ViewController
- Servlet的生命週期Servlet
- Tomcat生命週期管理Tomcat
- React 元件生命週期React元件
- maven-生命週期Maven
- UIViewController的生命週期UIViewController
- Flutter -- Element生命週期Flutter
- Flutter 的生命週期Flutter
- Spring的生命週期Spring
- Spring Bean 生命週期SpringBean
- bean的生命週期Bean
- IOC - bean 生命週期Bean
- UIAbility元件生命週期UI元件
- MySQL GTID生命週期MySql
- Bean-生命週期Bean