1. 程式人生 > >react native中的屬性、狀態、樣式的理解

react native中的屬性、狀態、樣式的理解

Props(屬性)

大多陣列件在建立時就可以使用各種引數來進行定製。用於定製的這些引數就稱為props

以常見的基礎元件Image為例,在建立一個圖片時,可以傳入一個名為sourceprop來指定要顯示的圖片的地址,以及使用名為styleprop來控制其尺寸。

import React, { Component } from 'react';

import { AppRegistry, Image } from 'react-native';

class Bananas extends Component {

  render() {

    let pic = {

      uri: 'https://upload.wikimedia.org/wikipedia/commons/d/de/Bananavarieties.jpg'

    };

    return (

      <Image source={pic} style={{width: 193, height: 110}} />

    );

  }

}

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

注意到{pic}外圍有一層括號,我們需要來把pic這個變數嵌入到JSX語句中。括號的意思是括號內部為一個js變數或表示式,需要執行後取值。因此我們可以把任意合法的JavaScript表法師通過括號嵌入到JSX語句中。自定義元件也可以使用props。通過在不同的屬性定製,可以儘量提高自定義元件的複用範疇。只需在render

函式中引用this.props,然後按需處理即可。

import React, { Component } from 'react';

import { AppRegistry, Text, View } from 'react-native';

class Greeting extends Component {

  render() {

    return (

      <Text>Hello {this.props.name}!</Text>

    );

  }

}

class LotsOfGreetings extends Component {

  render() {

    return (

      <View style={{alignItems: 'center'}}>

        <Greeting name='Rexxar' />

        <Greeting name='Jaina' />

        <Greeting name='Valeera' />

      </View>

    );

  }

}

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

上面的列子中,我們在Greeting元件中將name作為一個屬性來定製,這樣可以複用這一元件來製作各種不同的‘問候語’。上面的列子把Greeting元件寫在JSX語句中,用法和內建元件並無二致這正是React體系的魅力所在---

State(狀態)

我們使用兩種資料來控制一個元件:propsstateprops是在父元件中指定,而且已經指定,在被指定的元件的生命週期中則不再改變。對於需要改變的資料,我們需要使用state

一般來說,你需要在constructor中初始化state(這是ES6的寫法),然後在需要修改時呼叫setState方法。

假如需要製作一段不停閃爍的文字。文字的內容本身在元件建立時就已經指定好了,所以文字內容應該是一個prop。而文字的顯示或隱藏的狀態(快速的顯隱切換就產生了閃爍的效果)則是隨著時間變化的,因此這一狀態應該寫在state中。

import React, { Component } from 'react';

import { AppRegistry, Text, View } from 'react-native';

class Blink extends Component {

  constructor(props) {

    super(props);

    this.state = { showText: true };

    // 1000毫秒對showText狀態做一次取反操作

    setInterval(() => {

      this.setState(previousState => {

        return { showText: !previousState.showText };

      });

    }, 1000);

  }

  render() {

    // 根據當前showText的值決定是否顯示text內容

    let display = this.state.showText ? this.props.text : ' ';

    return (

      <Text>{display}</Text>

    );

  }

}

class BlinkApp extends Component {

  render() {

    return (

      <View>

        <Blink text='I love to blink' />

        <Blink text='Yes blinking is so great' />

        <Blink text='Why did they ever take this out of HTML' />

        <Blink text='Look at me look at me look at me' />

      </View>

    );

  }

}

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

實際開發中,我們一般不會在定時器函式(setIntervalsetTimeout等)中來操作state。典型的場景是在接收到伺服器返回的新資料,或者在使用者輸入資料之後。你也可以使用一些“狀態容器”比如Redux來統一管理資料流。

State的工作原理和React.js完全一致,所以對於處理state

樣式

React Native中,你並不需要學習什麼特殊的語法來定義樣式。我們仍然使用JavaScript來寫樣式。所有的核心元件都接受名為style的屬性。這些樣式名基本上是遵循了web上的CSS命名,只是按照JS的語法要求使用了駝峰命名法,例如將 background-color改為backgroundColor

style屬性可以是一個普通的JavaScript物件,這是最簡單的用法,因而在例項程式碼中很常見。你還可以傳入一個數組 — — 在陣列中位置居後的樣式比居前的優先順序更高,這樣你可以間接實現樣式的繼承。

實際開發中元件的樣式會越來越複雜,建議使用StyleSheet.create來集中定義元件的樣式。

import React, { Component } from 'react';

import { AppRegistry, StyleSheet, Text, View } from 'react-native';

class LotsOfStyles extends Component {

  render() {

    return (

      <View>

        <Text style={styles.red}>just red</Text>

        <Text style={styles.bigblue}>just bigblue</Text>

        <Text style={[styles.bigblue, styles.red]}>bigblue, then red</Text>

        <Text style={[styles.red, styles.bigblue]}>red, then bigblue</Text>

      </View>

    );

  }

}

const styles = StyleSheet.create({

  bigblue: {

    color: 'blue',

    fontWeight: 'bold',

    fontSize: 30,

  },

  red: {

    color: 'red',

  },

});

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

常見的做法是按順序宣告和使用style屬性,以借鑑CSS中的“層疊”做法(即後宣告的數學系會顛覆先宣告的同名屬性)