>----第1章 React Native簡介

1.1 環境搭建

 1.1.1 安裝Node.js
     在瀏覽器中輸入http://nodejs.org下載node-v4.4.pkg然後雙擊安裝一路next,安裝成功過後在terminal中輸入node -v查看版本號
 1.1.2安裝React Native
      安裝Homebrew安裝watchman和flow的命令如下:
       brew install watchman
       brew install flow
       npm install -g react-native-cli
       如果需要管理員權限添加sudo
       sudo npm install -g react-native-cli
       如果下載比較慢可以試這個 https://segmentfault.com/a/1190000002642514
  1.1.3使用NVM管理管理Node.js版本
  1.1.4 創建項目
      執行命令
         react-native init Hello
      如果比較慢可以用淘寶的連接或者下面的   https://segmentfault.com/a/1190000002642514
      這裏也有react-native的配置:http://reactnative.cn/  

1.2從React到React Native

    React Native是基於React設計的

1.2.1 React簡單

  React是一個JavaScript的類庫

React主要有如下3個特點:

  1. 作爲UI:React可以只作爲視圖(View)在MVC中使用。
  2. 虛擬DOM:這是一個亮點,傳統的是全部更新,React只更新不同的,高效
  3. 數據流(Data Flow): React支持單向數據流,相對於傳統更加靈活

React有哪些需要我們掌握的也:

  1. JSX語法知識:JSX語法類似於XML
  2. ES6相關知識:因爲ES6增加了很多語法特性,使用ES6更加快速地進行功能開發
  3. 前端基礎知識:主要是css以及javascript

1、簡單組件和數據傳遞

  我們可以使用this.props來做簡單的數據傳遞
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>React第一個例子</title>
    <script type="text/javascript" src="react.js"></script>
    <script type="text/javascript" src="JSXTransformer.js"></script>
</head>
<body>
    <div id="example">

    </div>
    <script type="text/jsx">
        var HelloMessage = React.createClass({
            render: function() {
                return <h1>Hello {this.props.name}!</h1>;
            }
        });
        React.render(<HelloMessage name="React" />, document.getElementById('example'));

    </script>
</body>
</html>
   現在分析上面的代碼,它主要做了兩件事:
  • 定義了一個組件HelloMessage,HelloMessages可以傳入name屬性,可以將內容用h1標籤渲染。
  • 使用React.render方法將組件渲染到id爲example的div內,render方法有兩個參數,第一個參數就是要渲染的組件內容,第二個就是要渲染到的目標節點。

入門點1:

調用 React.createClass() 來創建一個組件,組件名稱(上例中的“HelloMessage”)第一個字母約定大寫;

入門點2:

render():通過 React.createClass() 創建的組件,必須包含一個render()方法,具體說明查看http://www.css88.com/react/docs/component-specs.html#render

入門點3:

定義完組件,需要調用React.render()方法,將ReactElement (組件)渲染到對應的DOM元素中(這裏我們使用document.body)。

2.通過this.state更新視圖

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>React第一個例子</title>
    <script type="text/javascript" src="react.js"></script>
    <script type="text/javascript" src="JSXTransformer.js"></script>
</head>
<body>
    <div id="example"></div>
    <script type="text/jsx">
        var Timer = React.createClass({
            /*初始狀態*/
            getInitialState: function() {
                return {secondsElapsed: 0};
            },
            tick: function() {
                this.setState({secondsElapsed: this.state.secondsElapsed + 1});
            },
            /*組件完成加載*/
            componentDidMount: function() {
                this.interval = setInterval(this.tick, 1000);
            },
            /*組件將被卸載*/
            componentWillUnmount: function() {
                clearInterval(this.interval);
            },
            render: function() {
                return (
                        <div>Seconds Elapsed: {this.state.secondsElapsed}</div>
                );
            }
        });

        React.render(<Timer />, document.getElementById('example'));
    </script>
</body>
</html>

上面的代碼在瀏覽器運行每隔一秒,secondsElapsed增加1,我們通過React.createClass創建了一個組件。

 其實,這裏已經涉及一個組件的生命週期了,getinitialState是組件的初始狀態,必須返回一個對象或者null對象,在getInitialState中,我們可以準備組件需要的數據以及後期需要更新的數據模型,也就是說getInitialState返回的對象是掛載在this.state上的,render方法的使用是渲染視圖,這裏render使用的數據是this.state,這樣我們可以通過更新this.state來更新視圖。componentDidMount是組件加載完成的狀態,這裏我們可以改變組件的狀態(this.state)。

上面的代碼中,componentDidMount設置了interval,每隔一秒鐘,secondsElapsed加1,componentWillUnmount在組件將被卸載時調用,我們可以在componentWillUnmount裏清除定時器this.interval

3、簡單應用

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>React第一個例子</title>
    <script type="text/javascript" src="react.js"></script>
    <script type="text/javascript" src="JSXTransformer.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/jsx">
    var ShowEditor = React.createClass({
        getInitialState: function() {
            return {value: '你可以在這裏輸入文字'};
        },
        handleChange: function() {
            this.setState({value: React.findDOMNode(this.refs.textarea).value});
        },
        render: function() {
            return (
                <div>
                    <h3>輸入</h3>
                    <textarea style={{width:300, height:150, outline:'none'}}
                        onChange={this.handleChange}
                        ref="textarea"
                        defaultValue={this.state.value} />
                    <h3>輸出</h3>
                    <div>
                        {this.state.value}
                    </div>
                </div>
            );
        }
    });
    React.render(<ShowEditor />, document.getElementById('example'));
</script>
</body>
</html>
現在我們來分析上面的代碼,showEditor做了一件事,用戶在textarea輸入文字的同時,會在<div>中及時輸出textarea中的文字,這裏面有四個地方需要我們狀態下。
  • 可以通過state來修改視圖的狀態從而改變視圖。
  • textarea上綁定了onChange的事件監聽,基目的是通過setState改變this.state.value。
  • textarea添加了ref屬性,這樣我們就可以通過this.refs.textarea引用textarea對象了,
  • React提供了findDOMNode的方法,通過它可以找到React的DOM

1.2.2 React Navtive簡介

 React Native採用的語法是React, 因此,只要基本掌握了React和jsX,同時補充相關平臺(ios,android,web)的知識,就能開發Native應用和web應用了。

現在我們要創建React Native項目  命令行:react-native init demo 

然後我們使用xcode打開index.ios.js文件運行項目

'use strict';

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

//var AppRegistry = React.AppRegistry;
//var StyleSheet = React.StyleSheet;
//var Text = React.Text;
//var View = React.View;
//var Image = React.Image;

var demo4 = React.createClass({
  render: function() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>歡迎來到React Native的世界</Text>
        <Image style={{width:50,height:50, resizeMode: Image.resizeMode.contain}}
               source={{uri:'https://facebook.github.io/react-native/img/header_logo.png'}}>
        </Image>
      </View>
    );
  }
});

var styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#05A5D1',
  },
  welcome: {
    fontSize: 20,
    color:'#fff'
  },
});

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

現在我們分析上面的代碼,使用require引用react-native模塊,然後定義了AppRegistry、StyleSheet、Text、View和Imaeg這5個對象,其實上面的var形式的對象也可能這樣定義:
var AppRegistry = React.AppRegistry;
使用var {} = React的形式更爲簡潔,我們使用StyleSheet.create創建的是一個樣式表的類,裏面包含container和welcome這兩個樣式對象,引用使用style={對象}

1.4 如何學習React Native
React Native官網:http//facebook.github.io/react-native。
React Native版本發佈:https://github.com/facebook/react-native/releases
React Native Github地址:https://github.com/facebook/react-native
問題搜索:https//github.com/facebook/react-native/issues。

發佈了183 篇原創文章 · 獲贊 32 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章