RN學(xué)習(xí)文檔

一、React Native配置環(huán)境

  1. React Native中文網(wǎng): http://reactnative.cn/docs/0.41/getting-started.html
  2. React Native環(huán)境配置(簡書):http://www.reibang.com/p/ab07248f6741

二、引入第三方庫 / 組件

第三方庫引入

npm install name(三方庫名) --save 安裝的同時丛忆,將信息寫入package.json中

組件引入(自定義組件)

import TextInputView from '../../components/EF_TextInputView'

三檀头、setState渲染問題

每次調(diào)用this.setState丁眼,都會自動調(diào)用render函數(shù)睛蛛,重新渲染一下界面活合。
(Tip:ListView如果使用這種方法将宪,必須更改一下數(shù)據(jù)源绘闷,但不建議多次使用這種方式渲染界面,可以使用Mbox,學(xué)習(xí)網(wǎng)址:http://v.youku.com/v_show/id_XMjQ4NTA4OTUwOA==.html?spm=a2hzp.8253869.0.0&from=y1.7-2)

    constructor(props) {
        super(props);
        this.state = {
            isLoading: true, // 下拉刷新數(shù)據(jù)標(biāo)記
        };
    }
    _this.setState({
          isLoading: false,
   })

四涧偷、頁面?zhèn)髦祮栴}

1.直接傳值

例如下側(cè)代碼中的 albumId= {this.props.albumId}簸喂,=前面表示參數(shù)名,后面表示要傳的數(shù)據(jù)燎潮。

<AlertCell
     modalVisible={this.state.modalVisible}
     navigator={this.props.navigator}
     coverType= {this.props.coverType}
     headerPhoto= {this.props.headerPhoto}
     albumId= {this.props.albumId}
     photosArr={photosArr}
     dataArr={dataArr}
     albumTitle={this.props.title1}
     albumDesc={this.props.albumDesc}
     {...this.props}
           onClose={() => {
                this.setState({modalVisible: false})
}}/>
2.跳轉(zhuǎn)頁面?zhèn)髦?/h5>

使用Navigator進(jìn)行頁面跳轉(zhuǎn)喻鳄,進(jìn)行傳值時,

Navigator的使用

    /*
     * 設(shè)置Navigator轉(zhuǎn)場方式
     * */
    configureScene = (route, routeStack) => {
        if (route.type == 'bottom') {
            return Navigator.SceneConfigs.FloatFromBottom; // 底部彈出
        } else if (route.type == 'fade') {
            return Navigator.SceneConfigs.FadeAndroid; // 淡入淡出
        }
        return Navigator.SceneConfigs.PushFromRight; // 右側(cè)彈出
    };

    /*
     * 傳值
     * */
    renderScene = (route, navigator) => {
        return <route.component navigator={navigator}  {...route.passProps} />;//傳值(使用時參數(shù)名passProps要與這里統(tǒng)一)
    };

    render() {
        return (
            <View style={{flex: 1}}>
                <Navigator
                    style={{flex: 1}}
                    initialRoute={{component: Main}}//初始界面
                    configureScene={this.configureScene}
                    renderScene={this.renderScene}/>
                {/*加載全局的頂部提示框組件*/}
                <TopAlertBox />
            </View>
        )
    }

傳值

   var navigator = this.props.navigator;
   navigator.push({
        title: '',
        component: CreateAlbumView,
        passProps: {
             title1: '新建相冊',
             navigator: navigator,
             data: this.data,
        },
        type: 'bottom'
    })
3.反向傳值

界面一:

   var navigator = this.props.navigator;
   navigator.push({
        title: '新建相冊',
        component: CreateAlbumView,
        passProps: {
             title1: '',
             navigator: navigator,
             // 反向傳值
             getAlbum: function(albumData) {
                 albumArr.push(albumData);
                 _this.setState({
                       dataSource: ds.cloneWithRows(albumArr),
                 })
             }
        },
        type: 'bottom'
    })

界面二:

    _this.props.getAlbum(albumData);
         if (_this.props.navigator) {
               _this.props.navigator.pop();
   }
4.通知傳值

引入RCTDeviceEventEmitter

import RCTDeviceEventEmitter from 'RCTDeviceEventEmitter'

設(shè)置監(jiān)聽

    componentDidMount() {
        let me = this;
        // 刪除相冊
        this.delete_listener = RCTDeviceEventEmitter.addListener('刪除相冊',         function(albumId) {
            for (let i = 0; i < albumArr.length; i++) {
                if (albumArr[i].id === albumId) {
                    albumArr.splice(i, 1);
                }
            }
            me.setState({
                dataSource: ds.cloneWithRows(albumArr),
            })
        });
        // 編輯相冊
        this.edit_listener = RCTDeviceEventEmitter.addListener('編輯相冊', function(albumId, params) {
            for (let i = 0; i < albumArr.length; i++) {
                if (albumArr[i].id === albumId) {
                    albumArr[i].albumTitle = params.albumtitle;
                    albumArr[i].coverType = 1;
                    albumArr[i].albumCover = params.albumcover;
                }
            }
            me.setState({
                dataSource: ds.cloneWithRows(albumArr),
            })
        });
    }
    componentWillUnmount() {
        this.delete_listener.remove();
        this.edit_listener.remove();
    }

發(fā)通知

 RCTDeviceEventEmitter.emit('編輯相冊', _this.state.albumId, params);

五确封、封裝數(shù)據(jù)請求

     /*
     *  post請求發(fā)送說說
     *  params:參數(shù)
     *  callback:回調(diào)函數(shù)
     * */
    static postShortposts(params, callback) {
        url = API + 'shortposts/';
        let paramsStr = '';

        console.log('參數(shù):' + JSON.stringify(params));
        if (params) {
            let paramsArray = [];
            //拼接參數(shù)
            Object.keys(params).forEach(key => paramsArray.push(key + '=' + params[key]))
            paramsStr += paramsArray.join('&');
        }

        console.log('url:  ' + url);
        console.log('body:  ' + paramsStr);
        //fetch請求
        fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: paramsStr,
        })
            .then((response) => response.json())
            .then((responseJSON) => {
                callback(responseJSON)
            }).done();
    }

六除呵、flex布局

對于學(xué)習(xí)過CSS的人,直接按照以前的方式理解就行
http://reactnative.cn/docs/0.41/layout-with-flexbox.html#content

七爪喘、this指向問題

this在RN中就是指這個類本身,但是經(jīng)常會報(bào)一些錯誤:not an object(this.)或者not a funcation等,這類問題一般有兩種解決辦法

1.在render中里面調(diào)用方法的時候,使用this.方法名.bind(this),重新綁定一下this

2.在方法里面, let _this = this,使用_this來調(diào)用本身類

八颜曾、性能優(yōu)化問題

1、聲明方法函數(shù)時秉剑,要盡量使用 方法名= ()=> {}泛豪,這樣會減少方法引用的次數(shù)。然后在調(diào)用的時候侦鹏,直接使用this.方法名即可诡曙。

2、只有 shouldComponentUpdate 返回true的時候才會更新頁面略水。价卤。比較this.props的isClicked屬性(屬性看自己情況而定)與newProps的isClicked屬性是否相同。

shouldComponentUpdate(newProps, newState){
        if(swllowArrayCompare(this.props.isClicked, newProps.isClicked)){
                renturn  true;
        }
        return false;
   }

3渊涝、使用屬性的時候慎璧,如果不需要重新渲染的屬性,直接在state外面聲明即可跨释,調(diào)用的時候 this.屬性名胸私,這樣就不會調(diào)用render函數(shù)了,不會重新渲染界面鳖谈。

4岁疼、在render中使用const {屬性}= this.prps,直接使用屬性名就可以調(diào)用蚯姆。這樣可以不用再state里面使用了五续,減少了渲染的次數(shù)。

5龄恋、推遲render的過程疙驾,在數(shù)據(jù)請求完之后,使用InteractionManager.runAfterInteractions( ()=> {this.setStates({})})

6郭毕、使用mbox它碎,只改變需要改變的,不重新全部渲染显押。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扳肛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乘碑,更是在濱河造成了極大的恐慌挖息,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兽肤,死亡現(xiàn)場離奇詭異套腹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)资铡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門电禀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笤休,你說我怎么就攤上這事尖飞。” “怎么了店雅?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵政基,是天一觀的道長。 經(jīng)常有香客問我底洗,道長腋么,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任亥揖,我火速辦了婚禮珊擂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘费变。我一直安慰自己摧扇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布挚歧。 她就那樣靜靜地躺著扛稽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滑负。 梳的紋絲不亂的頭發(fā)上在张,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天用含,我揣著相機(jī)與錄音,去河邊找鬼帮匾。 笑死啄骇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘟斜。 我是一名探鬼主播缸夹,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼螺句!你這毒婦竟也來了虽惭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛇尚,失蹤者是張志新(化名)和其女友劉穎芽唇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佣蓉,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡披摄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了勇凭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疚膊。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虾标,靈堂內(nèi)的尸體忽然破棺而出寓盗,到底是詐尸還是另有隱情,我是刑警寧澤璧函,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布傀蚌,位于F島的核電站,受9級特大地震影響蘸吓,放射性物質(zhì)發(fā)生泄漏善炫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一库继、第九天 我趴在偏房一處隱蔽的房頂上張望箩艺。 院中可真熱鬧,春花似錦宪萄、人聲如沸艺谆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽静汤。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虫给,已是汗流浹背藤抡。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抹估,地道東北人杰捂。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像棋蚌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挨队,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理谷暮,服務(wù)發(fā)現(xiàn),斷路器盛垦,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 自己最近的項(xiàng)目是基于react的湿弦,于是讀了一遍react的文檔,做了一些記錄(除了REFERENCE部分還沒開始讀...
    潘逸飛閱讀 3,390評論 1 10
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容腾夯,還有我對于 Vue 1.0 印象不深的內(nèi)容颊埃。關(guān)于...
    云之外閱讀 5,050評論 0 29
  • 以下內(nèi)容是我在學(xué)習(xí)和研究React時,對React的特性蝶俱、重點(diǎn)和注意事項(xiàng)的提取班利、精練和總結(jié),可以做為React特性...
    科研者閱讀 8,233評論 2 21
  • 有什么東西榨呆,在心里罗标,應(yīng)時常記起,卻沒記起积蜻。在活著闯割,跳動著,卻會偶爾失去記憶竿拆。 還以為宙拉,已經(jīng)忘記,其實(shí)發(fā)現(xiàn)丙笋,它在那里...
    天然愛蘇三閱讀 201評論 0 2