1. 程式人生 > >react-navigation使用技巧(進階篇)

react-navigation使用技巧(進階篇)

轉子http://www.jianshu.com/p/b877115fff1b

之前寫過react-navigation使用技巧,那篇文章中主要講了react-navigation的屬性,封裝和一些小技巧。雖然上篇文章中也有一些小技巧,但因為補充的比較晚,導致有些人沒有看全,再加上我又找到了一些新的小玩意,特此寫了本篇文章,如果之後還有新發現,也會再這篇文章中更新出來。

如果遇到什麼問題可以在評論區回覆,或者加QQ群397885169詢問

1、讓TabBar擁有點選事件

感謝群友再遇見的分享。

官方的api裡面是沒有提供tabBar的點選事件的,但在開發中經常需要監聽tabBar的點選事件,解決這個問題的一種方法就是去修改原始碼,另一種是監聽onTransitionEnd

。(第二種方法這裡先不討論)

原始碼中一共需要修改8處地方,包含3個js檔案。原始碼在下面。

1、react-navigation目錄下src/views/TabView/TabBarBottom.js


TabBarBottom.png

2、react-navigation目錄下src/views/TabView/TabBarTop.js


TabBarTop.png

3、react-navigation目錄下src/views/TabView/TabView.js


TabView.png

注意:第111行中的getScreenConfig需要手動改成getScreenOptions,要不然修改完原始碼會報錯。

原始碼在這裡,要注意修改getScreenOptions

修改原始碼之後,在頁面中這麼用:

static navigationOptions = ({navigation,screenProps}) => ({
    onTabPress:(()=>{
        alert('Home');
    })
});

2、修改頁面的跳轉動畫

在上一篇文章中,說了怎麼將安卓的跳轉動畫改成iOS那樣的,但其實react-navigation一共提供了4種跳轉動畫:
1、從右向左: forHorizontal
2、從下向上: forVertical
3、安卓那種的從下向上: forFadeFromBottomAndroid


4、無動畫: forInitial

但因為庫的限制,想實現某些頁面使用某種動畫還是很難的,只能通過Demo中提供的笨方法來實現。

首先還是匯入react-navigation中的方法

import CardStackStyleInterpolator from 'react-navigation/src/views/CardStackStyleInterpolator';

如果要改變跳轉動畫只能在StackNavigator中實現transitionConfig方法

const MainStack = StackNavigator({
    Main:{
        screen:Main,
    },
},{
    // mode:'modal',
    headerMode: 'screen',
    transitionConfig:()=>({
     // 只要修改最後的forVertical就可以實現不同的動畫了。
      screenInterpolator:CardStackStyleInterpolator.forVertical,
    })
});

3、在Reset方法中傳參

react-navigation中的reset方法,應該都不陌生吧,重置路由。但有的需求是在登陸之後,重置路由並傳遞引數到某個頁面,之前一直以為不可以,直到群友的react-native reset方法中傳參的寫法的這篇文章出現,感謝群友nextChampion的貢獻。

const resetAction = NavigationActions.reset({
    index: 0,
    actions: [
    NavigationActions.navigate({routeName: 'Home', params: { token: '123456' }})
    ]
})

this.props.navigation.dispatch(resetAction);

在頁面中可以通過如下方法得到引數。

this.props.navigation.state.params.token

4、goBack返回指定頁面

在上篇文章中也有這個技巧,這裡是總結重發。

react-navigation目錄下src/routers/StackRouter.js

if (action.type === NavigationActions.BACK) {
    let backRouteIndex = null;
    if (action.key) {

      const backRoute = state.routes.find(
        /* $FlowFixMe */
        /* 修改原始碼 */
        route => route.routeName === action.key
        /* (route: *) => route.key === action.key */
      );
      /* $FlowFixMe */
      console.log('backRoute =====',backRoute);
      backRouteIndex = state.routes.indexOf(backRoute);
      console.log('backRoute =====',backRouteIndex);
    }
    if (backRouteIndex == null) {
      return StateUtils.pop(state);
    }
    if (backRouteIndex >= 0) {
      return {
        ...state,
        routes: state.routes.slice(0, backRouteIndex+1),
        index: backRouteIndex - 1 + 1,
      };
    }
  }

注意:這樣的修改原始碼之後,如果專案中使用Redux,並且啟用了滑動返回,很會很大機率導致app卡死,所以並不太推薦這種方式,最好使用下面的方式

5、react-navigation整合Redux

可能會有人認為這樣整合會麻煩,而且react-navigation內部實現也是類似Redux的高階函式。我之前也是這麼認為的,直到在識兔中,使用 Redux 修改首頁圖片之後 滑動返回 會導致app卡死。

react-navigation整合Redux之後,能獲取當前screenkeyrouteNmae等引數,goBack()的時候就可以直接取到key,而不用修改原始碼啦!

如果看不懂下面的修改步驟,可以先看下之前的文章Redux "使用"教程

整合

1、新增addNavigationHelpers

import {
    StackNavigator,
    TabNavigator,
    addNavigationHelpers
} from 'react-navigation';

2、首先修改識兔中的App.js的匯出方式

const AppWithNavigationState = ({ dispatch, nav }) => (
    <MyApp navigation={addNavigationHelpers({ dispatch, state: nav })}/>
);

const mapStateToProps = state => ({
    nav: state.nav,
});

export default connect(mapStateToProps)(AppWithNavigationState);

3、建立StackReducer

// MyApp 是在App.js中匯出的
import { MyApp } from '../APP';


export default function StackReducer(state , action) {
    let nextState;
    switch (action.type) {
        default:
            nextState = MyApp.router.getStateForAction(action, state);
            break;
    }
    return nextState || state;
}

4、修改rootReducer

import nav from './StackReducer';

const RootReducer = combineReducers({
    ...,
    nav,
});

export default RootReducer;

使用

1、修改ShiTu.js

export default connect((state) => {
    ...
    const routes  = state.nav.routes;
    return {
        ...
        routes
    };
},{...})(ShiTu)

2、使用

const {routes} = this.props;
// 會有意想不到的驚喜哦!
console.log(routes);

感謝群友Roc的提供的react-navigation整合redux的 腳手架 可以通過它快速實現整合Redux

6、安卓返回鍵在react-navigation中的正常監聽

之前使用Navigator的時候,可以通過下面的方法實現監聽安卓的返回鍵,但使用了react-navigation後,會很迷茫,不知該怎麼監聽了。

解決辦法:整合Redux咯!

相關推薦

react-navigation使用技巧()

轉子http://www.jianshu.com/p/b877115fff1b 之前寫過react-navigation使用技巧,那篇文章中主要講了react-navigation的屬性,封裝和一些小技巧。雖然上篇文章中也有一些小技巧,但因為補充的比較晚,導致有些人沒有看全,再加上我又找到了一些新的小玩意,

React Native未來導航者:react-navigation 使用詳解(

剛建立的React Native 微信公眾號,歡迎微信掃描關注訂閱號,每天定期會分享react native 技術文章,移動技術乾貨,精彩文章技術推送。同時可以掃描我的微信加入react-native技術交流微信群。歡迎各位大牛,React Native技術愛好者加入交流!

React學習筆記之react(1)

ava 不能 success 字符 style 使用 -s 布爾 一次 1.組件的state(狀態) 1.選擇合適的state   state所代表的一個組件UI呈現的完整狀態集又可以分成兩類數據:用作渲染組件時使用到的數據的來源以及用作組件UI展現形式的判斷依據。 示

React學習筆記之react(2)

-s state ops category strong tro 服務 ive 周期 2.組件與服務器通信   組件的生命周期分為三個階段:掛載階段->更新階段->卸載階段,本文主要集中講述掛載和更新階段組件如何和服務器進行通信。 1.組件掛載階段通信  

React-router

路由進階 1.多級路由,和之前的思想一樣,在子路由裡面繼續寫Route,繼續掛載元件,就可以實現多級路由 比如這樣:class Food extends Component{ render() {

JS--JS陣列reduce()方法詳解及高階技巧

去除巢狀的思路: 用遞迴、reduce()、concat()來實現。 遞迴解決多層巢狀,reduce()解決每層陣列的迭代拼接,concat()來拼接陣列即拆除一層巢狀。 let sum = [0, 1, 2, 3].reduce(function(acc, val)

React(1) -- react-router4模組化

本篇內容: 單一的路由無巢狀 多層巢狀路由 獲取路徑中的引數 按需載入 單一的路由無巢狀 routers.js import Home from 'components/Home'; import News from 'components/News'; import

React(2) -- Redux

前言 如果還不知道為什麼要使用Redux,說明你暫時還不需要它。 三大原則 單一資料來源 整個應用的 state 被儲存在一棵 object tree 中,並且這個 object tree 只存在於唯一一個 store 中。 State 是隻讀的 唯一改變 state 的方法就是觸發 action

用python寫爬蟲的一些技巧

以前寫過一篇使用python爬蟲抓站的一些技巧總結,總結了諸多爬蟲使用的方法;那篇東東現在看來還是挺有用的,但是當時很菜(現在也菜,但是比那時進步了不少),很多東西都不是很優,屬於”只是能用”這麼個層次。這篇進階篇打算把“能用”提升到“用得省事省心”這個層次

1Python強化訓練之裝飾器使用技巧

黃金分割 解決方案 return 技巧 原函數 Python進階強化訓練之裝飾器使用技巧進階如何使用函數裝飾器?實際案例某些時候我們想為多個函數,統一添加某種功能,比如記時統計、記錄日誌、緩存運算結果等等。我們不想在每個函數內一一添加完全相同的代碼,有什麽好的解決方案呢?解決方案定義裝飾奇

Mysql 入門,增刪改查(

bsp com pre sco height name 數據 mysql from 主要已以下兩個表students與students_score,進行數據的增刪改查操作! 1、SELECT 1)select id,tel from students

freenas的CIFS/SMB的使用(

img 大小 ifs 退出 freenas 什麽 數據 用戶名 鏡像 這裏是對freenas的進一步使用,關於freenas的介紹與安裝請查看上一篇隨筆:http://www.cnblogs.com/hjc4025/p/7079364.html 我們先來看一下如何使用fre

SQL Server調優系列(如何索引調優)

.cn 技術 spa 磁盤 clear 高頻 思路 ltp 覆蓋範圍 前言 上一篇我們分析了數據庫中的統計信息的作用,我們已經了解了數據庫如何通過統計信息來掌控數據庫中各個表的內容分布。不清楚的童鞋可以點擊參考。 作為調優系列的文章,數據庫的索引肯定

SOD開源框架MSF(消息服務框架)

brush pan mtime 初始 函數 啟動 services method quest 復習:在上一篇我介紹了MSF的基本訂閱,模式就是,客戶端A,訂閱服務器。客戶端B,訂閱服務器。通過服務器廣播消息, 所有訂閱過的客戶端都能接到消息。 進階:在上

Python---面向對象第三彈(

python對象 one iss pri each super left connect ext  Python對象中一些方法 一、__str__ class Teacher: def __init__(self,name,age): self.name

Vue學習筆記——多元素及多組件過渡

之前 bsp lan ssa 當前 好的 can cancel 簽名 本文為轉載,原文:Vue學習筆記進階篇——多元素及多組件過渡 多元素的過渡 對於原生標簽可以使用 v-if/v-else.但是有一點需要註意: 當有相同標簽名的元素切換時,需要通過 key 特性設置唯一

Vue學習筆記——Render函數

resp targe 無效 數據 iso 簡潔 如果 som cimage 本文為轉載,原文:Vue學習筆記進階篇——Render函數 基礎 Vue 推薦在絕大多數情況下使用 template 來創建你的 HTML。然而在一些場景中,你真的需要 JavaScript 的完全

Vue學習筆記——過渡狀態

節點 val start 學習筆記 update 設置 hub reat res 本文為轉載,原文:Vue學習筆記進階篇——過渡狀態Vue 的過渡系統提供了非常多簡單的方法設置進入、離開和列表的動效。那麽對於數據元素本身的動效呢,比如: 數字和運算 顏色的顯示 SVG 節

Vue學習筆記——列表過渡及其他

absolut compute top sla 做的 有一個 .cn -s cas 本文為轉載,原文:Vue學習筆記進階篇——列表過渡及其他本文將介紹Vue中的列表過渡,動態過渡, 以及可復用過渡是實現。 列表過渡 目前為止,關於過渡我們已經講到: 單個節點 同一時間渲染

教你徹底學會動態規劃——

ret 簡單 aik 原理 初始 cin while iostream urn 在我的上一篇文章中已經詳細講解了動態規劃的原理和如何使用動態規劃解題。本篇文章,我將繼續通過例子來讓大家更加熟練地使用動態規劃算法。 話不多說,來看如下例題,也是在動態規劃裏面遇