深入浅出React和Redux(一) prop和state

2018-08-18  本文已影响0人  土豪码农

买了本书,好好来深入浅出一下吧!
react和vue一样,最核心的一个就是组件化的思想,每个组件分而治之,把一个个小的模块最后组成一个大的作品,有利于复用和各种维护

从第二章开始记录起
如何吧一个个组件串联起来,最后组成一个完整的作品呢?首先要解决每个组件间的联系吧!

prop

这个用于接收组件外部的数据,接收了数据就可以处理或者展示.当然如果组件要把数据返回给外部,也是可以用prop的

传递prop值
<Mycomponent num={10}></Mycomponent>

这就是一个封装好的组件,传值的时候可以支持任何js的数据类型,只要不是字符串都用大括号包着

读取prop值
class MyComponent extends Component {
    constructor(props) {
        super(props)
        this.state = {
            num : props.num
        }
    }
    render() {
        return (
            <div className="MyComponent">
                <p>{this.state.num}</p>//或者直接调用this.props.num也是可以的
            </div>
        );
    }
}

constructor是构造函数,书上写着,如果要定义构造函数第一行就要super(props)调用一下,否则就无法通过props读取到传值,当然如果不调用constructor的话,也是不用super的

propTypes检测

读取和传递都解决了,但是肯定要对传递的数据做一个规范,
1,组件支持哪些prop
2.每个prop应该是怎么样的格式
要引入propTypes,然后通过下面的方法设置一下就可以设置传递的参数,即使你不按照规则,好像页面也不会有问题,只是console里面会报错而已,propTypes原来只是辅助开发功能而已,并不能强硬的限制传递的参数

import React, {Component} from 'react';
import propTypes from 'prop-types';


class MyComponent extends Component {
    render() {
        return (
            <div className="MyComponent">
                <p>{this.props.num}</p>
            </div>
        );
    }
}
MyComponent.propTypes = {
    num:propTypes.number
}
export default MyComponent;

上面就是外部传递的数据了,接下来到内部自己处理的数据,为什么需要这个呢,因为外部传递的prop是不能修改的,所以要把它赋值给内部的state里面,然后就可以随意使用的修改了

组件的state

初始化state

通常会在组件的构造函数结尾初始化state

import React, {Component} from 'react';
class MyComponent extends Component {
    constructor(props){
        super(props)
        this.state={  //必须是一个对象
            num:props.num || 0  //这里是初始化state的地方,因为也有可能不会传值,所以要||
        }
    }
    render() {
        return (
            <div className="MyComponent">
                <p>{this.state.num}</p>
            </div>
        );
    }
}

MyComponent.defaultProps={
    num:5  //也可以利用这种设定去设置如果没有接收的参数设置为
}

export default MyComponent;
读取和更新state

更新state要调用一个叫setState的方法,按下面的方式调用一下就可以了

addNum = () =>{
        this.setState(
            {num:this.state.num+1}
        )
    }

至于为什么要调用呢?不可以直接赋值呢?在vue里面都是直接赋值直接更新的

addNum = () =>{
        this.state.num = this.state.num++
    }

像这种方式呢,其实state的数据是变了的,但是只是没有触发更新,要调用setState去刷新就可以看到数据的变化,这个和vue就有点不太一样了,但是感觉这样性能应该会高一点,当我需要的时候再去调用更新,和vue实时监测更新,这个应该是更加节省性能!

总结一下:prop是外部传递的数据,state是内部储存和处理的数据,并且组件最好不要去改prop的数据,因为这样会导致各种混乱

上一篇下一篇

猜你喜欢

热点阅读