美文网首页RN知识
RN-setNativeProps、LayoutAnimatio

RN-setNativeProps、LayoutAnimatio

作者: 精神病患者link常 | 来源:发表于2017-04-25 18:55 被阅读81次

    在React-Native里面,如果要改变组件的样式可以通过state 或者 props来做到。但有些时候由于性能瓶颈,不得不放弃通过触发render的方式来改样式,而是通过setNativeProps 来直接更改原生组件的样式属性 来达到相同的效果

    setNativeProps可直接改变属性而不调用render方法

    使用条件:

    在(不得不)频繁刷新而又遇到了性能瓶颈的时候,直接操作组件并不是应该经常使用的工具。一般来说只是用来创建连续的动画,同时避免渲染组件结构和同步太多视图变化所带来的大量开销。setNativeProps是一个“简单粗暴”的方法,它直接在底层(DOM、UIView等)而不是React组件中记录state,这样会使代码逻辑难以理清。所以在使用这个方法之前,请尽量先尝试用setStateshouldComponentUpdate方法来解决问题。

    例:用setNativeProps来改变style(背景色和高度)

    _onTouchStart(){
       this._refButton.setNativeProps({
           style:{backgroundColor:'blue',height:300}
       })
    }
    _onTouchEnd(){
       this._refButton.setNativeProps({
           style:{backgroundColor:'red',height:200}
       })
    }
    render() {
            return (
                <View ref={(c) => this._refButton = c}
                      style={styles.container}
                      onTouchStart={(e) => this._onTouchStart(e)}
                      onTouchEnd={(e) => this._onTouchEnd(e)}>
                        <Text> 点击测试 setNativeProps </Text>
                </View>
            );
    }
    const styles = StyleSheet.create({
        container: {
            //flex: 1,
            justifyContent: 'center',
            alignItems: 'center',
            backgroundColor: 'red',
            height:200,
        },
    
    QQ20170425-183139.gif

    so 问题来了 很生硬的有木有,能不能加点过渡效果啊

    Of course

    这就用到了LayoutAnimation,可以和iOS原生的媲美,666

    • LayoutAnimation只对于布局的创建和更新事件才起作用,然而删除事件是不支持的。

    • LayoutAnimation有以下三种动画效果类型:

      • caseInEaseOut
      • linear
      • spring
    • 如果你在Android设备上面进行测试,那么就需要开启动画设置,iOS设备默认打开。具体代码如下:

     // Enable LayoutAnimation under Android
     if (Platform.OS === 'android') {
          UIManager.setLayoutAnimationEnabledExperimental(true)
     }
    
    • 当我们布局需要更新的时候,使用LayoutAnimation进行设置一下动画配置即可如下:
     componentWillUpdate() {
           console.log('componentWillUpdate...');
           LayoutAnimation.easeInEaseOut();
           LayoutAnimation.linear();
           LayoutAnimation.spring();
    
            //或
           LayoutAnimation.configureNext(CustomLayoutAnimation);
     }
    
    • duration 动画持续的时间(毫秒)
    • create 创建一个新视图所使用的动画
    • update 当视图被更新的时候所使用的动画
    • Types : spring,linear,easeInEaseOut,easeIn,easeOut,keyboard
    • Properties : opacity,scaleXY
    var CustomLayoutAnimation = {
        duration: 10,
        create: {
            type: LayoutAnimation.Types.linear,
            property: LayoutAnimation.Properties.opacity,
        },
        update: {
            type: LayoutAnimation.Types.easeInEaseOut,
        },
        delete:{
            type: LayoutAnimation.Types.linear,
            property: LayoutAnimation.Properties.opacity,
        }
    };
    

    以上是LayoutAnimation的介绍及声明

    我们只需要在需要的地方加上

    LayoutAnimation.configureNext(CustomLayoutAnimation
    

    这一句即可

    _onTouchStart(){
       this._refButton.setNativeProps({
           style:{backgroundColor:'blue',height:300}
       });
       LayoutAnimation.configureNext(CustomLayoutAnimation);
    }
    _onTouchEnd(){
       this._refButton.setNativeProps({
           style:{backgroundColor:'red',height:200}
       });
       LayoutAnimation.configureNext(CustomLayoutAnimation);
    }
    
    QQ20170425-185047.gif

    相关文章

      网友评论

        本文标题:RN-setNativeProps、LayoutAnimatio

        本文链接:https://www.haomeiwen.com/subject/ottbzttx.html