摘要:利用來搭建代碼。雖然這不是安裝的唯一方式,但我發(fā)現(xiàn),是非常好用的包管理器。終端窗口打開后,會(huì)啟動(dòng),并由服務(wù)器處理以上請(qǐng)求。面對(duì)這種情況時(shí),需要關(guān)閉終端窗口,停止在上的應(yīng)用,并重新運(yùn)行。使用設(shè)定應(yīng)用的用戶界面。命名這兩個(gè)文件為和。
【編者按】本篇文章的作者是 Joyce Echessa——渥合數(shù)位服務(wù)創(chuàng)辦人,畢業(yè)于臺(tái)灣大學(xué),近年來專注于協(xié)助客戶進(jìn)行 App 軟體以及網(wǎng)站開發(fā)。本篇文章中,作者介紹通過 React Native 框架構(gòu)建一個(gè)示例應(yīng)用的開發(fā)過程,使得網(wǎng)絡(luò)技術(shù)和移動(dòng)開發(fā)碰撞出絢麗火花,本文系 OneAPM 工程師編譯整理:
我們已經(jīng)了解像 Titanium 和 PhoneGap 等框架,它們能讓開發(fā)者用 Web 技術(shù)構(gòu)建移動(dòng)應(yīng)用。這是一個(gè)優(yōu)勢(shì),支持開發(fā)者使用原先網(wǎng)絡(luò)和移動(dòng)開發(fā)的相關(guān)技術(shù)。不僅如此,相同的代碼庫經(jīng)過小幅度的修改便能適用多個(gè)平臺(tái)——這就是著名的「一次編寫,到處運(yùn)行」。然而,當(dāng)涉及到構(gòu)建應(yīng)用的性能時(shí),這些框架的缺點(diǎn)顯露無遺,盡管它們有一些吸引力,但卻一直更適用于構(gòu)建原生應(yīng)用。
React Native 卻與眾不同。像 PhoneGap 這樣的框架是將網(wǎng)頁內(nèi)容包裝成 WebView,導(dǎo)致 UI 元素并沒有原生的感覺,而 React Native 則使用原生 iOS 或 Android 組件支持的 JavaScript 組件,所以你構(gòu)建的應(yīng)用是完全原生的。
Facebook 的湯姆 Occhino 在文章末尾鏈接視頻中說,React Native 并非是「一次編寫,到處運(yùn)行」的框架。正如本教程所介紹,你使用特定平臺(tái)的組件來構(gòu)造 UI,所以并不能直接將同樣的代碼放到 Android 上運(yùn)行。React Native 是讓你學(xué)習(xí)這套技能,并可以用它在多種平臺(tái)上搭建應(yīng)用,Occhino 更進(jìn)一步闡明,這其實(shí)是「一次編寫,到處運(yùn)行」的框架。在本文中,作者將介紹利用 React Native 框架構(gòu)建一個(gè)簡(jiǎn)單應(yīng)用的完整開發(fā)過程。
開始吧!首先,介紹一下在開發(fā)機(jī)器上安裝 React Native 的流程。
開始之前,應(yīng)該提醒大家:你可以從 GitHub 獲取 React Native 框架代碼。接著運(yùn)行其中的示例項(xiàng)目,比如2048(游戲)、Movies (電影瀏覽器應(yīng)用)、SampleApp(空白的 React Native 應(yīng)用)、TicTacToe (游戲)和 UIExplorer(這個(gè)應(yīng)用展現(xiàn)了所有可能用到的 React Native 組件,比如 ListView、TabBar、MapView、Slider 等)。這些應(yīng)用能幫助你學(xué)習(xí)使用 React Native 構(gòu)建 UI 元素,尤其是 UIExplorer 應(yīng)用程序,它提供了你可能需要用到的每個(gè) UI 元素。但是,有些應(yīng)用程序還有 Bug,筆者在嘗試運(yùn)行時(shí)也出現(xiàn)過幾次崩潰。盡管如此,它們?nèi)匀环浅V档脤W(xué)習(xí),如需詳情,你可以了解下相關(guān)文檔。
現(xiàn)在開始安裝。React native 利用 Node.js 來搭建 JavaScript 代碼。如果你電腦上已經(jīng)安裝過,則可以跳過以下步驟,否則請(qǐng)繼續(xù)以下步驟。
我們選擇使用 Homebrew 來安裝 Node.js 框架。雖然這不是安裝 Node 的唯一方式,但我發(fā)現(xiàn),Homebrew 是非常好用的包管理器。你可以用它很容易地安裝最新或特定版本的包、使用不同版本的軟件包、選擇要使用的版本、更新和卸載包等。想要安裝 Homebrew,可以直接去官網(wǎng),按照網(wǎng)頁頁面頂部指令即可。由于鏈接可能會(huì)變,這里就不貼出下載鏈接了。
在 Homebrew 安裝好后,粘貼以下指令到終端窗口以安裝 Node.js。
Swiftbrew install node
接著安裝 watchman。
Swiftbrew install watchman
Watchman 是 Facebook 的文件監(jiān)控器。React Native 用它來檢測(cè)代碼變化,以便重新編譯。
接著用下列指令安裝 React Native CLI 工具。
Swiftnpm install -g react-native-cli
NPM 是 Node 的包管理器。你可以將它想象成 Ruby 中的 RubyGems、iOS 的 CocoaPods,以及 Java 中的 Gradle/Maven 等。它能夠讓你更容易地下載和管理項(xiàng)目所需的任何相關(guān)項(xiàng)。
在終端窗口,切換到你想要保存項(xiàng)目的文件夾,然后運(yùn)行以下命令。
Swiftreact-native init BookSearch
以上是用 CLI 工具來構(gòu)建一個(gè)可以編譯和運(yùn)行的 React Native 項(xiàng)目。當(dāng)這個(gè)過程完成后,你會(huì)收到來自終端窗口的消息,在 Xcode 中打開 BookSearch.xcodeproj,并照常運(yùn)行該應(yīng)用程序。接下來模擬器將啟動(dòng)你的應(yīng)用,此外,將再打開一個(gè)終端窗口。當(dāng)一個(gè) React Native 應(yīng)用啟動(dòng)時(shí),它將從以下網(wǎng)址加載 JavaScript 程序。
Swifthttp://localhost:8081/index.ios.bundle
終端窗口打開后,會(huì)啟動(dòng) React Packager,并由服務(wù)器處理以上請(qǐng)求。React Packager 負(fù)責(zé)讀取并構(gòu)建 JSX(之后會(huì)介紹)和 JavaScript 代碼。
運(yùn)行應(yīng)用時(shí),你會(huì)看到下圖的模擬器。如果你要在設(shè)備上運(yùn)行,應(yīng)該按照以下幾個(gè)步驟。
順便說一句,你應(yīng)該注意歡迎界面給出的關(guān)鍵指令:通過編輯創(chuàng)建項(xiàng)目時(shí)生成的 index.ios.js 文件,編輯應(yīng)用的用戶界面,如果你修改了 JavaScript 代碼,用 Command-R 加載應(yīng)用程序,看看有什么變化。如果你想要更多選擇,使用 Command-Control-Z 打開開發(fā)者功能表,它提供啟用時(shí)重新加載、瀏覽器調(diào)試等選項(xiàng)。
當(dāng)你按照本文操作,模擬器上卻突然出現(xiàn)一個(gè)紅色屏幕時(shí),不妨檢查一下模擬器上的錯(cuò)誤消息。通過檢查可以排查出問題是出自代碼還是服務(wù)器。作者也曾經(jīng)遇到幾次服務(wù)器連接失敗的情況,由模擬器反饋的錯(cuò)誤消息是「無法連接到服務(wù)器」,然而檢查終端時(shí)得到「進(jìn)程終止」的錯(cuò)誤消息。面對(duì)這種情況時(shí),需要關(guān)閉終端窗口,停止在 Xcode 上的應(yīng)用,并重新運(yùn)行。對(duì)于其他錯(cuò)誤比如代碼中的語法錯(cuò)誤、網(wǎng)絡(luò)請(qǐng)求超時(shí)錯(cuò)誤(如果你的應(yīng)用是從網(wǎng)絡(luò)獲取數(shù)據(jù)),在修正錯(cuò)誤后再重新加載應(yīng)該就可以了。
如果在鍵盤上按下 Command-R 沒什么用,那么鍵盤可能沒能連接到模擬器。從模擬器功能表中選擇硬件>鍵盤>連接硬件鍵盤,便能成功連接。
如果你已經(jīng)完成以上步驟,卻仍沒有重新加載,那么可能需要重新啟動(dòng)計(jì)算機(jī)。筆者曾經(jīng)遇到過一次奇葩經(jīng)歷,項(xiàng)目運(yùn)行一切正常,但卻突然停止工作,重新啟動(dòng)后又恢復(fù)正常。
現(xiàn)在開始構(gòu)建我們的應(yīng)用。打開 index.ios.js 文件。作者推薦使用適用于 Web 開發(fā)的 IDE。當(dāng)然你也可以使用 Xcode,但不久你會(huì)發(fā)現(xiàn)它并不是很適合。當(dāng)你需要代碼格式化時(shí),它的用處不大,無法自動(dòng)填充或語法錯(cuò)誤高亮。對(duì)于適合的 JavaScriptIDE,你可以通讀本文后再做決定。我用的是 RubyMine,事實(shí)上只要是支持 JavaScript 的任何 IDE 都行,如果你選擇一個(gè)還能支持 JSX 的那會(huì)更好。
當(dāng)打開 index.ios.js 文件時(shí),你會(huì)發(fā)現(xiàn)這些代碼構(gòu)建的是執(zhí)行應(yīng)用時(shí)所看到的 UI。
JavaScript"use strict";
上述代碼開啟了 Strict Mode,這將為 React Native 中的 JavaScript 代碼加入了改良的錯(cuò)誤處理能力。
JavaScriptvar React = require("react-native");
上述代碼載入 react-native 模塊,并將其分配給 React 變量。在你可以調(diào)用模塊的所有功能之前,必須加載外部模塊到項(xiàng)目文件。就像在 Swift 和 Objective-C 中導(dǎo)入庫。
JavaScriptvar { AppRegistry, StyleSheet, Text, View, } = React;
以上代碼被稱作解構(gòu)賦值,能夠讓你分配多個(gè)對(duì)象屬性到一個(gè)單變量。使得這些屬性可以在整個(gè)文件范圍中引用。以上代碼是可選的,但如果你省略不要,那么每當(dāng)你在代碼中使用一個(gè)組件時(shí),你必須使用其完整名稱,例如「React.AppRegistry」、「React.StyleSheet」而不是 「AppRegistry」、「StyleSheet」。
JavaScriptvar BookSearch = React.createClass({ render: function() { return (); } }); Welcome to React Native! To get started, edit index.ios.js Press Cmd+R to reload,{" "} Cmd+Control+Z for dev menu
上面代碼創(chuàng)建了只有單一函數(shù) render()的類。無論 render 中定義了什么,都將被輸出到屏幕。上述代碼使用 JSX(JavaScript 語法擴(kuò)展)來構(gòu)建應(yīng)用的用戶界面。如果你之前已經(jīng)使用 XML(甚至 HTML),那么對(duì) JSX 應(yīng)該不陌生。它同樣需要使用開始、結(jié)束標(biāo)記,在標(biāo)記中使用屬性來設(shè)置數(shù)值。React Native 不必非得使用 JSX,你可以用普通的 JavaScript,但筆者更推薦 JSX,因?yàn)樗?jiǎn)化了定義的樹結(jié)構(gòu)的過程。如果你需要大量的代碼構(gòu)建 UI,通過龐大的 JSX 樹結(jié)構(gòu)使代碼可讀性更強(qiáng)。
JavaScriptvar styles = StyleSheet.create({ container: { flex: 1, justifyContent: "center", alignItems: "center", backgroundColor: "#F5FCFF", }, welcome: { fontSize: 20, textAlign: "center", margin: 10, }, instructions: { textAlign: "center", color: "#333333", marginBottom: 5, }, });
以上代碼是應(yīng)用于視圖內(nèi)容的樣式。如果你以前做過網(wǎng)絡(luò)開發(fā),而且使用過 CSS(層疊樣式表),那么這應(yīng)該很熟悉。React Native 使用 CSS 設(shè)定應(yīng)用的用戶界面。再看一眼 JSX 代碼,你會(huì)發(fā)現(xiàn)每個(gè)樣式都各有用途,例如 style={} styles.container 為容器定義樣式,容器是用來容納其他 UI 組件的外部視圖。
JavaScriptAppRegistry.registerComponent("BookSearch", () => BookSearch);
上行代碼定義了應(yīng)用的入口。也就是 JavaScript 代碼開始執(zhí)行的地方。
這是 React Native 用戶界面的基礎(chǔ)結(jié)構(gòu)。每個(gè)定義的視圖將會(huì)遵循這一基礎(chǔ)結(jié)構(gòu)。
在本篇文章中,我們將創(chuàng)建一個(gè)示例應(yīng)用,可以瀏覽書籍,并看到詳細(xì)信息比如作者、標(biāo)題、該書簡(jiǎn)介。你也可以在應(yīng)用中搜索書名和作者。下圖是該應(yīng)用的成品圖,數(shù)據(jù)用的是 Google 書籍 API。
添加標(biāo)簽欄示例應(yīng)用將有兩個(gè)項(xiàng)目的標(biāo)簽欄——精選和搜索。我們首先添加該功能。
雖然你可以在 index.ios.js 中編寫所有代碼,但這種做法并不推薦,隨著應(yīng)用代碼量的增加,整個(gè)框架容易變得混亂不堪。為了更便于管理,我們?cè)诓煌奈募袆?chuàng)建類。
在項(xiàng)目中根目錄中創(chuàng)建兩個(gè) JavaScript 文件(與 index.ios.js 文件在相同位置)。命名這兩個(gè)文件為 Search.js 和 Featured.js。打開 Featured.js 并添加以下代碼。
Xcode"use strict"; var React = require("react-native"); var { StyleSheet, View, Text, Component } = React; var styles = StyleSheet.create({ description: { fontSize: 20, backgroundColor: "white" }, container: { flex: 1, justifyContent: "center", alignItems: "center" } }); class Featured extends Component { render() { return (); } } module.exports = Featured; Featured Tab
這段代碼你應(yīng)該非常熟悉,非常類似于我們前面的代碼。我們?cè)O(shè)置 Strict Mode、加載 react-native 模塊、創(chuàng)建視圖樣式并用 render()函數(shù)渲染輸出到用戶界面。代碼的最后一行輸出精選類,從而使其可用于其他文件。請(qǐng)注意,我們聲明類和函數(shù)的方式,略微不同于示例 inindex.ios.js 文件。JavaScript 有不同的聲明類和函數(shù)的方式。隨意選擇你喜歡的風(fēng)格。本篇文章接下來,我們將一直沿用上面所使用的樣式。
在樣式表定義中,我們可以看到基本的 CSS 屬性。我們?yōu)橥獠恳晥D中的文本和中心內(nèi)容,設(shè)置字體大小和背景顏色。但你可能不熟悉 flex: 1 這行,這是最近才增加到 CSS 規(guī)范中的 flexbox。這里的 flex: 1 使得標(biāo)記為容器的元素只占用的屏幕中的剩余空間,也就是只占用適應(yīng)其內(nèi)容的足夠空間。之后我們會(huì)進(jìn)一步介紹 Flex。要了解更多關(guān)于 Flexbox 樣式,你可以參考這個(gè)指南。
在 Search.js 中添加下面代碼。
javaScript"use strict"; var React = require("react-native"); var { StyleSheet, View, Text, Component } = React; var styles = StyleSheet.create({ description: { fontSize: 20, backgroundColor: "white" }, container: { flex: 1, justifyContent: "center", alignItems: "center" } }); class Search extends Component { render() { return (); } } module.exports = Search; Search Tab
上面的代碼與 Featured.js 的代碼很像,除了文本控件中的文字。
刪除 index.ios.js 中的所有內(nèi)容,將下面的代碼粘貼進(jìn)去。
javascript"use strict"; var React = require("react-native"); var Featured = require("./Featured"); var Search = require("./Search"); var { AppRegistry, TabBarIOS, Component } = React; class BookSearch extends Component { constructor(props) { super(props); this.state = { selectedTab: "featured" }; } render() { return (); } } AppRegistry.registerComponent("BookSearch", () => BookSearch); { this.setState({ selectedTab: "featured" }); }}> { this.setState({ selectedTab: "search" }); }}>
此時(shí),我們需要之前創(chuàng)建文件中導(dǎo)出的兩個(gè)模塊,并將它們分配給變量。在類中,我們指定一個(gè)構(gòu)造函數(shù),用來設(shè)置類的狀態(tài)。所使用的組件均有狀態(tài)變量,然后創(chuàng)建一個(gè)名為 selectedTab 的屬性,并將其值賦給「featured」。我們將利用「featured」來確定選項(xiàng)卡是否有效。最后為 Featured 標(biāo)簽設(shè)定默認(rèn)值。(未完待續(xù)...)
敬請(qǐng)持續(xù)關(guān)注:《React Native 簡(jiǎn)介:用 JavaScript 搭建 iOS 應(yīng)用》系列(2)(3).
原文地址:http://www.appcoda.com/react-native-introduction/
本文系 OneAPM 工程師編譯整理。想閱讀更多技術(shù)文章,請(qǐng)?jiān)L問 OneAPM 官方博客。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/85881.html
摘要:分別命名文件為和。上述代碼指定了當(dāng)某列書籍被點(diǎn)擊時(shí)響應(yīng)一個(gè)回調(diào)函數(shù)。當(dāng)組件的值改變時(shí)例如用戶鍵入一些文本,將會(huì)調(diào)用組件,同時(shí)為組件指定一個(gè)回調(diào)函數(shù)。在調(diào)用時(shí),回調(diào)函數(shù)和利用用戶輸入的數(shù)據(jù)將設(shè)置和屬性。 【編者按】本篇文章的作者是 Joyce Echessa——渥合數(shù)位服務(wù)創(chuàng)辦人,畢業(yè)于臺(tái)灣大學(xué),近年來專注于協(xié)助客戶進(jìn)行 App 軟體以及網(wǎng)站開發(fā)。本篇文章中,作者介紹通過 React N...
摘要:面向?qū)ο笕筇卣骼^承性多態(tài)性封裝性接口。第五階段封裝一個(gè)屬于自己的框架框架封裝基礎(chǔ)事件流冒泡捕獲事件對(duì)象事件框架選擇框架。核心模塊和對(duì)象全局對(duì)象,,,事件驅(qū)動(dòng),事件發(fā)射器加密解密,路徑操作,序列化和反序列化文件流操作服務(wù)端與客戶端。 第一階段: HTML+CSS:HTML進(jìn)階、CSS進(jìn)階、div+css布局、HTML+css整站開發(fā)、 JavaScript基礎(chǔ):Js基礎(chǔ)教程、js內(nèi)置對(duì)...
閱讀 2137·2023-04-25 18:49
閱讀 1840·2019-08-30 14:02
閱讀 2643·2019-08-29 17:24
閱讀 3323·2019-08-28 18:10
閱讀 2926·2019-08-28 18:03
閱讀 488·2019-08-26 12:01
閱讀 3309·2019-08-26 11:31
閱讀 1409·2019-08-26 10:29