美文网首页
ReactNative特性

ReactNative特性

作者: 952625a28d0d | 来源:发表于2018-04-09 14:22 被阅读18次

    在线模拟器

    http://dabbott.github.io/react-native-web-player/

    • 静态变量声明


      image.png
    • 变量作用域

    • 局部变量,函数结束销毁

    • class内部变量,在单个class内读写,class实例销毁则销毁,需要使用this.来访问

    defaultProps和class内部变量区别

    • defaultProps内部的变量是所有class实例共享的,只有一份

    • 但是class内部声明的变量则是每个实例都会拥有一份的。

    • class外部声明的比如 const d = [1,2,3]; 则在整个文件中都可以使用

    • class外部声明的变量,比如global.c=0 ; 则在整个项目中都可以引用。是作用域最大的变量,但是使用的前提就是只有该句执行之后,才能使用。

    image.png

    class内部成员变量的写法

    image.png

    组件的循环生成,循环生成的组件需要唯一的key值来区分

    import React, { Component } from 'react'
    import {
      AppRegistry,
      StyleSheet,
      Text,
      View,
    } from 'react-native'
    
    const names = ['fage','tingting','xixi','haimian'];
    
    class GoodMorning extends Component {
      static defaultProps = {
        name:'somebody',
      };
      render() {
        return(
          <View style={styles.container}>
            <Text>
              Good, Morning, {this.props.name}!
            </Text>
            </View>
        )
      }
    }
    class App extends Component {
      render() {
        return (
          <View style={styles.container}>
            {
    //         带大括号则写return , 不带大括号则不写,需要注意一下。
            names.map(name=> {
              return <GoodMorning key={name} name={name}/>
            })
            }
          </View>
        )
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
      },
      welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
      },
    })
    
    AppRegistry.registerComponent('App', () => App)
    
    
    image.png
    • 可以使用内容值,也可以使用index下标
    names.map((name,index)=> {
              return <GoodMorning key={name} name={name}/>
    
    • 如果我们在同一个View组件中,循环生成两套组件,会不会造成key值重复的问题呢?
      代码如下:
    import React, { Component } from 'react'
    import {
      AppRegistry,
      StyleSheet,
      Text,
      View,
    } from 'react-native'
    
    const names = ['fage','tingting','xixi','haimian'];
    
    class GoodMorning extends Component {
      static defaultProps = {
        name:'somebody',
      };
      render() {
        return(
          <View style={styles.container}>
            <Text>
              Good, Morning, {this.props.name}!
            </Text>
            </View>
        )
      }
    }
    
    class GoodEvening extends Component {
      static defaultProps = {
        name:'somebody',
      };
      render() {
        return(
          <View style={styles.container}>
            <Text>
              Good, Morning, {this.props.name}!
            </Text>
            </View>
        )
      }
    }
    
    class App extends Component {
      render() {
        return (
          <View style={styles.container}>
            {
    //         带大括号则写return , 不带大括号则不写,需要注意一下。
            names.map((name,index)=> {
              return <GoodMorning key={name} name={name}/>
            })
            }
            
            {
    //         带大括号则写return , 不带大括号则不写,需要注意一下。
            names.map((name,index)=> {
              return <GoodEvening key={name} name={name}/>
            })
            }
          </View>
        )
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
      },
      welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
      },
    })
    
    AppRegistry.registerComponent('App', () => App)
    
    
    • 如上图,key值在两套循环中生成会有重复,但是在同一套循环中生成的Key值没有重复即可。所以,以上是可行的。
    image.png

    state

    • 特性:界面变化刷新靠state

    • state修改靠setState方法

    • 不能直接修改state的值

    • setState是合并操作,可以但修改其中一个值即可,而不会修改其他属性的值

    • setState是异步操作,修改不会直接生效的。那如果想使用修改过后的值判断怎么做呢?使用以下方法即可。

    state = {
        likes:0
      };
    
      onPress = ()=>{
    
        const {likes} = this.state;
    
        const newStates = this.state.likes + 1;
        this.setState({
          likes : newStates,
        });
    
      };
    

    为什么要引入state这个概念呢?

    • 例子:以前写一个界面的刷新,如果是3种状态,则会有9种状态间的变化


      image.png
    • 恶心的代码:


      image.png
    • 使用state刷新呢?则只有三种情况,状态的变化直接影响界面的变化


      image.png
    • 会不会有性能问题?

    • React刷新原理:


      image.png
    • 为什么要指定key值?

    • 旧的刷新机制,也就是不给UI组件指定key值


      image.png
    • 新的刷新机制,也就是给UI组件一个个指定不同的key值,这样就只用刷新key值不同的组件,减少性能开支


      image.png

    相关文章

      网友评论

          本文标题:ReactNative特性

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