react-native--04基礎(chǔ)組件

Props(屬性)

通過屬性控制表現(xiàn)

大部分的組件(Components)都可以通過參數(shù)靈活的定制它們的行為呼胚,這參數(shù)被稱之為props朗兵。

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);

這段代碼中的組件是Image膳音, 屬性是 source达皿、style姐刁。
花括號{}是變量引用的模版語法逊移,它還擁有一個能力就是任何javascript的表達式都能包裹,例如: {\n}龙填、 { {width: 193, height: 110} }胳泉、 {VARIABLE}拐叉。
注意: style={{ }} 如果理解為 {{ }} 是變量引用是錯誤的(它不是python),因為 style 要么支持一個對象扇商,要么支持一個字典凤瘦,如果填寫變量的話應(yīng)該是{styles.welcome},如果是一個字典的話 { {width: 193, height: 110} }案铺。

通過屬性擴展自定義組件
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);

State(狀態(tài))

在react native中蔬芥,通過利用 propsstate 這兩個數(shù)據(jù)類型,來控制一個組件的數(shù)據(jù)動態(tài)實時的展示控汉,其中props一般用于更新數(shù)據(jù)笔诵,state用于更新表現(xiàn)。

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

class Blink extends Component {
    constructor(props) {
        super(props);
        this.state = {showText: true};

        // Toggle the state every second
        setInterval(() => {
            this.setState({ showText: !this.state.showText });
        }, 1000);
    }

    render() {
        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('rn_practice', () => BlinkApp);

代碼分析

  1. constructor是EcmaScript 2015版本中新增的特性<構(gòu)造器>姑子,常用于繼承(inheritance 需配合super)和共享屬性(properties)乎婿。
  2. let display = this.state.showText ? this.props.text : ' '; 這里采用了條件運算符, 當 this.state.showText 為True時, 將this.props.text賦值給dispaly街佑,否則將 ' ' 賦值給display谢翎。
  3. setInterval 是EcmaScript/Javascript中的一個內(nèi)置函數(shù),用于根據(jù)給定時間持續(xù)輪詢執(zhí)行內(nèi)嵌代碼塊沐旨。 setInterval有一個規(guī)律森逮,那就是必須等待當前所有代碼已經(jīng)執(zhí)行完畢后(也就是當前線程空閑之后),才開始執(zhí)行磁携,并且不會停下來褒侧,除非我們明確的指定了clearInterval之后才會停下來。下面提供一個樣例代碼和結(jié)果進行說明:

    文件名testInterval.js

       setInterval(function () {
           console.log('hello world!')
       }, 100);
       
       for (let i=0; i<100000; i++) {
           console.log('hello'+i)
       }
    

    執(zhí)行文件

    C:\WebstormProjects\ecmascript_practice>node --harmony  testInterval.js
    

    輸出結(jié)果

    hello0
    hello1
    ...
    ...
    hello99999
    hello world!
    hello world!
    hello world!
    hello world!
    
  4. !this.state.showText 這段代碼用于取相反值谊迄,整一個代碼塊的意思是璃搜,每一秒鐘去修改一次setState的只,且每次都是返回相反值鳞上。
     // Toggle the state every second
     setInterval(() => {
         this.setState({ showText: !this.state.showText });
     }, 1000);   
    
  5. this.state 雖然我沒有看到說明这吻,但經(jīng)測試每次發(fā)生變更時,都會重新執(zhí)行一次render()篙议。這里提供一個樣例代碼來說明測試結(jié)論唾糯。
    測試樣例代碼
    測試樣例代碼

測試日志

測試日志

另外react native官網(wǎng)重點聲明鬼贱,不可以通過 this.state = 'xxx'來直接篡改狀態(tài)值移怯,而應(yīng)該是通過 this.setState() 來改變。

補充:
<React Native 跨平臺移動應(yīng)用開發(fā)>一書中(2.7章節(jié)/37-41頁)这难,詳細的說明了狀態(tài)的行為和表現(xiàn)舟误。

  • render 是渲染UI界面。
  • this.state 組件狀態(tài)姻乓,當該狀態(tài)發(fā)生變更后嵌溢,會要求render重新渲染眯牧,通過這種方式達到數(shù)據(jù)與ui保持一致。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赖草,一起剝皮案震驚了整個濱河市学少,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秧骑,老刑警劉巖版确,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乎折,居然都是意外死亡绒疗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門骂澄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吓蘑,“玉大人,你說我怎么就攤上這事酗洒。” “怎么了枷遂?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵樱衷,是天一觀的道長。 經(jīng)常有香客問我酒唉,道長矩桂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任痪伦,我火速辦了婚禮侄榴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘网沾。我一直安慰自己癞蚕,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布辉哥。 她就那樣靜靜地躺著桦山,像睡著了一般。 火紅的嫁衣襯著肌膚如雪醋旦。 梳的紋絲不亂的頭發(fā)上恒水,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音饲齐,去河邊找鬼钉凌。 笑死,一個胖子當著我的面吹牛捂人,可吹牛的內(nèi)容都是我干的御雕。 我是一名探鬼主播矢沿,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饮笛!你這毒婦竟也來了咨察?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤福青,失蹤者是張志新(化名)和其女友劉穎摄狱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體无午,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡媒役,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宪迟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酣衷。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖次泽,靈堂內(nèi)的尸體忽然破棺而出穿仪,到底是詐尸還是另有隱情,我是刑警寧澤意荤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布啊片,位于F島的核電站,受9級特大地震影響玖像,放射性物質(zhì)發(fā)生泄漏紫谷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一捐寥、第九天 我趴在偏房一處隱蔽的房頂上張望笤昨。 院中可真熱鬧,春花似錦握恳、人聲如沸瞒窒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽根竿。三九已至,卻和暖如春就珠,著一層夾襖步出監(jiān)牢的瞬間寇壳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工妻怎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留壳炎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像匿辩,于是被迫代替她去往敵國和親腰耙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容