美文网首页ReactNative使用手册Android技术知识Android开发
ReactNative从零到完整项目-state使用详解

ReactNative从零到完整项目-state使用详解

作者: laer_L | 来源:发表于2018-03-02 10:22 被阅读181次

    项目连接: 93Laer/MyDemo

    前言:在安卓中我们可以通过自定义一个属性例如一个Boolean来标识是否刷新数据更新视图,但是在RN中props一经指定在生命周期类是不会再发生变化的,所以我们要达到和安卓一样的效果是不能通过props来做的,RN专门为我们提供了state这个字段

    state: 是RN 专门用来标识是否重新渲染,通过属性的值来更新数据,React 内部会监听 state 的变化,一旦发生变化就会主动触发组件的 render() 方法来更新 Dom 结构,另外state是组件私有的,是没有办法通过其他组件传递过来的。

    state的使用:

    • 1、构造器外面
    export default class StateTest extends Component {
    
    //方式一
            state = {
                num: 0
            }
    
    
        // 构造
        constructor(props) {
            super(props);
            // 每1000毫秒对num+1
            setInterval(() => {
                this.setState(previousState => {
                    return {num: ++this.state.num};
                });
            }, 1000);
        }
    
        render() {
            var msg = this.state.num
            return (
                <Text size={32} color= {'red'}>{msg}</Text>
            );
        }
    }
    
    • 2、方式二构造器内(建议这样)
    
        // 构造
        constructor(props) {
            super(props);
    
    //方式二
            this.state = {
                num: 0
            }
    
            // 每1000毫秒对num+1
            setInterval(() => {
                this.setState(previousState => {
                    return {num: ++this.state.num};
                });
            }, 1000);
        }
    
    
     // 每1000毫秒对num+1
            setInterval(() => {
                //这种方式修改state是无效的,必须调用setState()才能起作用
                //this.state= ++this.state.num;
    
                //this.setState(previousState => {
                //    return {num: ++this.state.num};
                //});
                //也可以这样写,这样写也就可以直接拿到props,有可能我们的业务需要用到props
                this.setState((prevState, props) =>{
                    return {num: ++this.state.num};
                } );
            }, 1000);
    

    prevState 是一个对之前状态(previous state)的引用,我们是不能直接修改这个参数的值,要想修改 state 的值,我们应该根据 prevState 和 props 参数来创建一个新的 JavaScript 对象,例如:return {num: ++this.state.num};

    既然 我们要创建一个JavaScript对象,上面我们是通过一个函数来创建的,当然我们可以直接传入一个对象,而不是一个函数,例如:

    this.setState({num: 18});
    

    但是我们一般应该不会这样写,毕竟我们在改变视图的时候肯定会有一些逻辑需要处理

    特别提示:作为一个安卓开发,我们第一反应要改变state,可能是以以下方式来处理的

      // 每1000毫秒对num+1
            setInterval(() => {
                //这种方式修改state是无效的,必须调用setState()才能起作用
                this.state= ++this.state.num;
    
                //this.setState(previousState => {
                //    return {num: ++this.state.num};
                //});
            }, 1000);
    

    说明:setState() 方法会把对组件 state 的改变加入到队列中,并且告诉 React 这个组件及其子组件需要重新渲染,React 并不能保证 setState() 一被调用 state 就能更新。所以,如果在调用 setState() 之后,马上就读取 this.state 的值的话,可能会出现误差,所以setState(updater, callback) 方法的第二个参数 callback 是一个可选参数,暂时未找到使用实例。

    相关文章

      网友评论

        本文标题:ReactNative从零到完整项目-state使用详解

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