props and state new example

[转载]https://www.jianshu.com/p/3cb5026edee8

  1. props传值,直接在组件初始化的时候赋予参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/react.development.js"></script>
    <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/react-dom.development.js"></script>
    <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/babel.min_.js"></script>
    </head>
    <body>
    <div id="wrap"></div>
    </body>
    <script type="text/babel">
    class MyComponent extends React.Component {
    //此处的构造器是可以省略的
    constructor(props){
    super(props);
    }
    render() {
    return <div>好神奇! {this.props.siteName}!</div>;
    }
    }
    var element = <MyComponent siteName="zhangpeiyue.com"/>;
    ReactDOM.render(
    element,
    document.querySelector("#wrap")
    );
    </script>
    </html>
  2. 通过defaltProps 添加默认的props

defaultProps是一个对象,放添加的值到defaultProps的属性中即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyComponent extends React.Component {
render() {
//此处返回 <div>小张今年18岁了</div>
return <div>
{this.props.userName}今年{this.props.age}岁了!
</div>;
}
}
//为组件添加默认属性 userName与age
MyComponent.defaultProps={
userName:"小张",
age:18
}
var element = <MyComponent/>;
ReactDOM.render(
element,
document.querySelector("#wrap")
);

  1. 可以通过父组件设置state,然后子组件通过props接收父组件的state值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    //父组件
    class MyComponent extends React.Component {
    constructor(){
    super();
    //设置sate,添加name与age属性
    this.state={
    name:"张培跃",
    age:18
    }
    }
    render() {
    return <div>
    <Name name={this.state.name}/>
    <Age age={this.state.age}/>
    </div>;
    }
    }
    //子组件Name
    class Name extends React.Component{
    render(){
    return <div>{this.props.name}</div>
    }
    }
    //子组件Age
    class Age extends React.Component{
    render(){
    return <div>{this.props.age}</div>
    }
    }
    var element = <MyComponent/>;
    ReactDOM.render(
    element,
    document.querySelector("#wrap")
    );

4.使用propTypes进行类型检测

React提供了可以对Props进行验证的功能PropTypes。PropTypes为组件类自身的属性,提供了很多验证器,来验证传入的数据是否有效。当传入的数据无效时,JavaScript控制台会抛出警告。
另外需要注意的是,在开发环境下,当你使用了一个无效的值作为prop时,控件台会出现警告;在生产环境下,为了性能考虑会将PropTypes忽略掉!
要想使用propTypes,首先要对prop-type.js文件进行引入。

1
<script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/prop-types.js"></script>

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var name="老大"
var age=18;
class MyComponent extends React.Component {
render() {
return <div>
{this.props.name}今年{this.props.age}岁了!
</div>;
}
}
//propTypes是组件类的静态属性
MyComponent.propTypes={
//将name设置为string类型
name:PropTypes.string,
//将age设置为number类型
age:PropTypes.number
};
var element = <MyComponent name={name} age={age} />;
ReactDOM.render(
element,
document.querySelector("#wrap")
);

以上示例当中的name与age不合法时,会弹出类型不符的警告!所以在项目开发中使用PropTypes进行对props的验证还是很有好处的!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
More Validator:
MyComponent.propTypes = {
// 可以声明 prop 为指定的 JS 基本数据类型,默认情况,这些数据是可选的
optionalArray: React.PropTypes.array,
optionalBool: React.PropTypes.bool,
optionalFunc: React.PropTypes.func,
optionalNumber: React.PropTypes.number,
optionalObject: React.PropTypes.object,
optionalString: React.PropTypes.string,

// 可以被渲染的对象 numbers, strings, elements 或 array
optionalNode: React.PropTypes.node,

// React 元素
optionalElement: React.PropTypes.element,

// 用 JS 的 instanceof 操作符声明 prop 为类的实例。
optionalMessage: React.PropTypes.instanceOf(Message),

// 用 enum 来限制 prop 只接受指定的值。
optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),

// 可以是多个对象类型中的一个
optionalUnion: React.PropTypes.oneOfType([
React.PropTypes.string,
React.PropTypes.number,
React.PropTypes.instanceOf(Message)
]),

// 指定类型组成的数组
optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),

// 指定类型的属性构成的对象
optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),

// 特定 shape 参数的对象
optionalObjectWithShape: React.PropTypes.shape({
color: React.PropTypes.string,
fontSize: React.PropTypes.number
}),

// 任意类型加上 `isRequired` 来使 prop 不可空。
requiredFunc: React.PropTypes.func.isRequired,

// 不可空的任意类型
requiredAny: React.PropTypes.any.isRequired,

// 自定义验证器。如果验证失败需要返回一个 Error 对象。不要直接使用 `console.warn` 或抛异常,因为这样 `oneOfType` 会失效。
customProp: function(props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
return new Error('Validation failed!');
}
}
}
}

现在我们来总结下,props与state的区别:

props是指组件间传递的一种方式,props自然也可以传递state。由于React的数据流是自上而下的,所以是从父组件向子组件进行传递;另外组件内部的this.props属性是只读的不可修改!
state是组件内部的状态(数据),不能够直接修改,必须要通过setState来改变值的状态,从而达到更新组件内部数据的作用。

props和state是经常要结合使用的,父组件的state可以转化为props来为子组件进行传值。在这种情况下,子组件接收的props是只读的,想要改变值,只能通过父组件的state对其进行更改。