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阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容