React Native學(xué)習(xí)(三)-- 初識(shí)

1.RN是面向組件開(kāi)發(fā)

2.render()可以理解為一個(gè)函數(shù)玖姑,類似OC中的viewDidLoad()

3.JSX和組件的概念

React 的核心機(jī)制之一就是虛擬DOM:可以在內(nèi)存中創(chuàng)建的虛擬DOM缚陷,React利用虛擬DOM來(lái)減少對(duì)實(shí)際DOM的操作從而提升性能辜膝。傳統(tǒng)的創(chuàng)建方式是:

圖片.png

但這樣的代碼可讀性并不好,于是React發(fā)明了JSX,利用我們熟悉的HTML語(yǔ)法來(lái)創(chuàng)建虛擬DOM:

圖片.png

在實(shí)際開(kāi)發(fā)中,JSX在產(chǎn)品打包階段都已經(jīng)編譯成純JavaScript辅愿,JSX的語(yǔ)法不會(huì)帶來(lái)任何性能影響。因此忆某,JSX本身并不是什么高深的技術(shù)点待,可以說(shuō)只是一個(gè)比較高級(jí)但很直觀的語(yǔ)法糖。

4弃舒、 View組件中常見(jiàn)的屬性

React Native組件View癞埠,其作用等同于iOS中的UIView, Android中的android.view,或是網(wǎng)頁(yè)中的<div>標(biāo)簽聋呢,它是所有組件的父組件苗踪。

Flexbox 彈性布局

Transforms  動(dòng)畫(huà)屬性

backfaceVisibility enum('visible', 'hidden')    定義界面翻轉(zhuǎn)的時(shí)候是否可見(jiàn)

backgroundColor color

borderBottomColor color

borderBottomLeftRadius number

borderBottomRightRadius number

borderBottomWidth number

borderColor color

borderLeftColor color

borderLeftWidth number

borderRadius number

borderRightColor color

borderRightWidth number

borderStyle enum('solid', 'dotted', 'dashed')

borderTopColor color

borderTopLeftRadius number

borderTopRightRadius number

borderTopWidth number

borderWidth number

opacity number 設(shè)置透明度,取值從0-1坝冕;

overflow enum('visible', 'hidden')  設(shè)置內(nèi)容超出容器部分是顯示還是隱藏徒探;

elevation number 高度   設(shè)置Z軸,可產(chǎn)生立體效果喂窟。

5测暗、 View組件運(yùn)用

下圖就是View的基本運(yùn)用:

圖片.png

在圖中的render函數(shù)中,我們返回了一個(gè)頂層的View磨澡,然后View中包含著另一個(gè)子層的View碗啄。
在頂層的View中的style屬性里面設(shè)置了其占滿父控件,內(nèi)邊距為30稳摄,背景顏色為黃色 稚字;對(duì)應(yīng)子層中的View的style屬性中設(shè)置了寬度300,高度50厦酬,背景色為紅色胆描。 這是我們熟悉的css寫(xiě)法。
運(yùn)行結(jié)果如下:

圖片.png

在React Native開(kāi)發(fā)中仗阅,更加推薦我們采用StyleSheet來(lái)進(jìn)行組件的布局昌讲,這樣的話,代碼在結(jié)構(gòu)上會(huì)更加的清晰减噪、也有利于后期維護(hù)短绸。
下面我們采用StyleSheet來(lái)實(shí)現(xiàn)一下:

圖片.png
import React, { Component } from 'react';
import {
  AppRegistry,  // 注冊(cè)
  StyleSheet, // 樣式
  Text,  // 文本組件
  View,   // 視圖組件
  Image,
  TextInput
} from 'react-native';

// 繼承自Component的類AwesomeProject
export default class AwesomeProject extends Component {
  // 初始化方法  用來(lái)返回具體的組件內(nèi)容
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Hello World!
        </Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: 'red',
  },
  welcome: {
    fontSize: 30,
    textAlign: 'center',
    margin: 10,
  }
});

6、Flex布局

之前應(yīng)用到的界面的搭建都是采用CSS布局筹裕,基于盒子模型醋闭,依賴 display屬性 , position屬性朝卒, float屬性证逻。但對(duì)于那些特殊布局非常不方便,比如抗斤,垂直居中囚企。
一種全新的針對(duì)web和移動(dòng)開(kāi)發(fā)布局應(yīng)運(yùn)而生:Flex布局,可以簡(jiǎn)便豪治、完整洞拨、響應(yīng)式地實(shí)現(xiàn)各種頁(yè)面布局。目前负拟,它已經(jīng)得到了所有瀏覽器的支持烦衣,這意味著,現(xiàn)在就能很安全地使用這項(xiàng)功能掩浙。

支持FlexBox布局的主流瀏覽器.png

1)什么是FlexBox
flexible(形容詞):能夠伸縮或者很容易變化花吟,以適應(yīng)外界條件的變化
box(名詞):通用的矩形容器
2)什么是FlexBox布局?
彈性盒模型(The Flexible Box Module),又叫Flexbox,意為“彈性布局”厨姚,旨在通過(guò)彈性的方式來(lái)對(duì)齊和分布容器中內(nèi)容的空間衅澈,使其能適應(yīng)不同屏幕,為盒裝模型提供最大的靈活性谬墙。
Flex布局主要思想是:讓容器有能力讓其子項(xiàng)目能夠改變其寬度今布、高度(甚至是順序)经备,以最佳方式填充可用空間;React native中的FlexBox是這個(gè)規(guī)范的一個(gè)子集部默。
3)大部分情況下是處理圖中FlexItem在FlexContainer中的位置和尺寸關(guān)系

圖片.png

移動(dòng)開(kāi)發(fā)中FlexBox布局非常重要

export default class BViewDemo extends Component {
  render() {
    return (
      <View style={styles.container}>
        {/*<Text>其實(shí)我是存在的</Text>*/}
        <View style={styles.innerViewStyle}>
          <Text>我是里邊的View</Text>
        </View>
        <View style={styles.innerViewStyle2}>
          <Text>我是里邊下面的View</Text>
        </View>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    // flex: 1,
    backgroundColor: 'red',
    width: 300,
    height: 100,
    // 改變主軸方向
    flexDirection: 'row-reverse'
  },
  innerViewStyle: {
    backgroundColor: 'green',
    width: 100,
  },
  innerViewStyle2: {
    backgroundColor: 'yellow',
    width: 100,
  },
});

7侵蒙、Flexbox在開(kāi)發(fā)中的應(yīng)用場(chǎng)景

(1)Flexbox在布局中能夠解決什么問(wèn)題?
浮動(dòng)布局
各種機(jī)型屏幕的適配
水平和垂直居中
自動(dòng)分配寬度
......

(2) 在CSS中傅蹂,常規(guī)的布局是基于塊和內(nèi)聯(lián)流方向纷闺,而Flex布局是基于flex-flow流,下圖很好解釋了Flex布局的思想:

圖片.png

容器默認(rèn)存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開(kāi)始位置(與邊框的交叉點(diǎn))叫做main start份蝴,結(jié)束位置叫做main end犁功;交叉軸的開(kāi)始位置叫做cross start,結(jié)束位置叫做cross end婚夫。
項(xiàng)目默認(rèn)沿主軸排列浸卦,單個(gè)項(xiàng)目占據(jù)的主軸空間叫做main size,占據(jù)的交叉軸空間叫做cross size请敦。

(3)根據(jù)伸縮項(xiàng)目排列方式的不同镐躲,主軸和側(cè)軸方向也有所變化:

圖片.png

8、Flexbox的常用屬性

(1)容器屬性
a) flexDirection: row | row-reverse | column | column-reverse
該屬性決定主軸的方向(即項(xiàng)目的排列方向)侍筛。
row:主軸為水平方向萤皂,起點(diǎn)在左端。
row-reverse:主軸為水平方向匣椰,起點(diǎn)在右端裆熙。
column(默認(rèn)值):主軸為垂直方向,起點(diǎn)在上沿禽笑。
column-reverse:主軸為垂直方向入录,起點(diǎn)在下沿。

圖片.png

b)justifyContent:flex-start | flex-end | center | space-between | space-around
定義了伸縮項(xiàng)目在主軸線的對(duì)齊方式
flex-start(默認(rèn)值):伸縮項(xiàng)目向一行的起始位置靠齊佳镜。
flex-end:伸縮項(xiàng)目向一行的結(jié)束位置靠齊僚稿。
center:伸縮項(xiàng)目向一行的中間位置靠齊。
space-between:兩端對(duì)齊蟀伸,項(xiàng)目之間的間隔都相等蚀同。
space-around:伸縮項(xiàng)目會(huì)平均地分布在行里,兩端保留一半的空間啊掏。

圖片.png

c) alignItems: flex-start | flex-end | center | baseline | stretch
定義項(xiàng)目在交叉軸上如何對(duì)齊蠢络,可以把其想像成側(cè)軸(垂直于主軸)的“對(duì)齊方式”。
flex-start:交叉軸的起點(diǎn)對(duì)齊迟蜜。
flex-end:交叉軸的終點(diǎn)對(duì)齊 刹孔。
center:交叉軸的中點(diǎn)對(duì)齊。
baseline:項(xiàng)目的第一行文字的基線對(duì)齊娜睛。<strong>在RN中不適用</strong>
stretch(默認(rèn)值):如果項(xiàng)目未設(shè)置高度或設(shè)為auto髓霞,將占滿整個(gè)容器的高度卦睹。

圖片.png
export default class CFlexBoxDemo extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={{backgroundColor: 'red', height: 30}}>第一個(gè)</Text>
        <Text style={{backgroundColor: 'green', height: 50}}>第二個(gè)</Text>
        <Text style={{backgroundColor: 'yellow', height: 40}}>第三個(gè)</Text>
        <Text style={{backgroundColor: 'blue', height: 60}}>第四個(gè)</Text>

      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    backgroundColor: 'purple',
    // 上邊距
    marginTop: 25,
    // 改變主軸的方向
    flexDirection: 'row',
    // 設(shè)置主軸線的對(duì)齊方式
    justifyContent: 'space-between',
    // 設(shè)置交叉軸上的對(duì)齊方式,該例子中交叉軸是豎直方法
    alignItems: 'flex-start'
  },
});

d) flexWrap: nowrap | wrap | wrap-reverse
默認(rèn)情況下酸茴,項(xiàng)目都排在一條線(又稱"軸線")上分预。flex-wrap屬性定義兢交,如果一條軸線排不下薪捍,如何換行。

圖片.png

nowrap(默認(rèn)值):不換行配喳。

圖片.png

wrap:換行酪穿,第一行在上方。

圖片.png

wrap-reverse:換行晴裹,第一行在下方被济。(和wrap相反)<strong>在RN中不適用</strong>

圖片.png
class CFlexBoxDemo2 extends Component {
  render() {
    return (
        <View style={styles2.container}>
          <Text style={{backgroundColor: 'red', width: 80}}>第一個(gè)</Text>
          <Text style={{backgroundColor: 'green', width: 90}}>第二個(gè)</Text>
          <Text style={{backgroundColor: 'yellow', width: 100}}>第三個(gè)</Text>
          <Text style={{backgroundColor: 'blue', width: 110}}>第四個(gè)</Text>

        </View>
    );
  }
}

const styles2 = StyleSheet.create({
  container: {
    backgroundColor: 'purple',
    // 上邊距
    marginTop: 25,
    // 改變主軸的方向
    flexDirection: 'row',
    // 設(shè)置主軸線的對(duì)齊方式
    justifyContent: 'flex-start',
    // 設(shè)置交叉軸上的對(duì)齊方式,該例子中交叉軸是豎直方法
    alignItems: 'flex-start',
    flexWrap: 'wrap'
  },
});

(2)元素屬性
a)flex
“flex-grow”涧团、“flex-shrink”和“flex-basis”三個(gè)屬性的縮寫(xiě)只磷, 其中第二個(gè)和第三個(gè)參數(shù)(flex-shrink、flex-basis)是可選參數(shù)泌绣。
默認(rèn)值為“0 1 auto”钮追。
寬度 = 彈性寬度 * ( flexGrow / sum( flexGorw ) )

圖片.png

b)alignSelf: “auto | flex-start | flex-end | center | baseline | stretch”
align-self屬性允許單個(gè)項(xiàng)目有與其他項(xiàng)目不一樣的對(duì)齊方式,可覆蓋align-items屬性阿迈。默認(rèn)值為auto元媚,表示繼承父元素的align-items屬性,如果沒(méi)有父元素苗沧,則等同于stretch刊棕。

圖片.png
class CFlexBoxDemo3 extends Component {
  render() {
    return (
        <View style={styles3.container}>
          <Text style={{backgroundColor: 'red', flex: 1, height: 60, alignSelf: 'flex-start'}}>第一個(gè)</Text>
          <Text style={{backgroundColor: 'green', flex: 2, height: 70, alignSelf: 'flex-end'}}>第二個(gè)</Text>
          <Text style={{backgroundColor: 'yellow', flex: 2, height: 80}}>第三個(gè)</Text>
          <Text style={{backgroundColor: 'blue', flex: 1, height: 90}}>第四個(gè)</Text>

        </View>
    );
  }
}

const styles3 = StyleSheet.create({
  container: {
    backgroundColor: 'purple',
    // 上邊距
    marginTop: 25,
    // 改變主軸的方向
    flexDirection: 'row',
    // 設(shè)置主軸線的對(duì)齊方式
    justifyContent: 'flex-start',
    // 設(shè)置交叉軸上的對(duì)齊方式,該例子中交叉軸是豎直方法
    alignItems: 'center',
  },
});

9待逞、在React Native中使用Flexbox

(1)獲取當(dāng)前屏幕的寬度甥角、高度、分辨率

// 引入
var Dimensions = require('Dimensions')
class CFlexBoxDemo4 extends Component {
  render() {
    return (
        <View style={styles4.outViewStyle}>
          <Text>當(dāng)前屏幕的寬度:{Dimensions.get('window').width}</Text>
          <Text>當(dāng)前屏幕的寬度:{Dimensions.get('window').height}</Text>
          {/*分辨率*/}
          <Text>分辨率:{Dimensions.get('window').scale}</Text>
        </View>
    );
  }
}

const styles4 = StyleSheet.create({
  outViewStyle: {
    // 占滿屏幕
    flex: 1,
    // 主軸方向居中
    justifyContent: 'center',
    // 交叉軸方向居中
    alignItems: 'center'
  },
});
圖片.png
iPhone家族的相關(guān)屏幕參數(shù).png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末识樱,一起剝皮案震驚了整個(gè)濱河市嗤无,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牺荠,老刑警劉巖翁巍,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異休雌,居然都是意外死亡灶壶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)杈曲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)驰凛,“玉大人胸懈,你說(shuō)我怎么就攤上這事∏∠欤” “怎么了趣钱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)胚宦。 經(jīng)常有香客問(wèn)我首有,道長(zhǎng),這世上最難降的妖魔是什么枢劝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任井联,我火速辦了婚禮,結(jié)果婚禮上您旁,老公的妹妹穿的比我還像新娘烙常。我一直安慰自己,他們只是感情好鹤盒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布蚕脏。 她就那樣靜靜地躺著,像睡著了一般侦锯。 火紅的嫁衣襯著肌膚如雪驼鞭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天率触,我揣著相機(jī)與錄音终议,去河邊找鬼。 笑死葱蝗,一個(gè)胖子當(dāng)著我的面吹牛穴张,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播两曼,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼皂甘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了悼凑?” 一聲冷哼從身側(cè)響起偿枕,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎户辫,沒(méi)想到半個(gè)月后渐夸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渔欢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年墓塌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苫幢,死狀恐怖访诱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情韩肝,我是刑警寧澤触菜,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站哀峻,受9級(jí)特大地震影響涡相,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谜诫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一漾峡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喻旷,春花似錦、人聲如沸牢屋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烙无。三九已至锋谐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間截酷,已是汗流浹背涮拗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迂苛,地道東北人三热。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像三幻,于是被迫代替她去往敵國(guó)和親就漾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案念搬? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,728評(píng)論 1 92
  • 前言 學(xué)習(xí)本系列內(nèi)容需要具備一定 HTML 開(kāi)發(fā)基礎(chǔ)抑堡,沒(méi)有基礎(chǔ)的朋友可以先轉(zhuǎn)至 HTML快速入門(mén)(一) 學(xué)習(xí) 本人...
    珍此良辰閱讀 4,511評(píng)論 2 19
  • 前言 在上篇文章里面談了Weex在iOS客戶端工作的基本流程。這篇文章將會(huì)詳細(xì)的分析Weex是如何高性能的布局原生...
    一縷殤流化隱半邊冰霜閱讀 18,982評(píng)論 44 126
  • 本文出自《React Native學(xué)習(xí)筆記》系列文章朗徊。 一款好的APP離不了一個(gè)漂亮的布局首妖,本文章將向大家分享Re...
    CrazyCodeBoy閱讀 37,399評(píng)論 3 278
  • 本文是個(gè)人總結(jié),歡迎大家指正爷恳。 我理解的數(shù)據(jù)價(jià)值和意義:是計(jì)劃有缆、指標(biāo)、動(dòng)機(jī)、行為的結(jié)果妒貌,也就是說(shuō)數(shù)據(jù)背后隱藏者需求...
    徐薇薇閱讀 14,506評(píng)論 7 1