pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

React Native第一課

本篇文章的作用在于幫助你快速上手使用React Native編寫iOS應用。如果你現在還不太了解React Native是什么以及Facebook為什么要創建React Native,你可以先看看這篇博客。 ... ...,HTML5中國,中

  

  前言

  本篇文章的作用在于幫助你快速上手使用React Native編寫iOS應用。如果你現在還不太了解React Native是什么以及Facebook為什么要創建React Native,你可以先看看這篇博客。

  閱讀本文之前,我們假設你已經有過使用React創建網站的經驗。如果你還是一個React新手,那么我們建議你從React的網站開始學習。


  設置

  使用React Native開發iOS應用需要OSX系統,Xcode,Homebrew,node,npm以及watchman,你也可以有選擇的使用Flow。

  在安裝完這些依賴項目之后,你可以簡單的使用兩行命令來開啟一個React Native項目:

  npm install -g react-native-cli

  react-native-cli是用來開發React Native的命令行工具。你需要使用npm來安裝它。上面這行代碼將會幫助你在terminal中安裝react-native命令。當然,你只需要運行一次這行代碼。

  react-native init AwsomeProject

  這行代碼可以獲取所有React Native的源碼以及依賴項,同時會創建一個叫做AwsomeProject/AwsomeProject.xcodeproj的全新Xcode項目。


  開發

  現在你可以在Xcode中開發這個新項目(AwsomeProject/AwsomeProject.xcodeproj),并簡單的使用cmd+R來運行它。運行代碼的同時也會自動開啟一個node服務器來實現代碼的熱重載。這樣一來你就可以通過cmd+R來查看變化而不需要每次都在Xcode中進行重編譯。

  在本文中我們將創建一個簡單的電影應用,這個應用將抓取目前正在上映的最新的25部電影,并將它們展示在一個ListView中。


  Hello World

  react-native init會復制Example/SampleProject中的內容到你命名的項目中,在本文中項目名稱為AwsomeProject。這是一個簡單的hello world應用。你可以通過編輯index.os.js來改變這個應用,然后使用cmd+R在模擬器中查看變化。


  偽造數據

  在我們開始編寫代碼從Rotten Tomatoes網站抓取數據之前,我們先來偽造一些數據以便我們可以馬上體驗一下React Native。在Facebook我們一般會在JS文件的頂部聲明常量,并在后面使用,但是隨便你加在哪里都好。在index.ios.js中添加以下代碼:

var MOCKED_**_DATA = [
  {title: 'Title', year: '2015', posters: {thumbnail: 'http://i.imgur.com/UePbdph.jpg'}},
];


  渲染一部電影

  我們會渲染電影標題,年份以及電影海報略縮圖。由于略縮圖在React Native中是一個Image組件,我們需要將Imagei到React的依賴項中。

var {
  AppRegistry,
  Image,
  StyleSheet,
  Text,
  View,
} = React;

  現在我們修改render函數以便我們可以將上面渲染上面的數據而不僅僅是渲染一個hello world:

render: function() {
    var movie = MOCKED_**_DATA[0];
    return (
      
        {movie.title}
        {movie.year}
        
      
    );
  }

  按下cmd+R你應該在”2015”上面看到”Title”。注意此時Image什么都不會渲染。這是因為我們還沒有指定想要的寬度和高度。這需要通過styles屬性來設置。在我們修改styles的同時我們還需要把那些不再會使用的樣式刪除:

var styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  thumbnail: {
    width: 53,
    height: 81,
  },
});

  最后我們需要將樣式運用在Image組件上。

  按下cmd+R你會發現圖片已經渲染出來了。

  

#圖片1

  添加其他樣式

  很好,我們現在已經把數據渲染出來了?,F在我們來讓我們的應用變得好看一些。我想把文字放在圖片的右側,同時讓標題大一些并居中:

+---------------------------------+
|+-------++----------------------+|
||       ||        Title         ||
|| Image ||                      ||
||       ||        Year          ||
|+-------++----------------------+|
+---------------------------------+

  我們會添加另一個container,這是為了讓我們的組件在外層的組件中垂直居中。

return (
        
          
          
            {movie.title}
            {movie.year}
          
        
);

  現在并沒有多少變化,我們在文字外層添加了一個包裹容器并將其放在了圖片后面(因為文字要在圖片的右邊)?,F在我們來看看樣式會變成什么樣:

container: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },

  我們在這里使用彈性盒模型來布局,如果你不熟悉彈性盒模型,可以看看這個教程。

  在上面的代碼中,我們簡單的添加了flexDirection: 'row'來確保我們的main container是水平布局而不是垂直布局。


  現在我們添加另一組樣式:

rightContainer: {
    flex: 1,
  },

  上面代碼的意思是rightContainer會占據外層容器右邊的空間,左邊則是圖片。如果沒有看出效果,可以為rightContainer添加一個backgroundColor屬性,同時移除flex: 1。你會看到外出容器的體積會變得勁量的小來適應子容器。

  而文本的樣式很直觀:

title: {
    fontSize: 20,
    marginBottom: 8,
    textAlign: 'center',
  },
  year: {
    textAlign: 'center',
  },

  繼續按下cmd+R來查看更新之后的視圖:

enter image description here

  抓取真實數據

  從Rotten Tomatoes的API抓取數據和學習React Native并沒有多少關系,所以你可以風輕云淡的跳過這一節。

  將下面的常量放在文件的頂部來創建一個請求數據使用的REQUEST_URL:

var API_KEY = '7waqfqbprs7pajbz28mqf6vz';
var API_URL = 'http://api.rottentomatoes.com/api/public/v1.0/lists/**in_theaters.json';
var PAGE_SIZE = 25;
var PARAMS = '?apikey=' + API_KEY + '&page_limit=' + PAGE_SIZE;
var REQUEST_URL = API_URL + PARAMS;

  為我們的應用添加初始狀態以便我們可以通過檢查this.state.** === null來確定電影數據有沒有被城管加載。當電影數據返回時,我們可以通過this.setState({**: **Data})來設置數據。將下面的代碼添加到render函數之前:

getInitialState: function() {
    return {
      **: null,
    };
  },

  我們想要在組件完成加載后發送請求,componentDidMount是React組件中的一個函數,它只會在組件加載完成之后被調用一次。

componentDidMount: function() {
    this.fetchData();
  },

  現在添加組件中會用到的fetchData函數。這個方法將負責處理數據抓取。你需要做的僅僅是在promise完成解析之后調用this.setState({**: data}),因為setState會觸發重新渲染,而此時render函數會注意到this.state.**不再是null。注意我們會在promise鏈的最后調用done()–一定要確保調用done(),否則錯誤信息可能會被忽略。

fetchData: function() {
    fetch(REQUEST_URL)
      .then((response) => response.json())
      .then((responseData) => {
        this.setState({
          **: responseData.**,
        });
      })
      .done();
  },

  現在修改render函數來渲染一個loading視圖,如果電影數據還沒有返回的話,否則將渲染第一部電影:

 render: function() {
    if (!this.state.**) {
      return this.renderLoadingView();
    }

    var movie = this.state.**[0];
    return this.renderMovie(movie);
  },

  renderLoadingView: function() {
    return (
      
        
          Loading **...
        
      
    );
  },

  renderMovie: function(movie) {
    return (
      
        
        
          {movie.title}
          {movie.year}
        
      
    );
  },

  現在按下cmd+R,你應該已經看到了”Loading **…”,直到電影數據返回,接著頁面就會渲染第一部從Rotten Tomatoes抓回來的電影:

  

enter image description here

  ListView

  現在我們來修改應用來將所有的數據渲染在一個ListView組件種,而不是只渲染一部電影。

  為什么使用ListView要比把所有數據放在一個ScrollView里面好呢?雖然React速度很快,但是渲染一個可能是無限長的列表依然可能很慢。ListView會自動渲染視線之內的視圖,而那些在屏幕之外的視圖會被暫時移除。

  第一件事:在文件的最上方添加ListView:

var {
  AppRegistry,
  Image,
  ListView,
  StyleSheet,
  Text,
  View,
} = React;

  現在修改render函數以便一旦我們的數據返回沃恩就可以在一個ListView里面渲染數據:

render: function() {
    if (!this.state.loaded) {
      return this.renderLoadingView();
    }

    return (
      
    );
  }

  DataSource是一個ListView的接口,作用是決定那些行會被改變。

  注意在這里使用dataSource而不是this.state。下一步我們需要在getInitialState的返回對象上添加一個空的dataSource,我們不能再使用this.state.**防止數據被存儲兩次。我們可以使用state的布爾值屬性(this.state.loaded)來判斷數據抓取是否結束:

getInitialState: function() {
    return {
      dataSource: new ListView.DataSource({
        rowHasChanged: (row1, row2) => row1 !== row2,
      }),
      loaded: false,
    };
  },

  在這里我們還需要修改fetchData方法來更新state:

fetchData: function() {
    fetch(REQUEST_URL)
      .then((response) => response.json())
      .then((responseData) => {
        this.setState({
          dataSource: this.state.dataSource.cloneWithRows(responseData.**),
          loaded: true,
        });
      })
      .done();
  },

  最后,我們在styles中為ListView組件添加樣式:

 listView: {
    paddingTop: 20,
    backgroundColor: '#F5FCFF',
  },

  下面是最終的效果圖:

  

#圖4

  接下來我們還可以通過添加導航,搜索,無線滾動加載等等來彎沉一個完整的應用。你可以查看[電影示例](** Example)來查看完整的代碼。


  完整的源碼

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 */
'use strict';

var React = require('react-native');
var {
  AppRegistry,
  Image,
  ListView,
  StyleSheet,
  Text,
  View,
} = React;

var API_KEY = '7waqfqbprs7pajbz28mqf6vz';
var API_URL = 'http://api.rottentomatoes.com/api/public/v1.0/lists/**in_theaters.json';
var PAGE_SIZE = 25;
var PARAMS = '?apikey=' + API_KEY + '&page_limit=' + PAGE_SIZE;
var REQUEST_URL = API_URL + PARAMS;

var AwesomeProject = React.createClass({
  getInitialState: function() {
    return {
      dataSource: new ListView.DataSource({
        rowHasChanged: (row1, row2) => row1 !== row2,
      }),
      loaded: false,
    };
  },

  componentDidMount: function() {
    this.fetchData();
  },

  fetchData: function() {
    fetch(REQUEST_URL)
      .then((response) => response.json())
      .then((responseData) => {
        this.setState({
          dataSource: this.state.dataSource.cloneWithRows(responseData.**),
          loaded: true,
        });
      })
      .done();
  },

  render: function() {
    if (!this.state.loaded) {
      return this.renderLoadingView();
    }

    return (
      
    );
  },

  renderLoadingView: function() {
    return (
      
        
          Loading **...
        
      
    );
  },

  renderMovie: function(movie) {
    return (
      
        
        
          {movie.title}
          {movie.year}
        
      
    );
  },
});

var styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  rightContainer: {
    flex: 1,
  },
  title: {
    fontSize: 20,
    marginBottom: 8,
    textAlign: 'center',
  },
  year: {
    textAlign: 'center',
  },
  thumbnail: {
    width: 53,
    height: 81,
  },
  listView: {
    paddingTop: 20,
    backgroundColor: '#F5FCFF',
  },
});

AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);


來源http://facebook.github.io/react-native/docs/tutorial.htm


【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

由于實際運行環境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會達到,所以這部分不是開發者能夠決定的,開發者能作的是盡可能通
本文將使用HTML5提供的VideoAPI做一個自定義的視頻播放器,需要用到HTML5提供的video標簽、以及HTML5提供的對JavascriptAPI的擴展。,HTML5中國,中國最大的HTML5中文門戶。
隨著 Hybrid 應用的豐富,HTML5 工程師們已經不滿足于把桌面端體驗簡單移植到移動端,他們覬覦移動原生應用人性化的操作體驗,特別是原生應用與生俱來的豐富的手勢系統。HTML5 沒有提
你想要在自己網站上分享一個產品,或者是一個作品集,又或者僅僅只是一個靈感。在你發布到網上之前,你想讓它看起來有吸引力,專業,或者至少得看起來像那么回事。那么你接下
H5廣告,包括H5廣告的設計流程,究竟有什么講究,和階段。為了能幫助更多的人了解H5廣告,我專門做了一個講義。同時,也讓我意外的收到了非常好反饋和認!這是對我的極大鼓勵!我的
本文主要內容有:框架與組件、構建生態、開發技巧與調試、html、css與重構、native/hybrid/桌面開發、前端/H5優化、全棧/全端開發、研究實驗、數據分析與監控、其它軟技能、前端技術網
主站蜘蛛池模板: 传动滚筒,改向滚筒-淄博建凯机械科技有限公司 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 首页 - 张店继勇软件开发工作室 兰州UPS电源,兰州山特UPS-兰州万胜商贸 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 广州小程序开发_APP开发公司_分销商城系统定制_小跑科技 | 台式低速离心机-脱泡离心机-菌种摇床-常州市万丰仪器制造有限公司 | 福建省教师资格证-福建教师资格证考试网 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 制冷采购电子商务平台——制冷大市场 | 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 活性炭-果壳木质煤质柱状粉状蜂窝活性炭厂家价格多少钱 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 包塑软管|金属软管|包塑金属软管-闵彬管业 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 门禁卡_智能IC卡_滴胶卡制作_硅胶腕带-卡立方rfid定制厂家 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 德国UST优斯特氢气检漏仪-德国舒赐乙烷检测仪-北京泽钏 | 北京浩云律师事务所-企业法律顾问_破产清算等公司法律服务 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 上海道勤塑化有限公司 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 丹佛斯变频器-Danfoss战略代理经销商-上海津信变频器有限公司 | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 风电变桨伺服驱动器-风电偏航变桨系统-深圳众城卓越科技有限公司 | 淘气堡_室内儿童乐园_户外无动力儿童游乐设备-高乐迪(北京) | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | 广州云仓代发-昊哥云仓专业电商仓储托管外包代发货服务 | 高博医疗集团上海阿特蒙医院 | 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 培训一点通 - 合肥驾校 - 合肥新亚驾校 - 合肥八一驾校 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 搜木网 - 木业全产业链交易平台,免费搜货、低价买货! | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 |