ReactNative之基本組件(七)

前言

眼看很多公司都開始嘗試使用ReactNative,達到跨平臺開發,最近也寫了很多文章,希望讓更多想了解的同學快速上手ReactNative.

如果喜歡我的文章,可以關注我微博:袁崢Seemygo

ReactNative之基本組件

一、View

  • View組件在RN開發中是最常用的
    • 一般常用于容器,往里面添加子控件,任何子組件都可以,View里面也可以在放View.
    • 沒有點擊事件,不能監聽點擊。

二、TouchableOpacity

  • TouchableOpacity點擊控件
    • 如果想讓一個沒有點擊事件的組件,能點擊,就需要在外層包裝一個TouchableOpacity,這個View,就能點擊了。
    • 一個View,被TouchableOpacity包裝后,點擊這個View,就會有透明效果,這個效果可以通過activeOpacity屬性調整
    • activeOpacity:不透明度,0~1,1表示不透明,點擊就沒透明效果了。
    • 注意:TouchableOpacity默認點擊區域,就是所有子控件的區域,因為默認一個組件的尺寸由子控件絕對,因此TouchableOpacity也是一樣。
  • 使用
<TouchableOpacity activeOpacity={0.7}>
  <View style={styles.childSytle}>
  </View>
</TouchableOpacity>

2.1 如何監聽TouchableOpacity點擊

  • 注意:onPress與onPressIn,onPressOut,有沖突,不要同時實現
onLongPress function :長按的時候調用

onPress function :點擊的時候調用

onPressIn function :手指按下的時候調用

onPressOut function :手指抬起的時候調用
  • 使用

2.2 disabled屬性

  • 如果設為true,則禁止此組件的一切交互
  • 通過disabled,可以控制一個被TouchableOpacity包裝的組件什么時候能點擊。

Text

  • Text:用于展示一段文字
  • 常用屬性:
numberOfLines:最大行數,超出最大行數,就不會完全顯示,超出部分顯示...
selectable:決定用戶是否可以長按選擇文本,以便復制和粘貼,默認false
suppressHighlighting:默認情況下,文本被按下時會有一個灰色的陰影,如果想取消就設置為true

  • 監聽文字點擊

    • onPress
  • 常用樣式屬性

color:字體顏色

fontSize:字體

fontWeight enum('normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900')
指定字體的粗細。大多數字體都支持'normal'和'bold'值。并非所有字體都支持所有的數字值。如果某個值不支持,則會自動選擇最接近的值。

lineHeight:行高

textAlign enum('auto', 'left', 'right', 'center', 'justify')
指定文本的對齊方式。其中'justify'值僅iOS支持,在Android上會變為left
  • 使用
            <View style={styles.mainViewStyle}>
                <Text style={styles.textStyle}
                      numberOfLines={1}
                      selectable={true}
                      onPress={()=>{alert('點擊文字')}}
                >
                    文本
                </Text>
            </View>

Button

  • Button:按鈕,當一個文字想要點擊效果,可以使用按鈕

  • 注意:Button沒有樣式,設置樣式無效,最大的弊端,開發中一般不使用,一般自定義按鈕,自己包裝一個Text用于按鈕.

  • 常用屬性

color color :文本的顏色(iOS),或是按鈕的背景色(Android)

disabled bool :設置為true時此按鈕將不可點擊

onPress function :用戶點擊此按鈕時所調用的處理函數

title string :按鈕內顯示的文本
  • 使用
 <View style={styles.mainViewStyle}>
                <Button style={styles.buttonSytle} title="按鈕" color="red"/>
 </View>

TextInput

  • TextInput:文本輸入框
    • 默認沒有邊框,需要自己添加borderWidth
  • 常用屬性
autoFocus:自動獲取焦點,如果為true,在componentDidMount后會獲得焦點。默認值為false

blurOnSubmit:點擊鍵盤,右下角return,或者按回車的時候,是否自動退出鍵盤,true:是。注意:鍵盤必須是英文輸入鍵盤,數字鍵盤無效.

editable:文本框是否可以編輯,默認值為true,如果為false,文本框是不可編輯的

keyboardType enum("default", 'numeric', 'email-address', "ascii-capable", 'numbers-and-punctuation', 'url', 'number-pad', 'phone-pad', 'name-phone-pad', 'decimal-pad', 'twitter', 'web-search')  鍵盤類型

maxLength:最大字符數,顯示輸入文本長度

multiline:是否是多行輸入框,默認文本輸入框只能一行,true,就能多行輸入

placeholder:占位文字

placeholderTextColor:占位字符串顯示的文字顏色

returnKeyType enum('done', 'go', 'next', 'search', 'send', 'none', 'previous', 'default', 'emergency-call', 'google', 'join', 'route', 'yahoo') #:決定鍵盤右下角按鈕顯示的內容

secureTextEntry:是否安全輸入,注意:多行無效果

selectionColor:設置光標顏色

clearButtonMode enum('never', 'while-editing', 'unless-editing', 'always') :是否要在文本框右側顯示“清除”按鈕

clearTextOnFocus:每次重新輸入文本框,是否清空之前的文本

enablesReturnKeyAutomatically:如果為true,鍵盤會在文本框內沒有文字的時候禁用確認按鈕。默認值為false
  • 常用方法
clear() :清空輸入框的內容。
  • 監聽文本框事件
onBlur:監聽文本框失去焦點
onChange:當文本框內容變化時調用此回調函數
onChangeText:當文本框內容變化時調用此回調函數。改變后的文字內容會作為參數傳遞
onEndEditing:當文本輸入結束后調用此回調函數
onFocus:當文本框獲得焦點的時候調用此回調函數
onSubmitEditing:此回調函數當軟鍵盤的確定/提交按鈕被按下的時候調用此函數。如果multiline={true},此屬性不可用
onKeyPress:當一個鍵被按下的時候調用此回調。傳遞給回調函數的參數為{ nativeEvent: { key: keyValue } },其中keyValue即為被按下的鍵。會在onChange之前調用
  • 使用
            <View style={styles.mainViewStyle}>
                <TextInput placeholder={'占位文字'}
                           style={styles.textStyle}

                           //multiline={true}
                           clearButtonMode="always"
                           secureTextEntry={true}
                           autoFocus={true}
                           blurOnSubmit={true}
                           selectionColor="red"
                           clearTextOnFocus="true"
                           onBlur={()=>{
                               console.log('文本框失去焦點');
                           }}
                           onChangeText={(text)=>{
                               console.log('文字改變'+text)
                           }}
                           onEndEditing={()=>{
                               console.log('文本框結束編輯');
                           }}
                           onFocus={()=>{
                               console.log('獲取焦點');
                           }}
                           onSubmitEditing={()=>{
                               console.log('點擊提交按鈕');
                           }}


                />
            </View>

ReactNative之基本組件

一、View

  • View組件在RN開發中是最常用的
    • 一般常用于容器,往里面添加子控件,任何子組件都可以,View里面也可以在放View.
    • 沒有點擊事件,不能監聽點擊。

二、TouchableOpacity

  • TouchableOpacity點擊控件
    • 如果想讓一個沒有點擊事件的組件,能點擊,就需要在外層包裝一個TouchableOpacity,這個View,就能點擊了。
    • 一個View,被TouchableOpacity包裝后,點擊這個View,就會有透明效果,這個效果可以通過activeOpacity屬性調整
    • activeOpacity:不透明度,0~1,1表示不透明,點擊就沒透明效果了。
    • 注意:TouchableOpacity默認點擊區域,就是所有子控件的區域,因為默認一個組件的尺寸由子控件絕對,因此TouchableOpacity也是一樣。
  • 使用
<TouchableOpacity activeOpacity={0.7}>
  <View style={styles.childSytle}>
  </View>
</TouchableOpacity>

2.1 如何監聽TouchableOpacity點擊

  • 注意:onPress與onPressIn,onPressOut,有沖突,不要同時實現
onLongPress function :長按的時候調用

onPress function :點擊的時候調用

onPressIn function :手指按下的時候調用

onPressOut function :手指抬起的時候調用
  • 使用

2.2 disabled屬性

  • 如果設為true,則禁止此組件的一切交互
  • 通過disabled,可以控制一個被TouchableOpacity包裝的組件什么時候能點擊。

Text

  • Text:用于展示一段文字
  • 常用屬性:
numberOfLines:最大行數,超出最大行數,就不會完全顯示,超出部分顯示...
selectable:決定用戶是否可以長按選擇文本,以便復制和粘貼,默認false
  • 監聽文字點擊

    • onPress
  • 常用樣式屬性

color:字體顏色

fontSize:字體

fontWeight enum('normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900')
指定字體的粗細。大多數字體都支持'normal'和'bold'值。并非所有字體都支持所有的數字值。如果某個值不支持,則會自動選擇最接近的值。

lineHeight:行高

textAlign enum('auto', 'left', 'right', 'center', 'justify')
指定文本的對齊方式。其中'justify'值僅iOS支持,在Android上會變為left
  • 使用
            <View style={styles.mainViewStyle}>
                <Text style={styles.textStyle}
                      numberOfLines={1}
                      selectable={true}
                      onPress={()=>{alert('點擊文字')}}
                >
                    文本
                </Text>
            </View>

Button

  • Button:按鈕,當一個文字想要點擊效果,可以使用按鈕

  • 注意:Button沒有樣式,設置樣式無效,最大的弊端,開發中一般不使用,一般自定義按鈕,自己包裝一個Text用于按鈕.

  • 常用屬性

color color :文本的顏色(iOS),或是按鈕的背景色(Android)

disabled bool :設置為true時此按鈕將不可點擊

onPress function :用戶點擊此按鈕時所調用的處理函數

title string :按鈕內顯示的文本
  • 使用
 <View style={styles.mainViewStyle}>
                <Button style={styles.buttonSytle} title="按鈕" color="red"/>
 </View>

TextInput

  • TextInput:文本輸入框
    • 默認沒有邊框,需要自己添加borderWidth
  • 常用屬性
autoFocus:自動獲取焦點,如果為true,在componentDidMount后會獲得焦點。默認值為false

blurOnSubmit:點擊鍵盤,右下角return,或者按回車的時候,是否自動退出鍵盤,true:是。注意:鍵盤必須是英文輸入鍵盤,數字鍵盤無效.

editable:文本框是否可以編輯,默認值為true,如果為false,文本框是不可編輯的

keyboardType enum("default", 'numeric', 'email-address', "ascii-capable", 'numbers-and-punctuation', 'url', 'number-pad', 'phone-pad', 'name-phone-pad', 'decimal-pad', 'twitter', 'web-search')  鍵盤類型

maxLength:最大字符數,顯示輸入文本長度

multiline:是否是多行輸入框,默認文本輸入框只能一行,true,就能多行輸入

placeholder:占位文字

placeholderTextColor:占位字符串顯示的文字顏色

returnKeyType enum('done', 'go', 'next', 'search', 'send', 'none', 'previous', 'default', 'emergency-call', 'google', 'join', 'route', 'yahoo') #:決定鍵盤右下角按鈕顯示的內容

secureTextEntry:是否安全輸入,注意:多行無效果

selectionColor:設置光標顏色

clearButtonMode enum('never', 'while-editing', 'unless-editing', 'always') :是否要在文本框右側顯示“清除”按鈕

clearTextOnFocus:每次重新輸入文本框,是否清空之前的文本

enablesReturnKeyAutomatically:如果為true,鍵盤會在文本框內沒有文字的時候禁用確認按鈕。默認值為false
  • 監聽文本框事件
onBlur:監聽文本框失去焦點
onChange:當文本框內容變化時調用此回調函數
onChangeText:當文本框內容變化時調用此回調函數。改變后的文字內容會作為參數傳遞
onEndEditing:當文本輸入結束后調用此回調函數
onFocus:當文本框獲得焦點的時候調用此回調函數
onSubmitEditing:此回調函數當軟鍵盤的確定/提交按鈕被按下的時候調用此函數。如果multiline={true},此屬性不可用
onKeyPress:當一個鍵被按下的時候調用此回調。傳遞給回調函數的參數為{ nativeEvent: { key: keyValue } },其中keyValue即為被按下的鍵。會在onChange之前調用
  • 使用
            <View style={styles.mainViewStyle}>
                <TextInput placeholder={'占位文字'}
                           style={styles.textStyle}

                           //multiline={true}
                           clearButtonMode="always"
                           secureTextEntry={true}
                           autoFocus={true}
                           blurOnSubmit={true}
                           selectionColor="red"
                           clearTextOnFocus="true"
                           onBlur={()=>{
                               console.log('文本框失去焦點');
                           }}
                           onChangeText={(text)=>{
                               console.log('文字改變'+text)
                           }}
                           onEndEditing={()=>{
                               console.log('文本框結束編輯');
                           }}
                           onFocus={()=>{
                               console.log('獲取焦點');
                           }}
                           onSubmitEditing={()=>{
                               console.log('點擊提交按鈕');
                           }}


                />
            </View>

Image

  • Image:用于加載圖片

    • 圖片可以是本地圖片也可以是網絡中的圖片
  • Image常用屬性

source {uri: string}, number : 設置Image圖片資源

blurRadius number:讓圖片模糊

defaultSource  {uri: string, width: number, height: number, scale: number}, number 

占位圖片,在讀取圖片時默認顯示的加載提示圖片

resizeMode enum('cover', 'contain', 'stretch', 'repeat', 'center') 

決定圖片尺寸大小。

cover: 在保持圖片寬高比的前提下縮放圖片,直到寬度和高度都大于等于容器視圖的尺寸(如果容器有padding內襯的話,則相應減去)。譯注:這樣圖片完全覆蓋甚至超出容器,容器中不留任何空白。

contain: 在保持圖片寬高比的前提下縮放圖片,直到寬度和高度都小于等于容器視圖的尺寸(如果容器有padding內襯的話,則相應減去)。譯注:這樣圖片完全被包裹在容器中,容器中可能留有空白

stretch: 拉伸圖片且不維持寬高比,直到寬高都剛好填滿容器。

repeat: 重復平鋪圖片直到填滿容器。圖片會維持原始尺寸。僅iOS可用。

center: 居中不拉伸。

  • 本地圖片存放在哪
    • 1.可以直接存放在RN項目中
存放RN.png
 *  2.可以存放到iOS項目中,打開iOS項目,存入到Images.xcassets文件中
存放iOS項目中.png
*   3.可以存放到安卓項目中,必須放入drawable-xxhdpi文件中
      *    注意安卓的圖片名稱,不能以數字開頭,也不能有大寫字母
          *   自己生成drawable-xxhdpi文件夾,把圖片放進去,然后把文件夾drawable-xxhdpi存放到安卓文件中res文件夾中
存放安卓圖片.png
  • 如何加載本地圖片
    • RN中加載資源:require(文件路徑),用于加載RN中的資源,不管是圖片,還是json都是一樣的
    • uri:指定一個資源路徑,就會自動加載
    • uri加載注意:通過uri加載資源,必須設置圖片尺寸,否則不顯示
    • 如果網絡加載http圖片,iOS默認不支持,需要做配置
iOS加載http圖片.png
<View style={styles.mainViewStyle}>
                <Text>1.加載RN項目的資源</Text>
                <Image source={require('./Img/chaolan.jpeg')} style={styles.imageSytle}/>
                <Text>2.加載App中的資源</Text>
                <Image source={{uri:'wukong'}} style={styles.imageSytle}/>
                <Text>3.加載網絡中的資源</Text>
                {/*https*/}
                {/*<Image source={{uri:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1493026646896&di=b77d170bbb31db812fced6d3b2f24499&imgtype=0&src=http%3A%2F%2Fcnews.chinadaily.com.cn%2Fimg%2Fsite1%2F20170410%2F448a5bd66cd11a556e112b.jpeg'}} style={styles.imageSytle}/>*/}
                {/*http*/}
                <Image source={{uri:'http://img01.youxiaoshuo.com/portal/201703/21/083647y43dl1j14s8s3g99.jpg'}} style={styles.imageSytle}/>
</View>
  • 監聽圖片加載方法
onLoad:圖片加載完成時調用此函數
onLoadStart:圖片加載開始時調用
onLoadEnd:加載結束后,不論成功還是失敗,調用此回調函數
onError:當加載錯誤的時候調用此回調函數,參數為{nativeEvent: {error}}
onProgress:在加載過程中不斷調用,參數為{nativeEvent: {loaded, total}}
  • Image類方法,通過類調用的方法,叫做類方法
static getSize(uri: string, success: (width: number, height: number) => void, failure: (error: any) => void) 

在顯示圖片前獲取圖片的寬高(以像素為單位)。如果圖片地址不正確或下載失敗,此方法也會失敗。

一般在componentDidMount調用,先獲取圖片尺寸,然后在設置圖片尺寸。

要獲取圖片的尺寸,首先需要加載或下載圖片(同時會被緩存起來)。這意味著理論上你可以用這個方法來預加載圖片,雖然此方法并沒有針對這一用法進行優化,而且將來可能會換一些實現方案使得并不需要完整下載圖片即可獲取尺寸。所以更好的預加載方案是使用下面那個專門的預加載方法。
  • 使用
constructor(props){
        super(props)
        Image.getSize('http://img01.youxiaoshuo.com/portal/201703/21/083647y43dl1j14s8s3g99.jpg',(width,height)=>{
                console.log('獲取圖片尺寸')
                console.log(width,height)
        },(error,)=>{

        })
    }


    render() {

        return (
            <View style={styles.mainViewStyle}>
                <Text>1.加載RN項目的資源</Text>
                <Image source={require('./Img/chaolan.jpeg')}
                       style={styles.imageSytle}
                       blurRadius={10}
                />
                <Text>2.加載App中的資源</Text>
                <Image source={{uri:'wukong'}} style={styles.imageSytle}/>
                <Text>3.加載網絡中的資源</Text>
                {/*https*/}
                {/*<Image source={{uri:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1493026646896&di=b77d170bbb31db812fced6d3b2f24499&imgtype=0&src=http%3A%2F%2Fcnews.chinadaily.com.cn%2Fimg%2Fsite1%2F20170410%2F448a5bd66cd11a556e112b.jpeg'}} style={styles.imageSytle}/>*/}
                {/*http*/}
                <Image source={{uri:'http://img01.youxiaoshuo.com/portal/201703/21/083647y43dl1j14s8s3g99.jpg'}}
                       style={styles.imageSytle}
                       defaultSource={{uri:'wukong'}}
                       onLoad={()=>{
                           alert('圖片加載完成');
                       }}
                       onProgress={(e)=>{
                           console.log(e.nativeEvent);
                       }}
                />
            </View>

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

推薦閱讀更多精彩內容