ReactNative學習筆記2

一、Flexbox布局

1.容器屬性

(1)flexDirection
  • row 水平布局
  • column 豎直布局(默認方式)
(2)flexWrap

決定其子元素沿著軸線的排列成一行或者空間不夠后自動換行

  • nowrap 不自動換行(默認方式)
  • wrap 自動換行
(3)justifyContent

決定其子元素沿著主軸的排列方式

  • flex-start
  • center
  • flex-end
  • space-around
  • space-between
(4)align-items

決定其子元素沿著交叉軸的排列方式

  • flex-start
  • flex-end
  • center
  • baseline
  • stretch

2.元素屬性

(1)alignSelf

允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。

  • auto (默認方式)
  • flex-start
  • center
  • flex-end
  • stretch
(2)圖片
  • contain
  • cover
  • stretch
(3)定位(相對定位和絕對定位)

和top、left配合使用

  • absolute
  • relative
(4)text

Text之間存在屬性繼承

  • textAlign enum("auto", 'left', 'right', 'center')
  • lineHeight number
  • writingDirection enum("auto", 'ltr', 'rtl')
  • numberOfLines number( 需要放在最外層的Text元素上,且雖然截取了文字但是還是會占用空間)

3.公共屬性

(1)flex

權重,類似安卓布局中的layout_weight屬性。

(2) 盒子模型(margin和padding)

和Android、css中一樣

二、ListView-多個布局樣式

1.數據結構

目前支持如下的數據結構

  • { sectionID_1: { rowID_1: rowData1, ... }, ... }
  • { sectionID_1: [ rowData1, rowData2, ... ], ... }
  • [ [ rowData1, rowData2, ... ], ... ]

大多數情況下我們會用到第二種(字典套數組)和第三種(純數組),每一個數組對應的key系統會自動提取成sectionId。然后我們可以根據sectionId來判斷所加載的section。

如果是純數組(無section),使用cloneWithRows(dataBlob, rowIdentities) 該方法接收兩個參數,dataBlob是原始數據源。在沒有section的時候使用此方法,傳入一個數組。rowIdentities為可選類型,為數據源的每一項指明一個id。默認的id為字符串'0','1','2'...dataBlob.count。

如果是字典套數組的結構(有section),我們使用下面的方法為數據源賦值。sectionIdentities和rowIdentities都是可選類型。 cloneWithRowsAndSections(dataBlob, sectionIdentities, rowIdentities)

代碼示例:

//數據結構
const datas={
    sectionWithTitle:[
        {
            title:'精選菜單',
            pic:'http://image.hongbeibang.com/FjigYOhuPOLLS6M4F5ejd6psqCcI?801X312&imageMogr2/strip/thumbnail/750x750'
        },
        {
            title:'熱門菜單',
            pic:'http://image.hongbeibang.com/Fof924bIoB1hqE2MTs38bBcGEzk3?802X313&imageMogr2/strip/thumbnail/750x750'
        }
    ],
    sectionWithoutTitle:[
        {
            pic:'http://image.hongbeibang.com/FqBRH1E0EP2I488s7DXww1RVGQOF?801X311&imageMogr2/strip/thumbnail/750x750'
        },
        {
            pic:'http://image.hongbeibang.com/FulhGNdLtEmHKTKkLX0cLjlH9Wxi?802X312&imageMogr2/strip/thumbnail/750x750'
        },
        {
            pic:'http://image.hongbeibang.com/FkC4ySvlw9--96qkfJfFNeG9AgMa?800X313&imageMogr2/strip/thumbnail/750x750'
        }
    ]
};

//構造方法
constructor(props){
        super(props);
        const ds = new ListView.DataSource(
            {
                rowHasChanged:(r1,r2)=>r1!==r2,//判斷不同item行是否相同
                sectionHeaderHasChanged:(s1,s2)=>s1!==s2//不同之處,還應判斷section是否相同
            });

        this.state={
            dataSource:ds,
            isLoaded:false
        }
    }

//渲染方法
render() {

        if(!this.state.isLoaded){
            return this.renderLoading()
        }

        return (
            <ListView
                dataSource={this.state.dataSource}
                renderRow={(rowData,sectionId,rowId)=>this.renderSections(rowData,rowId,sectionId)}//注意不同之處。可以拿到sectId
            />
        );
    }

 //更新數據
  componentDidMount(){

        var that = this;
        var change =function () {
            that.setState({
                dataSource:that.state.dataSource.cloneWithRowsAndSections(datas),//注意調用方法的差別
                isLoaded:true
            })
        };

        setTimeout(change,1000);

    }       

三、封裝獨立組件

父組件向子組件傳值方式:props(上一篇文章已總結過)

子組件向父組件傳值

  • 1.EventEmitter
    簡單的觀察者模式。發送端發送通知,接收端接受到通知后,通過狀態機來改變渲染。發送端和接受端同時需要引入DeviceEventEmitter組件。

代碼示例:

//父組件
DeviceEventEmitter.addListener("監聽事件名",(來自子組件的參數1,來自子組件的參數2,...)=>{
    //父組件收到數據后進行操作
})

//子組件
DeviceEventEmitter.emit("監聽事件名",傳遞給父組件的參數1,傳遞給父子組件的參數2,...)
  • 2.callback

代碼示例:

//第一個頁面
ToNextView(){
    this.props.navigator.push({
        component:NextView,
        passProps:{
            callback:((接受的參數)=>{
                this.seedToSecond(接受的參數)
            })
        }
    })
}

//第二個頁面
popToHome(){
    this.props.navigatior.pop();
    this.props.callback('要傳遞的參數')
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容