React Native框架探索學習筆記

現(xiàn)在React Native已經(jīng)到了0.60+,而且0.60+是一個比較大的升級搜囱,有時間把這個項目升級一下

前言

如果是復雜項目能不用React Native就不用丑瞧,請三思! 最近公司開始重寫我們歷史悠久的iOS應用。由于iOS和安卓都是N手項目蜀肘,所以重寫绊汹。前端技術選擇了React Native。雖然我之前用React Native開發(fā)過扮宠,但是是和原生混編西乖。對于搭建一個React Native并不是特別熟悉狐榔。經(jīng)過幾天的摸索自認為弄出來個還算不太差的框架,分享出來大家一起學習获雕。只說實戰(zhàn)薄腻,沒有原理分析。這是代碼地址DLReactNativeArchitecture沒有Demo的都是流氓届案。

內(nèi)容結構

  • JavaScript代碼檢測
    • ESlint在VS Code下的配置
  • 頁面管理
    • 底部導航
    • 頁面導航
    • 切換導航
  • 數(shù)據(jù)管理
    • 全局數(shù)據(jù)管理
    • 網(wǎng)絡請求錯誤管理

JavaScript代碼檢測

我個人認為這個應該是React Native開發(fā)的標配了庵楷。從我個人開發(fā)來看,在寫頁面的時候經(jīng)常忘記引用組件楣颠,這個時候并不會有提示尽纽,當你運行了項目模擬器才會告訴你錯誤,必須回去修改代碼童漩,再次運行弄贿,降低了開發(fā)效率。在代碼編寫的時候就提示書寫錯誤顯得非常重要矫膨。

ESlint在VS Code下的配置
eslint.png
  • 在VS Code下載ESlint插件
  • npm i eslint-config-rallycoding babel-eslint --save-dev
  • 在項目根目錄創(chuàng)建.eslintrc拷貝下方配置(在rules中自行配置)
{
    "extends": "eslint-config-rallycoding",
    "parser": "babel-eslint",
    "rules": {
        "semi": 0    
    }
}

頁面管理

用React Native開發(fā)差凹,如果想實現(xiàn)像iOS原生UITabBarControllerUINavigationController對頁面的導航管理,只能用TabBarIOSNavigatorIOS侧馅,但是這兩個組件都不支持Android(天殺的安卓)危尿。官網(wǎng)推薦了使用react-native-navigationreact-navigation,我在自己的項目中選擇了react-navigation施禾,因為?更多脚线。(寫著寫著發(fā)現(xiàn)react-navigation3.0出來了)

底部導航
tabbar_navigator.png
// 在routes文件中
import {
    createBottomTabNavigator,
    createAppContainer
} from 'react-navigation'

import HomePage from '../pages/Home'
import MessagePage from '../pages/Message'
import ProfilePage from '../pages/Profile'

import styles from '../styles'

function _renderTabbarIcon(icon) {
    return <Image source={icon} style={styles.tabBarIcon} />
}

const tabarIcons = {
    Home: {
        render: focused => {
            return focused
                ? _renderTabbarIcon(require('../images/tabbar_home_selected.png'))
                : _renderTabbarIcon(require('../images/tabbar_home.png'))
        }
    }
}

const tabBarStack = createBottomTabNavigator({
    Home: {
        screen: HomePage,
        navigationOptions: {
            tabBarLabel: '首頁'
        }   
    },
    Message: {
        screen: MessagePage,
        navigationOptions: {
            tabBarLabel: '信息'
        }
    },
    Profile: {
        screen: ProfilePage,
        navigationOptions: {
            tabBarLabel: '我的'
        }
    }
}, {
    defaultNavigationOptions: ({ navigation }) => ({
        tabBarIcon: ({ focused }) => {
            const { routeName } = navigation.state
            return tabarIcons[routeName].render(focused)
        }
    }),
    tabBarOptions: {
        activeTintColor: '#6699ff',
        inactiveTintColor: '#333'
    }
})

export default createAppContainer(tabBarStack)

// 在App.js文件中
import TabbarStack from './src/routes'

export default class App extends Component {
    render() {
        return <TabbarStack />
    }
}
頁面導航

home_detail.png

home_detail_hide_tabbar.png

第一張圖是從Home頁面跳轉到Home Detail頁面不隱藏Tabbar,第二張則是隱藏Tabbar弥搞。在代碼中我會使用~注意~來提示邮绿。寫注意的地方都大家可以多注意一下^^,不太通順攀例!

// 在routes文件中
const HomeStack = createStackNavigator({
    Home: {
       screen: HomePage,
       navigationOptions: {
           title: '首頁'
       }
    },
    HomeDetail: {
       screen: HomeDetailPage,
       navigationOptions: {
           title: '詳情'
       } 
    }
}, {
    navigationOptions: {
        headerStyle: {
            backgroundColor: "#fff",
            borderBottomWidth: 0
        },
        headerTintColor: "#333",
        headerBackTitle: null         // ~注意~ 這個地方是隱藏返回按鈕文字的
    }
})

HomeStack.navigationOptions = ({ navigation }) => {  // ~注意~ 如果想實現(xiàn)隱藏Tabbar的功能要調(diào)用這個方法
    let tabBarVisible = true
    if (navigation.state.index > 0) {
        tabBarVisible = false
    }
    return {
        tabBarVisible
    }
}
const TabBarStack = createBottomTabNavigator({
    Home: {
        screen: HomeStack,
        navigationOptions: {
            tabBarLabel: '首頁'
        }   
    }
})
切換導航

這個主要是用于APP廣告頁面到Tabbar導航的跳轉船逮,或者是登錄頁面到Tabbar導航的跳轉。

switch_navigator.png
// 在routes文件中
const switchStack = createSwitchNavigator({
    Launch: {
        screen: LaunchPage,
        navigationOptions: {
            header: null
        }
    },
    Tabbar: {
        screen: TabBarStack
    }
}, {
    initialRouteName: 'Launch'
})

export default createAppContainer(switchStack)

數(shù)據(jù)管理

在數(shù)據(jù)管理中我使用了react-redux, axios, redux-axios-middleware以及react-native-dropdownalert粤铭。因為涉及的文件較多挖胃,不一一列舉。其中我想說幾點梆惯,一個用戶private_token的添加酱鸭,還有就是用axios進行網(wǎng)絡請求的時候GET和POST添加參數(shù)的區(qū)別。

全局數(shù)據(jù)管理
fetch_data.png
// 在store/reducers/message.js文件
export default function reducer(state = initialState, action) {
    switch (action.type) {
        case FETCH_MESSAGE_LIST: 
            return {
                ...state,
                loading: true,
                list: [],
            }
        case FETCH_MESSAGE_LIST_SUCCESS:
            return {
                ...state,
                loading: false,
                list: action.payload.data.items
            }
        case FETCH_MESSAGE_LIST_FAIL:
            return {
                ...state,
                loading: false,
                error: action.error.message
            }
        case REMOVE_MESSAGE_WITH_ID: {
            const { itemId } = action.payload
            return {
                ...state,
                list: state.list.filter(l => l.id !== itemId)
            }
        }
        default: 
            return state
    }
}
全局錯誤管理

在這個配置中要注意的就是垛吗,user_token的添加凹髓。因為AsyncStorage.getItem是異步方法,所以success也要變成異步方法怯屉。

// App.js文件中
const middlewareConfig = {
    interceptors: {
        request: [
            {
                success: async function (_, req) {
                    // const token = await AsyncStorage.getItem('user_token')
                    const newReq = {
                        ...req,
                        headers: {
                            ...req.headers,
                            common: {
                                ...req.headers.common,
                                // Authorization: token
                            },
                        }
                    }
                    return newReq
                }
            }
        ],
        response: [
            {
                success: function (_, res) {
                    return res
                },
                error: function (_, error) {
                    DropDownHolder.getDropDown().alertWithType('error', 'Error', error.message)
                    return Promise.reject(error)
                }
            }
        ]
    }
}

最后

更多詳細的代碼大家可以看源碼DLReactNativeArchitecture蔚舀。不知道這個對大家有沒有幫助饵沧,本人水平有限。寫文章條理也不是太清晰赌躺,還有些名字寫得也不是特別合適狼牺。如果大家對代碼,對文章有什么問題礼患,建議可以在評論留言是钥。大家一起學習,一起進步缅叠。

持續(xù)更新中

在開發(fā)中有遇到新的問題咏瑟。等項目差不多了,繼續(xù)更新痪署!

使用感受
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市兄旬,隨后出現(xiàn)的幾起案子狼犯,更是在濱河造成了極大的恐慌,老刑警劉巖领铐,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悯森,死亡現(xiàn)場離奇詭異,居然都是意外死亡绪撵,警方通過查閱死者的電腦和手機瓢姻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來音诈,“玉大人幻碱,你說我怎么就攤上這事∠附Γ” “怎么了褥傍?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喇聊。 經(jīng)常有香客問我恍风,道長,這世上最難降的妖魔是什么誓篱? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任朋贬,我火速辦了婚禮,結果婚禮上窜骄,老公的妹妹穿的比我還像新娘锦募。我一直安慰自己,他們只是感情好啊研,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布御滩。 她就那樣靜靜地躺著鸥拧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪削解。 梳的紋絲不亂的頭發(fā)上富弦,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音氛驮,去河邊找鬼腕柜。 笑死,一個胖子當著我的面吹牛矫废,可吹牛的內(nèi)容都是我干的盏缤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蓖扑,長吁一口氣:“原來是場噩夢啊……” “哼唉铜!你這毒婦竟也來了?” 一聲冷哼從身側響起律杠,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蕊苗,失蹤者是張志新(化名)和其女友劉穎刷后,沒想到半個月后倔丈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郊酒,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年嗓奢,在試婚紗的時候發(fā)現(xiàn)自己被綠了讼撒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡股耽,死狀恐怖根盒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情物蝙,我是刑警寧澤郑象,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站茬末,受9級特大地震影響厂榛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜丽惭,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一击奶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧责掏,春花似錦柜砾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽证芭。三九已至,卻和暖如春担映,著一層夾襖步出監(jiān)牢的瞬間废士,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工蝇完, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留官硝,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓短蜕,卻偏偏與公主長得像氢架,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子朋魔,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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