1. 程式人生 > >ReactNative開發(二)之基礎與入門

ReactNative開發(二)之基礎與入門

一、初識React Native的元件

什麼是React Native的元件?
React元件讓你將UI分割成獨立的、可重用的一些碎片或者部分,這些部分都是相互獨立的

建立元件的三種方式

ES6建立元件的方式
ES5建立元件的方式
函式式定義的無狀態元件

這裡我們主要還是學習下ES6的相關知識點

二、專案的執行及編寫

首先我們在命令列中新建了一個ReactNative專案,不清楚請看ReactNative開發(一),我這裡考慮到框架的原因,選擇的WebStorm開發工具,整合框架的話,這個工具還是比較實用,我們來看看目錄結構

這裡寫圖片描述

說實話,第一眼覺得這跟Androidstudio的目錄結構簡直如出一轍,為了同時在Android和ios中同步效果,這裡新建一個js檔案,這裡取名為setup,將android.js的檔案內容複製過來,並且按如下編寫:

import React, { Component } from 'react';
import {
    StyleSheet,
    Text,
    View
} from 'react-native';
import Hello from "./Hello";

export default class setup extends Component {
    render() {
        return (
            <View style={styles.container}>
                <Hello/>
            </View>
        );
    }
}
const styles = StyleSheet.create({
    container: {
        flex: 1
, marginTop:50, backgroundColor: '#F5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', margin: 10, }, instructions: { textAlign: 'center', color: '#333333', marginBottom: 5, }, });

這裡修改類名為setup,Component 為元件, render()是渲染介面的必須的方法,不可缺少,並且刪除了AppRegistry引用,然後把Android和ios的js檔案修改引用這個setup.js檔案,如下:

import React, { Component } from 'react';
import {
  AppRegistry,
} from 'react-native';
import setup from "./setup";

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

再次執行專案,開啟Terminal命令列,執行沒錯的話就修改成功,我們來新建一個js檔案顯示內容,這裡取名為hello.js檔案,內容如下:

import React, { Component } from 'react';
import {
    StyleSheet,
    Text,
} from 'react-native';

export default class Hello extends  Component{

    render(){
        return <Text style={{fontSize:20,backgroundColor:'red'}}>我的第一個react native程式</Text>
    }
}

執行專案,即可看到Text內容的顯示了

這裡寫圖片描述

三、React Native元件生命週期

元件的生命週期分成三個狀態,這裡就不細說每個生命週期了,如下

Mouting---已經插入真是DOM
Updating---正在被重新渲染
Unmouting---已經一處真實DOM

四、匯入和匯出

這裡我們來看下三個匯入和匯出

類的匯入和匯出
變數常量的匯入和匯出
方法的匯入匯出

類的匯入和匯出

//匯出
export default class setup extends Component 
//匯入
import Hello from "./Hello";

變數常量的匯入和匯出

//這裡變數常量沒有匯出的寫法,看怎麼定義
var name='dddd';
var age='22';
//匯入
import Hello, {name,age} from "./Hello";

方法的匯入匯出

//匯出
export function sum(a,b) {
    return a+b;
}
//匯入
import Hello, {sum} from "./Hello";
//下面我們看看怎麼引用
export default class setup extends Component {

    constructor(props){
        super(props);
        this.state=({
            result:''
        })
    }

    render() {
        return (
            <View style={styles.container}>
                <Hello/>
                <Text style={{fontSize:20}}>名字:{name}</Text>
                <Text style={{fontSize:20}}
                onPress={()=>{
                    var result=sum(2,3);
                    this.setState({result:result,})
                }}
                >2+3={this.state.result}</Text>
            </View>
        );
    }
}

四、props的使用

對於props的理解,我覺得是頁面傳遞屬性的作用,將屬性和變數通過props傳遞給元件,元件在自己對應的類中可以獲取屬性值,但是這些屬性值是不可改變的,舉例如下:

//在主介面這裡呼叫的Hello元件,傳遞age到元件中去
  render() {
        return (
            <View style={styles.container}>
                <Hello
                    age='22'
                />
            </View>
        );
    }
 //在Hello元件中呼叫age,如果沒有傳遞,那麼在defaultProps使用預設值
 static defaultProps={
        name:'小明',
        age:23
    }

  static propTypes={
      name:PropTypes.string,
  }

    render(){
        return <Text style={{fontSize:20,backgroundColor:'red'}}>name={this.props.age}</Text>
    }

這裡的defaultProps裡面是初始化這個元件的預設值,如果沒有收到傳遞的值,那麼就使用預設值,propTypes則是對這些屬性的型別的規範,如果傳遞的不對,那麼將給出提示,如果要新增規範,那麼需要引用這個類PropTypes

import React, { Component ,PropTypes} from 'react';

下面來看看ES6中傳遞變數的便捷之處,如果這個params中有很多屬性,那麼一個個的傳遞自然不是好的解決方式,這裡便使用{…params}的方式傳遞所有屬性;

 render() {
        var params={name:'aaa',age:18,sex:'男'};
        return (
            <View style={styles.container}>
                <Hello
                    {...params}
                />
            </View>
        );
    }

還有一種方式傳遞,獲取部分params的屬性,然後在通過name={name}的形式傳遞

 render() {
        var params={name:'aaa',age:18,sex:'男'};
        var {name,age}=params;
        return (
            <View style={styles.container}>
                <Hello
                    name={name}
                    age={age}
                />
            </View>
        );
    }

五、State的使用

對於state的理解,其實相當於我們java中定義變數的意思,有兩種方式去定義state中的變數,首先來看一下第一種,在constructor中定義,然後通過this.state.size呼叫

 constructor(props){
        super(props);
        this.state={
            size:80
        }
    }
render(){
        return <Text style={{fontSize:20,backgroundColor:'red'}}>name={this.state.size}</Text>
    }

第二種,在constructor外部呼叫

state={
        size:80
    }
constructor(props){
        super(props);
    }
render(){
        return <Text style={{fontSize:20,backgroundColor:'red'}}>name={this.state.size}</Text>
    }

下面我們來看下怎麼改變設定變數,注意使用View記得匯入,呼叫setState方法在裡面改變size的大小

    state={
        size:80
    }

    constructor(props){
        super(props);
    }

    render(){
        return <View>
            <Text
                style={{fontSize:20,backgroundColor:'blue'}}
                onPress={()=>{
                this.setState({
                    size:this.state.size+10
                })
            }}
            >吹哦啊</Text>
            <Text
                style={{fontSize:20,backgroundColor:'green'}}
            >我的氣泡={this.state.size}</Text>
        </View>
    }

這裡寫圖片描述

六、ref的使用

ref是元件的一種特殊屬性,是元件渲染後,指向元件的一個引用;通俗來說,相當於可以拿到這個元件的引用,元件中的變數,可以通過ref獲取,我們看下如何使用ref,有幾種方式定義ref,這裡說其中一種 ref=”reftest”,然後通過this.refs.reftest獲取到該元件的引用,然後呼叫getsize方法獲取四則的值

render() {
        return (
            <View style={styles.container}>
                <Text
                onPress={()=>{
                    var size = this.refs.reftest.getSize();
                    this.setState({
                        size:size,
                    })
                }}
                >
                    獲取大小:{this.state.size}
                </Text>
                <Hello
                    ref="reftest"
                />
            </View>
        );
    }
//=================================================
//元件的渲染,這裡提供getSize方法給外部呼叫
 render(){
        return <View>
            <Text
                style={{fontSize:20,backgroundColor:'blue'}}
                onPress={()=>{
                this.setState({
                    size:this.state.size+10
                })
            }}
            >吹哦啊</Text>
            <Text
                style={{fontSize:20,backgroundColor:'green'}}
            >我的氣泡</Text>
        </View>
    }
 getSize(){
        return this.state.size;
    }

七、類的使用

這裡類的使用跟java類似,有繼承和重寫,下面我們來看看一個例子,這裡同樣也是有構造方法,

export default class Student{
    constructor(name,sex,age){
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    getDescription(){
        return '姓名'+this.name+'性別'+this.sex+'年齡'+this.age;
    }
}
==================================
//在另一個類中初始化
   constructor(props){
        super(props);
        this.stu = new Student('老石','男',28);
    }
//呼叫,this.stu這裡已經表示Student的引用
this.stu.getDescription()

我們來看看這裡類的繼承

import Student from "./Student";
export default class MyStudent extends Student{
    //呼叫父類建構函式
    constructor(){
        super('小明','女',25);
    }
    //重寫父類的方法
    getDescription(){
        return '我的'+super.getDescription();
    }
}