组件的props是只读的,组件不能修改自己的props,在React中,组件可以接受任意的props,如函数,对象,基本类型以及react元素

一.props的使用

1.一些组件并不需要知道自己的children,尤其是像Sidebar和Dialog这通用'boxes'的组件。在这些组件中,我们推荐使用特别的children props直接将孩子元素传递到组件中。

function FancyBorder(props){
return(
<div>
{props.children}
</div>
)
}
function WelcomeDialog(props){
return <FancyBorder>
<h1>Welcome</h1>
<p>Thank you for visiting our spacecraft!</p>
</FancyBorder>
}

在<FancyBorder>中的任何tag都将作为children props传递到FancyBorder组件中

2.你除了可以通过children props直接向组件中传递子元素,你也可以按照你自己的习惯,而不是使用children

function FancyBorder(props){
return <div>
{props.top}
{props.bottom}
</div>
}
function WelcomeDialog(props){
return <FancyBorder top={<Top/>} bottom={<Bottom/>} />
}
function Top(props){
return <p> I am top</p>
}
function Bottom(props){
return <p>I am bottom</p>
}

因为React元素(如:<Top>,<Bottom>)只是对象,所以可以将它们作为props传递到其他组件中

3.在某些情况下可能需要基于一个普通的组件创建出一个特别的组件。如通过Dialog组件创建出WelcomeDialog组件。在这里我们可以通过配置Dialog组件的props创建出特别的
WelcomeDialog组件。

function Dialog(props) {
return (
<FancyBorder color="blue">
<h1 className="Dialog-title">
{props.title}
</h1>
<p className="Dialog-message">
{props.message}
</p>
</FancyBorder>
);
} function WelcomeDialog() {
return (
<Dialog
title="Welcome"
message="Thank you for visiting our spacecraft!" />
);
}

二.propTypes

从React15.5起,React.PropTypes被移入到单独的package中。react提供了一个package(prop-types)去检查props的类型。首先需要将prop-types引用到文件中。

import PropTypes from 'prop-types'

PropTypes暴露了一系列能够确定接受的props是否合法的验证器,出于性能的考虑,PropTypes在开发模式下才会起作用

import PropTypes from 'prop-types'
class Greeting extends React.Component{
render(){
return <div>welcome,{this.props.name}</div>
}
}
Greeting.propTypes = {
name:PropTypes.string
}

prop-types提供了大量的验证器,举例如下:

import PropTypes from 'prop-types'
myComponent.propTypes = {
// 数组
optionalArray: PropTypes.array,
// 布尔值
optionalBool: PropTypes.bool,
// 函数
optionalFunc: PropTypes.func,
// 数值
optionalNumber: PropTypes.number,
// 对象
optionalObject: PropTypes.object,
// 字符串
optionalString: PropTypes.string,
// symbol
optionalSymbol: PropTypes.symbol,
// 能够被渲染的数值,字符串,元素或者包含这些类型的数组
optionalNode: PropTypes.node,
// React元素
optionalElement: PropTypes.element,
// optionalMessage是Message类的实例
optionalMessage: PropTypes.instanceOf(Message),
// optionalEnum为['News', 'Photos']中的其中一个
optionalEnum: PropTypes.oneOf(['News', 'Photos']),
//optionalUnion要么为字符串,要么为数值,要么为Message实例
optionalUnion: PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
PropTypes.instanceOf(Message)
]),
// optionalArrayOf是数值类型的数组
optionalArrayOf: PropTypes.arrayOf(PropTypes.number),
// optionalObjectOf的属性是数值
optionalObjectOf: PropTypes.objectOf(PropTypes.number),
// requiredFunc是函数,且必须提供。isRequired可以链接到任何值后面
requiredFunc: PropTypes.func.isRequired,
// requiredAny可以是任何类型,且必须提供
requiredAny: PropTypes.any.isRequired,
// 自定义验证器。customProp中必须包含matchme
customProp: function(props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
return new Error(
'Invalid prop `' + propName + '` supplied to' +
' `' + componentName + '`. Validation failed.'
);
}
},
// 自定义数组,对象类型的验证器
// 验证器会调用数组或者对象中的每一个值
// customArrayProp中的每一个值都要包含matchme
customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
if (!/matchme/.test(propValue[key])) {
return new Error(
'Invalid prop `' + propFullName + '` supplied to' +
' `' + componentName + '`. Validation failed.'
);
}
})
}

给props指定默认值

通过组件的defaultProps属性可以给组件的props指定默认值

import PropTypes from 'prop-types'
class Greeting extends React.Component{
render(){
return <div>welcome,{this.props.name}</div>
}
}
Greeting.defaultProps = {
name:'lili'
}

React——props的使用以及propTypes的更多相关文章

  1. React组件属性部类(propTypes)校验

    React组件属性类型(propTypes)校验 Prop 验证 随着应用不断变大,保证组件被正确使用变得非常有用.为此我们引入propTypes.React.PropTypes 提供很多验证器 (v ...

  2. React.js 小书 Lesson24 - PropTypes 和组件参数验证

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson24 转载请注明出处,保留原文链接和作者信息. 我们来了到了一个非常尴尬的章节,很多初学的朋友 ...

  3. React中静态类型校验 - PropTypes

    1.基本说明PropTypes定义为组件类自身的属性,用以定义prop的类型.在开发模式下,当提供一个不合法的值作为prop时,控制台会出现警告: 在产品模式下,为了性能考虑应忽略propTypes ...

  4. react Props 验证 propTypes,

    <body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ...

  5. react~props和state的介绍与使用

    props是参数的传递,从上层模块向下层模块进行拿传递:而state是提局域变量,一般在本模块内使用,props是不能改变的,而state可以通过setState去修改自身的值. props Reac ...

  6. 混合开发的大趋势之 一个Android程序员眼中的 React.js 箭头函数,const, PropTypes

    转载请注明出处:王亟亟的大牛之路 昨天写了篇React.js的开头之作,讲了讲块级作用域和let,先安利:https://github.com/ddwhan0123/Useful-Open-Sourc ...

  7. react props与render成员函数

    props是组件固有的属性集合,其数据由外部传入,一般在整个组件的生命周期中都是只读的,React的API顶层设计也决定了这一点.属性初值通常由React.createElement函数或者JSX中标 ...

  8. React props

    class WebSite extends React.Component { constructor() { super(); this.state = { name: "菜鸟教程&quo ...

  9. React props传变量

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

随机推荐

  1. 【Maven】项目中没有resources目录

    在eclipse中创建maven项目,src/main/只有java没有resources目录 解决办法: 1.项目右键properties 2.Java Build Path 中移除JRE Syst ...

  2. 图解如何安装MySQL5.0

    如何安装MySQL5.0数据库.. mysql-5.5.50-winx64下载地址: http://www.jb51.net/softs/363920.html 我的电脑因为提前安装了.所以需要卸载一 ...

  3. .NET Core+Selenium+Github+Travis CI => SiteHistory

    前言 总是三分钟热度的我折腾了一个可以每天自动截取指定网站页面并保存到Github的项目SiteHistory,感觉挺好(每次都这样). 想知道YouTube今天的首页长啥样么?点此查看 想知道You ...

  4. SoapUI进行接口测试,怎么应对接口地址总是变化!

    如果是没有代码能力的小白,要利用工具进行接口测试的时候,经常会遇到接口地址或者接口参数变化的问题,然后不得不在他们改了接口之后,就手动去改所有的请求链接地址和接口参数!1-5个请求,我们手动改还应付的 ...

  5. Java初学者必知 关于Java字符串问题

    摘自 http://developer.51cto.com/art/201503/469443.htm 下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学 ...

  6. [2017-08-28]Abp系列——业务异常与错误码设计及提示语的本地化

    本系列目录:Abp介绍和经验分享-目录 前言 ABP中有个异常UserFriendlyException经常被使用,但是它所在的命名空间是Abp.UI,总觉得和展现层联系过于紧密,在AppServic ...

  7. awk知识点全回顾

    本文目录:1.awk简介和基本语法格式2.print和printf格式化输出3.输入行的字段分隔符和行分隔符4.BGEIN和END5.数组6.流程控制语句 6.1 条件判断语句 6.2 while循环 ...

  8. c# List集合中First、Last、Single方法使用

    操作符 如果源序列是空的 源序列只包含一个元素 源序列包含多个元素 First 抛异常 返回该元素 返回第一个元素 FirstOrDefault 返回default(TSource) 返回该元素 返回 ...

  9. 我的hibernate学习记录(二)

    通过上一篇文章我的hibernate学习记录(一)基本上的入门了hibernate,但是,里面还有还多东西是通过迷迷糊糊的记忆,或者说copy直接弄进去的,所以这篇文章就需要对上篇的一些文件.对象进行 ...

  10. 提高SQL执行效率的16种方法

      项目中优化sql语句执行效率的方法:1)尽量选择较小的列2)将where中用的比较频繁的字段建立索引3)select子句中避免使用'*'4)避免在索引列上使用计算.not in 和<> ...