react Native知識點(diǎn)串聯(lián)

本文參考廣州蘆葦科技App的文章,結(jié)合自己觀點(diǎn)記錄嗦锐;

在開發(fā)移動(dòng)應(yīng)用時(shí)橄霉,我們可以選擇使用原生窃爷,純基于 Web 或使用混合方法(即使用原生和基于 Web 的技術(shù)的組合)⌒辗洌可以使用 Apache Cordova(或 Adobe PhoneGap)等開源平臺編寫 HTML按厘,CSS 和 JavaScript 的跨平臺混合應(yīng)用。這些應(yīng)用在原生 Web 視圖(瀏覽器)中運(yùn)行钱慢,所以看著就像 Web 應(yīng)用逮京,不過可以使用 JavaScript 和一些 Apache Cordova 插件調(diào)用原生功能和 API。所以可以使用類似于 Web 應(yīng)用而非原生應(yīng)用的用戶界面上架到 Apple Store 或 Google Play 的應(yīng)用束莫±撩蓿或者,可以使用 C#览绿,XAML 和 CSS 使用 Xamarin 來編寫原生應(yīng)用策严。對于用 HTML5,CSS 和 JavaScript 編寫的非原生移動(dòng) Web 應(yīng)用饿敲,還可以配套使用 jQuery Mobile 等框架妻导。

React Native 采用不同的方法進(jìn)行混合移動(dòng)應(yīng)用開發(fā)。它不會(huì)生成原生 UI 組件怀各,而是基于 React倔韭,React Native 是一個(gè)用于構(gòu)建基于 Web 的交互界面的 JavaScript 庫,因此會(huì)有更豐富的 UI 體驗(yàn)效果瓢对,同時(shí)也能夠很好地調(diào)用底層框架的UI使用狐肢。 React Native 已經(jīng)成為一種流行的移動(dòng)開發(fā)技術(shù),它提供了一個(gè)使用 JavaScript 構(gòu)建原生跨平臺移動(dòng)應(yīng)用的強(qiáng)大框架沥曹,在需要時(shí),我們也可以使用 Objective-C碟联,Swift或 Java 來編寫原生代碼來橋接妓美。

使用 React Native 有利有弊。從積極的方面來說鲤孵,React Native 已經(jīng)成為受支持的開源社區(qū)的熱門壶栋,可以使用一組技術(shù)(如 JSX,React Native 組件和 JavaScript)為 iOS 和 Android 構(gòu)建移動(dòng)應(yīng)用普监。這反過來有助于在發(fā)布新版本時(shí)使 iOS 和 Android 應(yīng)用保持同步贵试。但是琉兜,React Native 仍在不斷發(fā)展,當(dāng)要在當(dāng)前不需要 React Native 提供的功能(例如如何進(jìn)行UI導(dǎo)航或使用地圖)時(shí)決定使用哪些庫時(shí)毙玻,可能會(huì)造成混淆豌蟋。此外,根據(jù)應(yīng)用的復(fù)雜程度桑滩,可能需要編寫區(qū)別于平臺的代碼來解決移動(dòng)平臺的差異梧疲。對于復(fù)雜的應(yīng)用,可能要編寫自定義組件或深入了解 iOS 和 Android(例如运准,出于性能原因或?qū)?React Native 添加到現(xiàn)有原生應(yīng)用時(shí)所需的但不支持的UI組件)幌氮。

配置 React Native 環(huán)境

React Native 的核心語言是 JavaScript,特別是 ECMAScript 6(ES6)胁澳。因此该互,需要熟悉ES6的一些最新功能。此外韭畸,在開始開發(fā)第一個(gè) React Native 應(yīng)用之前宇智,需要安裝必備的工具,比如 IDE陆盘,JavaScript 庫等普筹。另外,還需要了解核心的 React Native API隘马。

ECMAScript 6 功能

ES6 引入了許多改進(jìn)太防,其中一些值得一提,因?yàn)樗鼈冊谧钚碌?React Native 框架中已經(jīng)被用到:

  • 變量和作用域:關(guān)鍵字 var酸员,let 和 const 表示變量作用域蜒车,其中 var 是函數(shù)作用域,let 是塊作用域幔嗦,const 也是塊作用域酿愧。 const 變量是常量,但在 JavaScript 中對于對象和數(shù)組來說邀泉,它是可變的嬉挡。解釋器將變量聲明提升或移動(dòng)到var 聲明的作用域頂部,而 let 和 const 聲明不會(huì)被掛起汇恤。
  • 箭頭函數(shù):一種新類型的函數(shù)庞钢,它允許更緊湊,更簡潔的表示法因谎,并且具有靜態(tài)或詞匯的定義(它不會(huì)在詞法上圍繞它)基括。可以看以下這些示例财岔。

沒有指定參數(shù)的箭頭函數(shù):

() => { ... }

帶一個(gè)參數(shù)风皿,注意省略了的括號:

x => { ... }

指定幾個(gè)參數(shù):

(x, y) => {* 
...
}

參數(shù)定義和箭頭函數(shù)的箭頭必須在同一行中河爹。

  • Promises:Promises 是異步編程的替代API,它提供了優(yōu)于傳統(tǒng)回調(diào)(如鏈接和并行執(zhí)行)的優(yōu)勢桐款。
  function myAsyncFunc() {
    return new Promise(
    function (resolve, reject) {
          :
    resolve(result);
           :
           if (error) {
                reject(error);
           }
    });
  }

比較以前的異步函數(shù):

myAsyncFunc().then(result =\> { ··· }).catch(error =\> { ··· });

這只是新功能的一個(gè)示例咸这,但還有許多其他功能。關(guān)于ES6的一個(gè)很好的在線參考是 Axel Rauschmayer 的 Exploring ES6鲁僚。

接下來炊苫,我們來看看如何設(shè)置開發(fā)平臺和環(huán)境。

設(shè)置環(huán)境和工程

目前來看冰沙,開發(fā) iOS 原生應(yīng)用只能用 macOS 系統(tǒng)侨艾。由于大多數(shù)移動(dòng)應(yīng)用都會(huì)涉及到 Android 和 iOS兩端,因此應(yīng)該考慮使用 Mac 來開發(fā) React Native 移動(dòng)應(yīng)用拓挥。

在創(chuàng)建項(xiàng)目之前唠梨,你需要安裝一堆東西,主要包括:

  • Android Studio和Xcode工具:安裝最新版本以構(gòu)建和發(fā)布應(yīng)用侥啤。對于 Android 開發(fā)当叭,確保為要運(yùn)行的Android API 版本配置正確的模擬器。

  • JavaScript IDE或文本編輯器:不需要使用 Xcode 或 Android Studio 來編寫 JavaScript 代碼盖灸,真正需要的只是一個(gè)文本編輯器蚁鳖。比如使用 Atom(由 GitHub 開發(fā)),Sublime Text 或喜歡的任何優(yōu)秀文本編輯器赁炎,筆者目前用的是 VSC醉箕。

  • JavaScript 或 React Native 包:安裝一些工具來管理 React Native 軟件包以及三方庫,包括:

    • 從 nodejs.org 下載 node.js:為了讓JavaScript 運(yùn)行時(shí)允許訪問npm徙垫,這是一個(gè)由 node.js 項(xiàng)目創(chuàng)建的便捷工具讥裤,可用于管理開源軟件包。確保下載 node.js 的最新 LTS(長期支持)版本姻报。此下載中還包括一個(gè)名 為 Metro bundler 的開發(fā)服務(wù)器己英,它在調(diào)試時(shí)能夠提供實(shí)時(shí)更新渲染。
    • 下載 create-react-native-app:可以使用此工具開始開發(fā)吴旋。它可以創(chuàng)建一個(gè)基礎(chǔ)項(xiàng)目损肛。使用 npm 來下載:

    sudo npm install -g create-react-native-app

    • 下載常用的第三方庫。 React Nativ 提供了很多基礎(chǔ)組件荣瑟,與原生 API 使用相比會(huì)更加簡單荧关。常規(guī)的移動(dòng)應(yīng)用使用可能包括有相機(jī),管理狀態(tài)褂傀,并具有導(dǎo)航,地圖加勤,圖標(biāo)和復(fù)選框仙辟。這都都可以從 React Native 社區(qū)獲取對用組件:

      • react-native-navigation
      • react-native-vector-icons
      • redux
      • React-native-maps

      此外同波,可以到React Native Elements獲取需要的其他UI組件元素。在開發(fā)一個(gè)完整功能的 app 時(shí)叠国,需要用到上面提到的 UI 組件丑孩。用這個(gè)方法來安裝以前的 packages :

      npm install _package-name_ --save

    • React Native Debugger:這是一個(gè)非常棒的調(diào)試器壹瘟,同時(shí)它還是一個(gè)獨(dú)立的應(yīng)用,里面能用到的工具包括 React Inspector 和 Redux DevTools。配置好環(huán)境后可以連接到應(yīng)用(注意:一次只能調(diào)適一個(gè)應(yīng)用)混蔼,可以很方便的實(shí)時(shí)查看 React Native 應(yīng)用的狀態(tài),調(diào)適必備工具,如圖所示:

image

現(xiàn)在几苍,來建立一個(gè)簡單應(yīng)用并運(yùn)行一下:

1.創(chuàng)建工程蚀浆。用以下語句來創(chuàng)建,指定創(chuàng)建的工程路徑香追,默認(rèn)創(chuàng)建在當(dāng)前路徑下:

create-react-native-app [APPNAME]

cd [APPNAME]

注意:這一步創(chuàng)建了一個(gè)沒有進(jìn)行任何配置的 React Native app 模板合瓢。在 GitHub 項(xiàng)目中閱讀有關(guān) create-react-native-app 的更多信息。

安裝完成后透典,可以使用 npm 執(zhí)行以下命令來運(yùn)行應(yīng)用:

  • npm start 運(yùn)行 app
  • npm run ios:跟 npm start 相似晴楔,這是用來運(yùn)行 iOS 應(yīng)用
  • npm run android:運(yùn)行 Android 應(yīng)用,如果需要運(yùn)行模擬器峭咒,需要提前打開模擬器
  • npm run eject:從當(dāng)前的 create-react-native 模式中彈出 app税弃,這樣就可以完全控制應(yīng)用構(gòu)建過程(筆者沒用過)

2.啟動(dòng) app。通過運(yùn)行 npm run android 和 npm run ios 在模擬器上運(yùn)行應(yīng)用凑队。這將在開發(fā)模式下啟動(dòng)應(yīng)用则果。同時(shí)還會(huì)啟動(dòng) Metro bundler,可以在修改代碼后實(shí)時(shí)更新應(yīng)用(在調(diào)試移動(dòng)應(yīng)用時(shí)這很棒)顽决。

如果運(yùn)行成功短条,會(huì)有這樣的提示:

image

React Native API 概述

我們簡單快速瀏覽一下 React Native API ,從 React 轉(zhuǎn)變過來的 React Native 才菠,它繼承了 JSX茸时,state,props 和組件生命周期的概念赋访。然后可都,它通過提供對原生UI組件和功能的支持來擴(kuò)展 React。這是通過導(dǎo)入 React 和 React Native 功能來實(shí)現(xiàn)的蚓耽,如清單1所示:

清單1.從 React 和 React Native 導(dǎo)入

import React, { Component } from **'react'**

import { View, ScrollView, StyleSheet } from **'react-native**'

導(dǎo)入后渠牲,我們就可以訪問 React Native 對應(yīng)的組件,這些組件支持我們所需的許多常用UI組件:

  • 基礎(chǔ)UI組件:如 View步悠,Text签杈,Image,TextInput,ScrollView 和 StyleSheet答姥。此外铣除,還提供了UI控件,如Button鹦付,Picker尚粘,Slider 和 Switch。
  • 列表:FlatList(用于呈現(xiàn)可滾動(dòng)列表)和 SectionList(類似于 FlatList 但用于分段列表)的列表
  • Android 專用組件:如 Android BackHandler敲长,DatePickerAndroid郎嫁,ToastAndroid。
  • iOS 專用組件:如 AlertIOS祈噪,ImagePickerIOS泽铛,NavitatorIOS,TabBarIOS钳降。
  • 通用組件:可以在 Components and APIs 上查詢所有的公共組件厚宰。

還有一點(diǎn)需要注意,React Native 還提供了很多原來不支持的功能遂填。比如使用地圖铲觉,甚至是圖標(biāo)和復(fù)選框。雖然底層操作系統(tǒng)支持吓坚,但 React Native 還是需要安裝第三方庫撵幽。也就是說,React Native(包括開發(fā)工具)所支持的任何復(fù)雜或不受支持的內(nèi)容都要求我們編寫其他代碼或使用第三方庫來承載礁击。

使用 React Native 構(gòu)建應(yīng)用

常規(guī)的的 React Native 應(yīng)用由許多組件組成盐杂,如圖所示:

image

在一個(gè)應(yīng)用容器中,每個(gè)界面會(huì)包含一個(gè)或多個(gè) View(和樣式)哆窿,界面跳轉(zhuǎn)導(dǎo)航链烈,狀態(tài)管理和數(shù)據(jù)模型。還有本地存儲(chǔ)和網(wǎng)絡(luò)請求功能挚躯。最后但并非最不重要的是强衡,有很多第三方庫可以擴(kuò)展應(yīng)用的功能。

以下介紹部分圖中內(nèi)容:

Screens: Views and styles

應(yīng)用容器中包含多個(gè) screen 和其他組件的集合码荔。應(yīng)用本身由許多 screen 組成漩勤,每個(gè) screen 包含多個(gè)視圖,如按鈕缩搅,文本輸入和列表越败。View 是構(gòu)建用戶界面的最基本組件,映射到 iOS 和 Android 的原生 View 組件硼瓣。

清單2是一個(gè)界面示例究飞,包含一個(gè)列表,使用 ScrollView 實(shí)現(xiàn),以及一個(gè)封裝在 Checkbox UI 組件中的任務(wù)列表:

# components/TaskList/TaskList.js

import React, { Component } from 'react'
import { View, ScrollView, StyleSheet } from 'react-native'
import { CheckBox } from 'react-native-elements'

import styles from './TaskListStyle;

export default class TaskList extends Component {

    renderTaskItem = (item, idx) => {

        return (
            <View style={styles.row}>
                <Checkbox
                    checked = {item.checked}
                    title = {item.text}
                    onPress = { () => onPressItem(item, idx) }
                />

            </View>
        );
    }

  render() {
    const {list} = this.props
    return (
        <ScrollView style={styles.container}>
            {list.map( this.renderTaskItem )}
        </ScrollView>
    )
  }
}

代碼中列表組件需要導(dǎo)入各種依賴項(xiàng)亿傅,包括 React Native 中未找到的第三方Checkbox UI組件霉祸,可以從 React Native Elements下載該組件。

在清單2中袱蜡,UI組件和樣式是分開的。我們可以創(chuàng)建更高級UI組件并與樣式隔離開慢宗。我們把所有組件放到一個(gè)子目錄中坪蚁,每個(gè)組件都有其 component.js 和 style.js 文件,如清單3所示:

./Components
+-TaskList
  +-TaskList.js
  +-TaskListStyle.js

或者镜沽,使用更通用的方法:

+-TaskList
  +-index.js
  +-style.js

清單4顯示了一個(gè)樣式文件的示例:

# components/TaskList/TaskListStyle.js

import { StyleSheet } from 'react-native';

// Define the styles
export default StyleSheet.create({
    container: {
        flex: 1,
        paddingLeft: 20,
      },

      row: {
        flex: 1,
        flexDirection: 'row',
        alignItems: 'flex-start',        
      },
});

樣式需要使用 StyleSheet 組件創(chuàng)建敏晤,它類似于 CSS 樣式表∶遘裕可以查看 individual UI component 獲取更多樣式屬性嘴脾。

自適應(yīng)布局

React Native 提供了一個(gè) Dimensions 組件來檢測屏幕尺寸:

import { Dimensions } from 'react-native';
var {height, width} = Dimensions.get('window');

Dimensions 可根據(jù)需要實(shí)時(shí)調(diào)整界面UI;例如,我們可以根據(jù)需要的應(yīng)用樣式蔬墩,在方向更改時(shí)調(diào)整UI译打,包括改變橫向與縱向方向的文本輸入字段的位置和長度。

另外我們還可能需要處理另一種情況的UI適配拇颅。比如需要實(shí)現(xiàn) Androi d或 iOS 特有的行為的情況奏司。包括與兩端系統(tǒng)相關(guān)的差異,例如UI控件的呈現(xiàn)及使用樟插。要解決此設(shè)計(jì)問題韵洋,我們需要使用不同的邏輯或樣式,或者在更復(fù)雜的情況下黄锤,實(shí)現(xiàn)自定義組件搪缨。因此 React Native 提供了不同的方法來檢測系統(tǒng),以便可以以編程方式?jīng)Q定要執(zhí)行的操作:使用 Platform 組件甚至使用特定于平臺的文件擴(kuò)展名鸵熟。

使用Platform 組件檢測系統(tǒng)會(huì)返回“ios”或“android”副编。例如:

import {Platform} from 'react-native';

if (Platform.OS === 'ios') {

}

if (Platform.OS === 'android') {

}

Platform 還提供 Platform.select 和 Platform.Version,分別用于檢測平臺和平臺版本旅赢。有關(guān)更多信息齿桃,請參閱平臺文檔。應(yīng)該僅對較小的更改使用 Platform.O S和 Platform.select煮盼。否則短纵,我們將使用大量硬編碼的 if 或 switch 語句,這會(huì)使寫的代碼更難以遵循僵控。

如果要編寫更復(fù)雜的代碼或組件香到,則應(yīng)使用特定于平臺的文件擴(kuò)展名。在這種方法中,使用每個(gè)平臺文件拆分代碼悠就。也就是說千绪,如果我們的代碼不能跨平臺公用,比如我們的任務(wù)列表梗脾,那么將編寫兩個(gè)文件荸型,一個(gè)用于 iOS,一個(gè)用于Android炸茧,然后讓 React Native 選擇對應(yīng)的文件:

./Components
+-TaskList
  +-TaskList.io.js
  +-TaskList.android.js
  +-TaskListStyle.ios.js
  +-TaskListStyle.android.js

然后瑞妇,讓React Native選擇正確的文件:

const TaskList = require('./Components/TaskList/TaskList);

本文未介紹 iOS 和 Android 之間究竟有什么不同,但要注意的事項(xiàng)包括渲染和常規(guī)組件或UI控件使用布局∷蠊冢現(xiàn)在辕狰,如果事實(shí)證明 Android 與 iOS 應(yīng)用的布局設(shè)計(jì)在主要方面有所不同,我們可以分別使用 index.ios.js 和 index.android.js 文件而不是 index.js 來控制主應(yīng)用控漠。這就可以完全控制不同平臺的應(yīng)用布局和流程蔓倍。為了最大限度地減少重復(fù)代碼,需要將其重新打包為可重用的程序盐捷。

導(dǎo)航

React Native 中的導(dǎo)航是一個(gè)具有挑戰(zhàn)性的領(lǐng)域偶翅,因?yàn)?React Native 提供的導(dǎo)航要么不夠強(qiáng)大,要么僅針對 iOS毙驯。相反倒堕,有大量社區(qū)項(xiàng)目試圖解決跨平臺導(dǎo)航問題,其中一些項(xiàng)目比其他項(xiàng)目更受歡迎爆价。這里只是重點(diǎn)闡述當(dāng)下流行的 React Native Navigation垦巴。

React Native Navigation 提供了一套非常完整的 API 來注冊界面組件,包括含有 tab 的應(yīng)用铭段,以及啟動(dòng)單個(gè)界面應(yīng)用骤宣。同時(shí)它還提供了其他 API 來管理模態(tài)跳轉(zhuǎn)和導(dǎo)航跳轉(zhuǎn),以及用于處理堆棧序愚,處理按鈕憔披,可見性以及自定義導(dǎo)航器本身的低級 API。

安裝最新穩(wěn)定版本的 react-native-navigation(運(yùn)行 npm install react-native-navigation --save)并按照其網(wǎng)站上的 Android 和 iOS 安裝說明進(jìn)行操作

另外必須通過調(diào)用 registerComponent()將唯一名稱的 Navigator 注冊到所有 screen 組件爸吮。注冊后芬膝,就能運(yùn)行包含 Tab 的應(yīng)用或單個(gè) screen 應(yīng)用,如清單8所示:

import { Navigation } from "react-native-navigation";
import MainScreen from "./src/screens/MainScreen/MainScreen";
:

// register the MainScreen component
Navigation.registerComponent(
  'MainScreen',
  () => 'MainScreen'
);

:
:

// Start the (single screen)App
export default () => Navigation.startSingleScreenApp({
  screen: {
    screen: "MainScreen",
    title: "Main Screen"
  }
});

如果是基于 tab 的使用形娇,則需要?jiǎng)?chuàng)建更多的 screen 锰霜,因?yàn)楸仨氈该鞑煌?tab 及其關(guān)聯(lián)的 screen ,tab 詳細(xì)信息和樣式桐早,例如:

// Start the (tab-based) App
export default () => Navigation.startTabBasedApp({
    tabs: [
        {
            screen: "screen unique name",
            label: "label",
            title: "title",
            icon: icons[0],
            navigatorButtons: {
                leftButtons: [
                    {
                        icon: icons[2],
                        title: "title",
                        id: "unique id"
                    }
                ]
            }
        },
        {
            screen: "screen unique name",
            label: "label",
            title: "title",
            icon: icons[1],
            navigatorButtons: {
                leftButtons: [
                    {
                        icon: icons[2],
                        title: "title",
                        id: "unique id"
                    }
                ]
            }
        }
    ],
    tabsStyle: {
        tabBarSelectedButtonColor: "black"
    },
    drawer: {
        left: {
            screen: "drawer screen unique name"
        }
    },
    appStyle: {
        tabBarSelectedButtonColor: "red"
    },
});

可以根據(jù)需要通過調(diào)用相應(yīng)的功能在單個(gè)和基于 tab 的 screen 之間切換癣缅。另外厨剪,請注意前一個(gè)示例中抽屜的使用∮汛妫可以為單個(gè) screen 應(yīng)用和基于 tab 的應(yīng)用定義抽屜側(cè)面菜單祷膳。

state 管理

在 React(和 React Native)中,props 和 state 用于控制組件屡立。 props(properties)是用于在創(chuàng)建組件時(shí)自定義組件的參數(shù)直晨。例如,Button 組件為許多屬性提供支持;在清單10中膨俐,title 和 onPress 是 props抡秆。

<Button
  onPress={onPressHandler}
  title="Learn More"
  :
/>

屬性由 React 自身設(shè)置(由父組件設(shè)置),并在組件的整個(gè)生命周期內(nèi)保持固定吟策。 State 是應(yīng)用內(nèi)的特殊數(shù)據(jù),可根據(jù)需要進(jìn)行更改以驅(qū)動(dòng)組件行為的止,比如刷新數(shù)據(jù)檩坚。state 應(yīng)該在構(gòu)造函數(shù)中初始化,并且只能通過調(diào)用 setState 來更改诅福。清單11顯示了 state 的用法:

class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {isActive: true};
  }

  toggleActiveState() {
      this.setState(previousState => {
          return { isActive: !previousState.isActive };
      });
  }

  render() {
      :
  }

}

清單11是一個(gè)簡單 state 管理的示例匾委,但如果應(yīng)用對于許多 screen 組件和組件間狀態(tài)管理更復(fù)雜,則應(yīng)該利用 Redux氓润。 Redux 是一種更先進(jìn)的 state 管理方法赂乐,它提供了一個(gè)實(shí)現(xiàn) state 管理及相關(guān)操作和處理程序的框架。但是使用 Redux 會(huì)增加應(yīng)用的復(fù)雜性咖气,因此應(yīng)該考慮僅在真正需要它時(shí)使用它(即挨措,對于較大的復(fù)雜應(yīng)用)。

持久化存儲(chǔ)

React Native 使用 AsyncStorage 為持久化存儲(chǔ)提供支持崩溪,AsyncStorage 是一個(gè)易于使用的基于鍵值的異步(持久)存儲(chǔ)系統(tǒng)浅役,對整個(gè)應(yīng)用而言是全局的。它很簡單伶唯,因?yàn)樗恍枰^多的設(shè)置觉既。在 iOS 上,它表現(xiàn)為一系列字典或者是文件乳幸。在Android 上瞪讼,它基于 SQLite 或 RocksDB:

import {AsyncStorage} from 'react-native'
:

const USERNAMES_KEY = 'Usernames'

const user = {
    name: 'John',
    last: 'Smith',
    username: 'jsmith'
}

// Storing the item
AsyncStorage.setItem(USERNAMES_KEY, JSON.stringify(user))

:

// Get item promise to retrieve the item
AsyncStorage.getItem(USERNAMES_KEY).then((item) => {
    const userItem = JSON.parse(item)
})

:

但是 AsyncStorage 有許多限制,例如性能低下粹断,沒有索引符欠,也沒有加密。讓我再說一遍:它沒有加密姿染。如果要存儲(chǔ)大量數(shù)據(jù)背亥,性能和加密是應(yīng)用的重要因素秒际,則應(yīng)考慮使用 Realm React Native 等替代方案。 Realm React Native 是跨平臺的狡汉,性能更好娄徊,支持加密,甚至還帶有版本的 ListView(具有與 React Native ListView 相同的 API 簽名)盾戴,它在 Realm 之上進(jìn)行了優(yōu)化寄锐,大大改善了對本地存儲(chǔ)的訪問。 Realm 使用 static schema 的途徑來提高性能尖啡。(可以看一下筆者的這篇文章來學(xué)習(xí) Realm 的使用橄仆,傳送門->移動(dòng)數(shù)據(jù)庫 Realm 在 React-Native 的使用詳解 ):

class Usernames {
    static schema = {
        name: 'User',
        properties: {
            name: 'string',
            last: 'string',
            username: 'string',
        }
    }
}

let realm = new Realm({schema: [Usernames]});

realm.write(() => {
    realm.create('Usernames', { name: 'John', last: "Smit", username : "jsmith" });
});

網(wǎng)絡(luò)

移動(dòng)應(yīng)用通常是需要網(wǎng)絡(luò)連接的應(yīng)用。移動(dòng)應(yīng)用連接到網(wǎng)絡(luò)以進(jìn)行身份??驗(yàn)證衅斩。 React Native 提供不同的網(wǎng)絡(luò) API:

  • 最初的 Ajax(異步JavaScript + XML)XMLHttpRequest API
  • WebSockets盆顾,通過TCP 連接提供全雙工通信通道,也叫做雙向平等對話
  • Fetch API,該系列的最新成員畏梆,類似于 XMLHttpRequest您宪,但具有其他功能。

清單14使用 fetch API 從服務(wù)器獲取用戶數(shù)據(jù)的 json 文件:

{
  "users": [
    { "name": "John Smith", "username": "jsmith"},
    { "name": "Matt People", "username": "mpeople"},
    { "name": "Graciela Lopez", "username": "glopez"},
    { "name": "Jeff Bezos", "username": "jbezos"},
  ]
}

--

import React from 'react';
import { View, Text, FlatList, ActivityIndicator} from 'react-native';

export default class FetchUsernames extends React.Component {

  constructor(props){
    super(props);
  }

  // dispatch the fetch once the component mounts
  componentDidMount(){
    return fetch('https://...')
      .then((response) => response.json())
      .then((responseJson) => {
this.setState({
          dataSource: responseJson.users,
        }, function(){
        });
      })
      .catch((error) => {
        console.error(error);
      });
  }

  // render the component, populating the FlatList from the 
  // state.dataSource that was in turn populated from the JSON
  render(){
    return(
      <View>
        <FlatList
          data={this.state.dataSource}
          renderItem={({item}) => 
               <Text>{item.name}, {item.username}</Text>}
          keyExtractor={(item, index) => index}
        />
      </View>
    );
  }
}

關(guān)于 fetch API 和網(wǎng)絡(luò)的一些注意事項(xiàng):

  • 請注意清單14中 Promise 的使用奠涌。即使響應(yīng)是 HTTP 404 或 500宪巨,fetch 也不會(huì)失敗(拒絕)溜畅。換句話說捏卓,它只會(huì)拒絕網(wǎng)絡(luò)故障。檢測非網(wǎng)絡(luò)故障的方法是檢查 status 是否正常返回慈格。
  • 默認(rèn)情況下怠晴,iOS 會(huì)阻止未使用 SSL 加密的請求。解決此問題的唯一方法是添加 App Transport Security浴捆。
  • 可以使用 NetInfo 來檢測或檢索網(wǎng)絡(luò)信息龄寞。它可以檢測有網(wǎng)或無網(wǎng)絡(luò)狀態(tài),連接類型(Wi-Fi汤功,蜂窩)和有效連接類型(2G物邑,3G和4G),不過對于兩個(gè)端來說這個(gè)還有一些區(qū)別滔金。

結(jié)論

本文僅是對 React Native 提供了一個(gè)高層次的觀點(diǎn)看法色解。 React Native 是一個(gè)很復(fù)雜的話題。如果要深究餐茵,則需要更詳細(xì)地研究本文所涵蓋的每個(gè)領(lǐng)域科阎。

React Native 是一個(gè)充滿活力且不斷發(fā)展的框架和社區(qū)。但 React Native 并不像原生應(yīng)用開發(fā)那樣成熟忿族。所以必須為Android锣笨,iOS 和 React Native 的開發(fā)保持穩(wěn)定的環(huán)境蝌矛,包括所有相關(guān)的開發(fā)工具。對 于React Native 中不存在的組件错英,可以 Google 搜索入撒,就可以找到所需內(nèi)容,請記住所選的第三方庫可能會(huì)更改或維護(hù)可能會(huì)停止或被放棄椭岩,這是一個(gè)要考慮的主要風(fēng)險(xiǎn)茅逮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市判哥,隨后出現(xiàn)的幾起案子献雅,更是在濱河造成了極大的恐慌,老刑警劉巖塌计,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挺身,死亡現(xiàn)場離奇詭異,居然都是意外死亡锌仅,警方通過查閱死者的電腦和手機(jī)瞒渠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來技扼,“玉大人,你說我怎么就攤上這事嫩痰〗宋牵” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵串纺,是天一觀的道長丽旅。 經(jīng)常有香客問我,道長纺棺,這世上最難降的妖魔是什么榄笙? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮祷蝌,結(jié)果婚禮上茅撞,老公的妹妹穿的比我還像新娘。我一直安慰自己巨朦,他們只是感情好米丘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著糊啡,像睡著了一般拄查。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棚蓄,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天堕扶,我揣著相機(jī)與錄音碍脏,去河邊找鬼。 笑死稍算,一個(gè)胖子當(dāng)著我的面吹牛典尾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邪蛔,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼急黎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侧到?” 一聲冷哼從身側(cè)響起勃教,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匠抗,沒想到半個(gè)月后故源,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汞贸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年绳军,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矢腻。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡门驾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出多柑,到底是詐尸還是另有隱情奶是,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布竣灌,位于F島的核電站聂沙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏初嘹。R本人自食惡果不足惜及汉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屯烦。 院中可真熱鬧坷随,春花似錦、人聲如沸驻龟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迅脐。三九已至芍殖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谴蔑,已是汗流浹背豌骏。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工龟梦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窃躲。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓计贰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒂窒。 傳聞我的和親對象是個(gè)殘疾皇子躁倒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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