ReactNative學(xué)習(xí)筆記1

一、react-native的生命周期

1. getDefaultProps

在組件創(chuàng)建之前,會(huì)先調(diào)用 getDefaultProps() ,全局調(diào)用一次,嚴(yán)格地來(lái)說(shuō),這不是組件的生命周期的一部分。在組件被創(chuàng)建并加載候,首先調(diào)用 getInitialState() ,來(lái)初始化組件的狀態(tài)。

2. componentWillMount

準(zhǔn)備加載組件

3. render

加載組件

4. componentDidMount

組件第一次加載完成后調(diào)用

5. componetWillReceiveProps

當(dāng)組件收到新的屬性,調(diào)用此方法

6. shouldComponentUpdate

這個(gè)函數(shù)的返回值決定是否需要更新組件,如果 true 表示需要更新,繼續(xù)走后面的更新流程。否者,則不更新,直接進(jìn)入等待狀態(tài)。

默認(rèn)情況下,這個(gè)函數(shù)永遠(yuǎn)返回 true 用來(lái)保證數(shù)據(jù)變化的時(shí)候 UI 能夠同步更新。在項(xiàng)目中,你可以自己重載這個(gè)函數(shù),通過(guò)檢查變化前后屬性和狀態(tài),來(lái)決定 UI 是否需要更新,能有效提高應(yīng)用性能。

7. componentWillUpdate

當(dāng)組件狀態(tài)或者屬性改變,并且上面的 shouldComponentUpdate(...) 返回為 true ,就會(huì)開始準(zhǔn)更新組件,并調(diào)用 componentWillUpdate()。

需要特別注意的是,在這個(gè)函數(shù)里面,你就不能使用 this.setState 來(lái)修改狀態(tài)。這個(gè)函數(shù)調(diào)用之后,就會(huì)把 nextProps 和 nextState 分別設(shè)置到 this.props 和 this.state 中。緊接著這個(gè)函數(shù),就會(huì)調(diào)用 render() 來(lái)更新界面了。

8. componentDidUpdate

在render()之后調(diào)用此方法來(lái)得到通知

9. componentWillUnmount()

當(dāng)組件要被界面移除時(shí),調(diào)用此方法。在這個(gè)方法可以做相關(guān)清理工作。

二、props和state

props、state共同來(lái)控制組件數(shù)據(jù)。props是在父組件中指定,而且一經(jīng)指定,在被指定的組件的生命周期中則不再改變。 對(duì)于需要改變的數(shù)據(jù),我們需要使用state。

  • props:大多數(shù)組件在創(chuàng)建時(shí)就可以使用各種參數(shù)來(lái)進(jìn)行定制。用于定制的這些參數(shù)就稱為props(屬性)。屬性定義時(shí)要將屬性名掛載在this.props對(duì)象上,其他組件調(diào)用該組件時(shí),需要指定該屬性的value。

使用示例:

//在被調(diào)用組件中,定義property屬性
export default class PropertyView extends Component{
    
    render(){
        var property =this.props.property;
        var stats= property.bedroom_number+'bed'+property.property_type;
        if (property.bathroom_number){
            stats+=', '+property.bathroom_number+' '+(property.bathroom_number>1
                    ?'bathrooms':'bathroom');
        }

        var price =property.price_formatted.split(' ')[0];

        return(
            <View style={styles.container}>
                <Image style={styles.image}
                source={{uri:property.image_url}}
                />
                <View style={styles.heading}>
                    <Text style={styles.price}>£{price}</Text>
                    <Text style={styles.title}>{property.title}</Text>
                    <Text style={styles.description}>{property.summary}</Text>
                </View>
            </View>
        )
    }
}

//調(diào)用組件中為property屬性賦值
this.props.navigator.push({
            title:"PropertyView",
            component:PropertyView,
            passProps:{
               property:property
            }
        });
  • state:在constructor中初始化state,然后在需要修改時(shí)調(diào)用setState方法。

使用示例:

//在constructor中初始化
constructor(props) {
        super(props);
        this.state = {
            message: ''
        };
    }

//在需要更新數(shù)據(jù)的位置
this.setState({
    message: 'there was a problem with obtaining your location: ' + error
});

三、navigator

安卓中使用Navigator,IOS使用NavigatorIOS

使用示例:

1.在父組件render()中

render() {
    return (
        <Navigator
            initialRoute={{
                title:'Property Finder'
            }}
            renderScene={(route,navigator)=>{
                return<SearchPage/>
            }}

        />
    );
  }

2.在子組件中使用this.props.navigator獲得navigator,
并且可以通過(guò)push和pop方法來(lái)推入或彈出component

this.props.navigator.push({
                title: 'Results',
                component: SearchResults,
                passProps: {
                    //向要推入組件傳遞數(shù)據(jù)
                    listings: response.listings
                }
            });

四、ListView

  • dataSource:列表的數(shù)據(jù)源
  • renderRow:逐個(gè)解析數(shù)據(jù)源中的數(shù)據(jù),然后返回一個(gè)設(shè)定好格式的組件來(lái)渲染。
  • rowHasChanged:必須屬性,比較兩個(gè)item數(shù)據(jù)

使用示例:

class ListViewBasics extends Component {
  // 初始化模擬數(shù)據(jù)
  constructor(props) {
    super(props);
    const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
    this.state = {
      dataSource: ds.cloneWithRows([
        'John', 'Joel', 'James', 'Jimmy', 'Jackson', 'Jillian', 'Julie', 'Devin'
      ])
    };
  }
  render() {
    return (
      <View style={{flex: 1, paddingTop: 22}}>
        <ListView
          dataSource={this.state.dataSource}
          renderRow={(rowData) => <Text>{rowData}</Text>}
        />
      </View>
    );
  }
}

五、學(xué)習(xí)中遇到的問(wèn)題

1.在切換React-native項(xiàng)目時(shí),一定要關(guān)閉上一個(gè)項(xiàng)目的react packager服務(wù)窗口,否則會(huì)出現(xiàn)如下錯(cuò)誤:

Application xxxx has not been registered.This is either due to a require() error during initialization or failure to call AppRegistry.registerComponent.

2.相比Java,JavaScript在出現(xiàn)語(yǔ)法錯(cuò)誤和bug時(shí),更不容易定位到錯(cuò)誤位置,因此在編寫JavaScript時(shí)一定要更加的細(xì)心。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,290評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,510評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,866評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,036評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,331評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,536評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,754評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,273評(píng)論 3 399
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,505評(píng)論 2 379

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