最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • React Native入门详解--基础组件的使用

    正文概述 掘金(_光光)   2021-03-31   788

    本文中会介绍一些RN中基础组件和这些组件常规的需求,该教程默认你具备一定的ReactJS使用经验。

    RN常用组件

    1、View组件和组件的样式

    View是RN中最基础的组件,类似于html中的div标签,他可以作为组件的容器。

    组件样式

    • 大部分组件的样式通过组件的style属性来控制,style的值可以为数组也可以为对象
    • 样式属性key要遵循小驼峰命名法
    • style的值为对象时,对象的key为样式属性value则为样式的值;当style的值为数组时,数组的元素必须为对象,并且当数组中多个对象具有相同的样式属性时,后面对象的样式属性会覆盖前面对象的。
       import { View } from 'react-native'
      {/*style值为对象    生成一个宽为200dp,高为100dp背景色为粉色的View组件*/}
       <View style={{height:100,width:200,backgroundColor:"pink"}}><View>  
       
      {/*style值为数组    生成一个宽为200dp,高为200dp背景色为红色的View组件*/}
       <View style={[
           {height:100,width:200,backgroundColor:"pink"},
           {height:200,backgroundColor:"red"}
       ]}><View>
      
    • 某些具有多种特性 复杂样式的值必须为数组,如transform
      <View style={{
          height:100,
          width:200,
          backgroundColor:"pink",
          transform:[{translateX:100}]
      }}><View>  
      

    内联式样式

    如上,直接在style中书写样式对象就是内联式写法,这种适合样式少,样式简单的组件使用

    样式对象式样式

    • 有些组件样式比较复杂如果写在jsx结构上,会让组件结构复杂增加阅读成本
    • 某些样式是可以被其他组件复用不需要多次数书写。为了解决这些问题我们可以用样式对象式样式
    {/*导入创建样式对象的 StyleSheet*/}
    import { View,StyleSheet, } from 'react-native'
    <View style={styles.container}>
        <View style={styles.content}</View>
    <View>
    {/*创建样式对象*/}
    const styles = StyleSheet.create({
        container:{
            width:100,
            height:200
        },
        content:{
            width:50,
            height:50
        }
    })
    

    组件布局

    RN有三种布局方式:常规的布局、Flex布局、定位布局

    Flex布局

    常规属性:
    flex:同css的flex属性用法类似
    flexDirection:RN没有display:flex用法,flexDirection就是将当前盒子设为伸缩盒子,并设置主轴方向

    • 值:row | column | row-reverse | column-reverse

    justifyContent:同css的flex属性用法类似
    alignItems:同css的flex属性用法类似 flexWrap:同css的flex属性用法类似
    alignSelfflex-start | flex-end | center

    定位布局

    position:同css的position属性,但是没有fixed值

    2、Text组件

    在RN的很多组件内没法直接显示文字内容,我们需要使用Text组件来显示文字

    组件常规属性

    numberOfLines:文本行数限制,超出的内容以省略号形式显示
    ellipsizeMode:设置文本缩略格式,配合numberOfLines使用

    • 值:tail:在末尾...省略(默认值)| clip:在末尾切割,直接切割字符无省略符 | head:在前面...省略 | middle:在中间...省略

    onPress:点击事件

    组件样式属性

    color:字体颜色
    fontSize:字体大小
    fontFamily:字体
    fontStyle:字体样式(normal:正常italic:斜体)
    fontWeight:设置字体粗体(normal:正常bold:粗体100,200,300, 400, 500, 600, 700, 800, 900)
    lineHeight:行高
    textAlign:对齐方式(auto:自动对齐left:左对齐right:右对齐 center:居中对齐 justify:仅ios支持 两端对齐) textDecorationLine:文字下划线和删除线样式(none:无线underline:下划线line-through:删除线 underline line-through:下划线和删除线)

    3、Image组件

    组件属性

    source:图片的资源,使用本地图片时需要先将图片导入当前组件中然后绑定到source上;使用网络图片时,source需要绑定一个具有uri字段的对象 这个uri就是图片URL

    组件样式属性

    resizeMode:图片显示模式

    • contain:保持宽高缩放图片,使图片的长边能完全显示出来
    • cover:保持宽高缩放图片,使图片的短边能完全显示出来,裁剪长边
    • stretch:图片将完全显示出来并拉伸变形铺满整个屏幕
    • repeat:图片将重复并铺满屏幕(只支持ios)
    • center:图片不拉伸不缩放且居中
    import { Image } from 'react-native'
    {/* 本地图片 */}
    const img1 = require("../asstes/img1.png")  
    <Image source={img1} />  
    <Image source={require("../asstes/img.png")} />  
    {/* 网络图片 */}
    <Image source={{uri:"http:ww......."}} />
    

    4、TouchAbleopacity组件

    某些组件没有点击相关的事件,我们可以将其嵌套TouchAbleopacity组件中使用点击等相关能力

    组件常规属性

    activeOpacity:设置组件在进行触摸的时候,显示的不透明度(取值在0~1之间)
    onPress:触摸事件触发时执行的回调
    onPressIn:手指按下时触发的回调 onPressOut:手指松开时触发的回调

    function Home() {
        const hPress = () => {console.log("touch事件被触发了")}
        return <TouchableOpacity activeOpacity={1} onPress={hPress}>
            <View style={{width:100,height:200}}></View>  
        </TouchableOpacity>
    }
    

    5、ScrollView组件

    如果你的页面需要滚动(不管是水平还是竖直方向),你都可以使用这个组件.
    ScrollView组件滚动有两个前提:

    • 它自身有一个固定的高度或宽度
    • 它的内容高度或宽度 超过他自身的高度或宽度

    组件常规属性

    horizontal:控制滚动的方向(true:水平滚动,false:竖向滚动,默认是false)
    onScroll:滚动事件触发时的回调
    keyboardDismissMode:当拖拽滚动视图时,是否要隐藏软键盘

    • none:(默认值),拖拽时不隐藏软键盘
    • on-drag:当拖拽开始的时候隐藏软键盘
    • interactive:(仅ios),软键盘伴随拖拽操作同步地消失,上滑动会恢复键盘

    keyboardShouldPersistTaps:点击ScrollView是否收起软键盘,TextInput无法自动失去焦点/需点击多次才切换到其他组件原因就是没有TextInput放入ScrollView中。

    组件方法

    scrollTo(x,y,naimate):让ScrollView滚动到指定位置的方法,参数1:X轴坐标,参数2:Y轴坐标 参数3:滚动是否启用平滑动画
    scrollTo({x: 0, y: 0, animated: true})
    注意:指定滚动持续时间的示例(仅限 Android):
    scrollTo({x: 0, y: 0, duration: 500})

    实例

    import React, { useEffect, useRef } from 'react'
    import { View, Text, StyleSheet, ScrollView } from 'react-native'
    // 引入适配工具
    import pxTodp from '../../utils/adaptive';
    export default function Home(props) {
     const myScrollViewNode = useRef()
     useEffect(() => {
       // 页面初始,让ScrollView滚动到 X:200 Y:0 的位置
       myScrollViewNode.current.scrollTo({ x: 200, y: 0, animated: true })
     }, [])
     const dataList = [{ text: "box1" }, { text: "box2" }, { text: "box3" }, { text: "box4" }, { text: "box5" }, { text: "box6" }, { text: "box7" },]
     const hScroll = (e) => {
      // 获取组件位置和尺寸
       console.log("获取组件位置和尺寸", e.nativeEvent);
     }
     return (
       <View>
         <ScrollView horizontal={true} onScroll={hScroll} ref={myScrollViewNode}>
           { dataList.map(e => {
               return <View key={e.text} style={{ backgroundColor: 'pink', width: pxTodp(200), height: pxTodp(200), flexDirection: "row", justifyContent: "center", alignItems: "center" }}>
                 <Text style={{ height: pxTodp(100), width: pxTodp(100), textAlign: "center", lineHeight: pxTodp(100), backgroundColor: "powderblue" }}>{e.text}</Text>
               </View>
             })}
         </ScrollView>
       </View>
     )
    }
    

    React Native入门详解--基础组件的使用

    6、TextInput组件

    组件常规属性

    placeholder:输入框的占位符
    placeholderTextColor:占位字符串显示的文字颜色 autoFocus:是否在componentDidMount后会获得焦点,默认false multiline:文本框中可以输入多行文字。默认值为 false。 value:输入框的显示内容
    onChangeText:输入框内容被改变时触发的回调

    组件样式属性

    paddingVertical:去除内边距,在安卓中,你可能会出现TextInput占位符显示不全的问题,可以通过 paddingVertical:0 解决这个问题

    数据双向绑定示例

    import React, { useState } from 'react'
    import { View, Text, TextInput } from 'react-native'
    // 引入适配工具
    import pxTodp from '../../utils/adaptive';
    export default function Home(props) {
      const [state, setState] = useState({ value: "11" })
      const hChangeText = (e) => {
        // 获取输入框最新数据 并更新state.value
        setState(oldState => ({ ...oldState, value: e }))
      }
      return (
        <View style={{ height: pxTodp(400), marginTop: pxTodp(100), backgroundColor: "pink" }} >
          <Text>TextInput组件:</Text>
          {/* 将state.value绑定到 TextInput组件上 */}
          <TextInput onChangeText={hChangeText} value={state.value} placeholder="这是占位符" style={{ backgroundColor: "powderblue" }}></TextInput>
        </View >
      )
    }
    

    7、StatusBar组件

    它是控制应用状态栏的组件,他可以在任何视图加载,当有多个状态栏组件时,后加载的会覆盖前面的这点 在使用导航器的时候需要注意。

    组件常规属性

    animated:状态栏的某些属性变化时,是否以动画形式呈现默认为false,目前支持的属性:backgroundColor, barStyle 和 hidden。
    translucent:状态栏背景是否透明,默认false(仅安卓)
    backgroundColor:状态栏背景色(仅安卓)
    barStyle:状态栏文本颜色:default | light-content | dark-content
    hidden:是否显示状态栏,默认false

    8、Animated组件

    Animated组件对安卓和ios动画的封装,通过统一的接口为RN提供了的动画的功能

    值类型

    • Animated.Value() 用于单个值
    • Animated.ValueXY() 用于矢量值

    AnimatedValue.setValue(newValue):在不触发动画的情况下修改动画的值

    配置动画

    RN提供了三种类型动画,并对其进行配置

    • Animated.decay(value, config):以指定的初始速度开始变化,然后变化速度越来越慢直至停下
    • Animated.spring(value,config):提供了一个基础的弹簧物理模型
    • Animated.timing(value,config):使用easing 函数让数值随时间动起来。它默认使用对称的easeInOut 曲线,将对象逐渐加速到全速,然后通过逐渐减速停止结束。
      • value:需要被更改的动画值
      • config:动画配置对象
        • duration:动画的持续时间(毫秒)。默认值为 500
        • easing:缓动函数。 默认为Easing.inOut(Easing.ease)。
        • delay: 开始动画前的延迟时间(毫秒)。默认为 0.
        • isInteraction:指定本动画是否在InteractionManager的队列中注册以影响其任务调度。默 认值为 true。
        • useNativeDriver: 启用原生动画驱动。默认不启用(false)。

    大部分业务场景用 Animated.timing() 就足够了,这里重点介绍一下它。

    执行动画

    Animated.timing().start()
    配置动画完成后,调用start方法就会执行这个动画,start可以传入一个回调函数,当动画结束后会执行这个回调,同时向这个回调传入动画执行的状态{finished:false | true}

    Animated.timing({}).start(({ finished }) => {
      /* 动画完成的回调函数 */
    });
    

    动画组件

    在RN中,组件必须通过特殊处理才能使用动画。Animated提供了几个可以直接使用的组件:Animated.ImageAnimated.ScrollViewAnimated.TextAnimated.View
    如果内置的动画组件无法满足你,你可用通过 createAnimatedComponent() 自己封装动画组件

    示例1

    这个一个简单的动画示例,会将组件通过scale属性实现组件从小到大的动画。点击红色按钮开始执行动画,点击绿色按钮将组件恢复到动画之前的状态。

    React Native入门详解--基础组件的使用

    import React, { useEffect, useRef } from 'react'
    import { View, Text, Animated } from 'react-native'
    // 引入适配工具
    import pxTodp from '../../utils/adaptive';
    let scaleAnimate = new Animated.Value(0)
    const handleAnimate = () => {
      // 点击粉色按钮配置动画,并执行它
      Animated.timing(scaleAnimate, { duration: 1000, toValue: 1, useNativeDriver: false }).start()
    }
    const resetAnimate = () => {
      // 将动画值设置为0
      scaleAnimate.setValue(0)
    }
    export default function Home(props) {
      return (
        <View style={{ backgroundColor: "gray", flex: 1 }}>
          <View style={{ width: pxTodp(540), height: pxTodp(540), backgroundColor: "white", flexDirection: "row", justifyContent: "center", alignItems: "center" }}>
            <Animated.View style={{ width: pxTodp(200), height: pxTodp(200), backgroundColor: "pink", transform: [{ scale: scaleAnimate }] }}></Animated.View>
          </View>
          <View style={{ marginTop: pxTodp(50), flexDirection: "row", justifyContent: "space-between", paddingLeft: pxTodp(60), paddingRight: pxTodp(60) }}>
            <Text onPress={handleAnimate} style={{ backgroundColor: "pink", color: "white", borderRadius: pxTodp(10), width: pxTodp(120), height: pxTodp(50), lineHeight: pxTodp(50), textAlign: "center" }}>执行动画</Text>
            <Text onPress={resetAnimate} style={{ backgroundColor: "green", color: "white", borderRadius: pxTodp(10), width: pxTodp(120), height: pxTodp(50), lineHeight: pxTodp(50), textAlign: "center" }}>重置动画</Text>
          </View>
        </View>
      )
    }
    
    

    差值

    有些动画效果无法通过纯数字来实现,例如颜色的渐变,0deg-180deg角度的变化,你可以通过差值来实现。 它是指将一定范围的输入值映射到另一组不同的输出值,一般我们使用线性的映射,但是也可以使用 easing 函数
    AnimateValue.interpolate({ inputRange: [0,1], outputRange: [0,300]})

    • inputRange:输入值的区间
    • inputRange:输出值的区间

    AnimateValue.interpolate({ inputRange: [0,1], outputRange: ["rgba(0,0,0,.1)","rgba(255,255,255,1)"]})
    AnimateValue.interpolate({ inputRange: [0,1], outputRange: ["0deg","300deg"]})
    interpolate()还支持定义多个区间段落,常用来定义静止区间
    AnimateValue.interpolate({ inputRange: [-300, -100, 0, 100, 101], outputRange: [300, 0, 1, 0, 0] });
    这样当AnimateValue=-400时输出值为450;当AnimateValue=-300时输出值为300;当AnimateValue=0时输出值为1;当AnimateValue=100时输出值为0;当AnimateValue大于100时输出值为0;

    示例

    基于缩放的动画值,创建颜色渐变和旋转角度的差值
    React Native入门详解--基础组件的使用

    import React, { useEffect, useRef } from 'react'
    import { View, Text, StyleSheet, ScrollView, Animated } from 'react-native'
    // 引入适配工具
    import pxTodp from '../../utils/adaptive';
    let scaleAnimate = new Animated.Value(0)
    // 颜色渐变差值映射动画
    let colorAnimate = scaleAnimate.interpolate({
      inputRange: [0, 1.5],
      outputRange: ["green", "red"]
    })
    // 旋转角度差值映射动画
    let rotateAnimate = scaleAnimate.interpolate({
      inputRange: [0, 1.5],
      outputRange: ["0deg", "360deg"]
    })
    const handleAnimate = () => {
      // 点击粉色按钮配置动画,并执行它
      Animated.timing(scaleAnimate, { duration: 3000, toValue: 1.5, useNativeDriver: false }).start()
    }
    const resetAnimate = () => {
      // 将动画值设置为0
      scaleAnimate.setValue(0)
    }
    export default function Home(props) {
      return (
        <View style={{ backgroundColor: "gray", flex: 1 }}>
          <View style={{ width: pxTodp(540), height: pxTodp(540), backgroundColor: "white", flexDirection: "row", justifyContent: "center", alignItems: "center" }}>
            <Animated.View style={{ width: pxTodp(200), height: pxTodp(200), backgroundColor: colorAnimate, transform: [{ scale: scaleAnimate, }, { rotate: rotateAnimate }] }}></Animated.View>
          </View>
          <View style={{ marginTop: pxTodp(50), flexDirection: "row", justifyContent: "space-between", paddingLeft: pxTodp(60), paddingRight: pxTodp(60) }}>
            <Text onPress={handleAnimate} style={{ backgroundColor: "pink", color: "white", borderRadius: pxTodp(10), width: pxTodp(120), height: pxTodp(50), lineHeight: pxTodp(50), textAlign: "center" }}>执行动画</Text>
            <Text onPress={resetAnimate} style={{ backgroundColor: "green", color: "white", borderRadius: pxTodp(10), width: pxTodp(120), height: pxTodp(50), lineHeight: pxTodp(50), textAlign: "center" }}>重置动画</Text>
          </View>
        </View>
      )
    }
    

    最后

    相信大家的RN搭建过程可能会不太顺利,如果有需要帮助或者技术上交流的同猿欢迎加 V: gg_0632


    起源地下载网 » React Native入门详解--基础组件的使用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元