主要对props更多重要的特性进行学习;

还是用之前代码,

index.js代码为:

var React = require('react');
var ReactDOM = require('react-dom');
import ComponentHeader from './components/header';
import ComponentFooter from './components/footer.js';
import BodyIndex from './components/BodyIndex.js'; class Index extends React.Component{
render(){
return(
<div>
<ComponentHeader/>
<BodyIndex/>
{/*在这里给footer组件,添加props外来属性*/}
<ComponentFooter userid={123456}/>
</div>
);
}
}
//与app.html进行一个绑定
ReactDOM.render(<Index/>,document.getElementById('test'));

footer.js的代码为:

import React from 'react';
import ReactDOM from 'react-dom'; export default class ComponentFooter extends React.Component{
constructor(){
super();
this.state = {
username:"azedada",
age:24
}
} render(){
return(
<div>
<h1>这里是底部</h1>
<p>接收到父页面的属性:{this.props.userid}</p>
</div>
)
} }

1.判断类型

现在我们需要对父页面传来的 userId进行 类型判断,只能接受number类型的:

由于React.PropTypes不再适用于React v15.5,改用prop-types库,我们进行配置npm install prop-types -D

import React from 'react';
import ReactDOM from 'react-dom';
//引用prop-types
import PropTypes from 'prop-types'; export default class ComponentFooter extends React.Component{ render(){
return(
<div>
<h1>这里是底部</h1>
{/*接收的userId只能为number类型*/}
<p>接收到父页面的属性:{this.state.username}:{this.state.age},{this.props.userid}</p>
</div>
)
};
}
//对类型的判断,es6的写法
//注意:React.PropTypes不再适用于React v15.5,改用prop-types库; npm install prop-types -D
ComponentFooter.propTypes={
userid:PropTypes.number
}

运行结果:如果userid为number类型则正常,如果为其他类型则报错;

2.当其他人通过父页面调用子页面,忘记传userid了,但是我们需要他必须传,这时候需要用到isRequired属性

(下面代码就在上面基础上直接修改)

//对类型的判断,es6的写法
//注意:React.PropTypes不再适用于React v15.5,改用prop-types库; npm install prop-types -D
ComponentFooter.propTypes={
userid:PropTypes.number.isRequired
}

运行结果:如果userid存在则正常,如果没有则会发出warning警告;

3.如果父页面还有一个username,它不强制必须有,我们可以给它一个默认值,下面是footer.js的代码

import React from 'react';
import ReactDOM from 'react-dom';
//引用prop-types
import PropTypes from 'prop-types'; //给父页面username的值赋一个默认值
const defaultProps={
username:"这是一个默认值"
} export default class ComponentFooter extends React.Component{
constructor(){
super();
this.state = {
username:"azedada",
age:24
}
} //事件函数 改变state的age
changeAge(){
this.setState({age:18})
} render(){
return(
<div>
<h1>这里是底部</h1>
<p>{this.state.username}:{this.state.age}</p>
{/*接收的userId只能为number类型*/}
<p>接收到父页面的属性:{this.props.userid},{this.props.username}</p>
{/*这里写点击事件,注意写法是es6*/}
<input type="button" value="点击改变年龄" onClick={this.changeAge.bind(this)}/>
</div>
)
};
}
//对类型的判断,es6的写法
//注意:React.PropTypes不再适用于React v15.5,改用prop-types库; npm install prop-types -D
ComponentFooter.propTypes={
userid:PropTypes.number.isRequired
}
//对username赋默认值
ComponentFooter.defaultProps=defaultProps;

运行结果:如果父页面index.js没有传username,则会显示"这是一个默认值",如果传入了"内容",则被"内容"替换;

4.父页面传入的所有数据,注意是所有数据,子页面接收到后,继续传给子页面的子页面;即index.js--->footer.js--->footchild.js;

首先创建footchild.js文件,然后引入到父页面footer.js,相信到这里,大家都能自己完成这一步;

{/*下面是子页面footchild*/}{/*{...this.props} 可以把父页面所有的属性收到,并且可以自己定义*/}
<FootChild {...this.props} id={2121}/>

在FootChild组件里面调用出来:既能调用根父级index里面有的,也能调用在自己父级定义的;

import React from 'react';

export default class FootChild extends React.Component{
render(){
return(
<div>
{/*既能调用根父级index里面有的,也能调用在自己父级定义的*/}
<p>{this.props.username} {this.props.userid} {this.props.id} </p>
}
</div>
)
}
}

总结:

React入门---可复用组件-10的更多相关文章

  1. 【React】学习笔记(一)——React入门、面向组件编程、函数柯里化

    课程原视频:https://www.bilibili.com/video/BV1wy4y1D7JT?p=2&spm_id_from=pageDriver 目录 一.React 概述 1.1.R ...

  2. React躬行记(10)——高阶组件

    高阶组件(High Order Component,简称HOC)不是一个真的组件,而是一个没有副作用的纯函数,以组件作为参数,返回一个功能增强的新组件,在很多第三方库(例如Redux.Relay等)中 ...

  3. Bootstrap入门(十六)组件10:well和具有响应式特性的嵌入内容

    Bootstrap入门(十六)组件10:well和具有响应式特性的嵌入内容 well组件可以为内容增添一种切入效果. 具有响应式特性的嵌入内容可以根据被嵌入内容的外部容器的宽度,自动创建一个固定的比例 ...

  4. React入门介绍(2)- React Component-React组件

    React Component-React组件 允许用户自由封装组件是React非常突出的特性,用户可将自己创建的组件像普通的HTML标签一样插入页面,React.CreateClass方法就是用来创 ...

  5. 【React -- 5/100】 组件复用

    组件复用 React组件复用概述 思考:如果两个组件中的部分功能相似或相同,该如何处理? 处理方式:复用相似的功能 复用什么? state 操作state的方法 两种方式: render props模 ...

  6. React入门看这篇就够了

    摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所有. React 背景介绍 React 入门实例教程 React 起源于 ...

  7. react入门(上)

    1. ReactJS是什么? 1). Facebook开源的一个js库 2). 一个用于动态构建用户界面的js库2. React的特点 * Declarative(声明式编码) * Component ...

  8. es6 Object.assign ECMAScript 6 笔记(六) ECMAScript 6 笔记(一) react入门——慕课网笔记 jquery中动态新增的元素节点无法触发事件解决办法 响应式图像 弹窗细节 微信浏览器——返回操作 Float 的那些事 Flex布局 HTML5 data-* 自定义属性 参数传递的四种形式

    es6 Object.assign   目录 一.基本用法 二.用途 1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 三.浏览器支持 ES6 O ...

  9. [转]React入门看这篇就够了

    摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所有. React 背景介绍 React 入门实例教程 React 起源于 ...

随机推荐

  1. 转:java实例化对象的过程

    学习JAVA这门面向对象的语言,实质就是不断地创建类,并把类实例化为对象并调用方法.对于初学JAVA的人总搞清楚对象是如何实例化的,假如类之间存在继承关系,那就更糊涂了.下面我们通过两个例题来说明对象 ...

  2. Linux 搭建svn版本库

    一.安装svn服务器端yum install subversion      从镜像下载安装svn服务器端 如果后面执行“svnadmin create /usr/local/svn/sunny”提示 ...

  3. 【转】使用VS开发 Node.js指南

    参考:https://www.visualstudio.com/features/node-js-vs 这篇文章主要介绍了使用VS开发 Node.js的方法,主要是使用NTVS(Node.js Too ...

  4. Asp.NetCore之组件写法

    本章内容和大家分享的是Asp.NetCore组件写法,在netcore中很多东西都以提供组件的方式来使用,比如MVC架构,Session,Cache,数据库引用等: 这里我也通过调用验证码接口来自定义 ...

  5. [转]使用sklearn进行集成学习——理论

    转:http://www.cnblogs.com/jasonfreak/p/5657196.html 目录 1 前言2 集成学习是什么?3 偏差和方差 3.1 模型的偏差和方差是什么? 3.2 bag ...

  6. coolpad 5879logcat不能输入日志解决办法

    有几天没完手机了,玩一下,发现不能打印日志了,记得最开始的时候 会弹出一个选项选择是否输出日志,在网上找了好的方法. 1.重启adb,点击DBMS 进行刷新. 2重启eclipse. 3.重装驱动. ...

  7. 【Android】沉浸式状态栏实现

    在Android4.4(API 19)及以后的版本中都增加了对沉浸式状态栏的支持,实现起来也很简单,将application的主题稍作修改即可: <style name="AppThe ...

  8. 学习MVC之租房网站(二)-框架搭建及准备工作

    在上一篇<学习MVC之租房网站(一)-项目概况>中,确定了UI+Service的“双层”架构,并据此建立了项目 接下来要编写Common类库.配置AdminWeb和FrontWeb 一.编 ...

  9. HBase应用快速学习

    HBase是一个高性能.面向列.可伸缩的开源分布式NoSQL数据库,是Google Bigtable的开源实现. HBase的思想和应用和传统的RDBMS,NoSQL等有比较大的区别,这篇文章从HBa ...

  10. 微信端解决a标签链接 失效的问题

    最近常碰到这个问题就是 在微信端点击a标签链接的时候,第一次正常界面跳转.但是,界面重新跳转回来再次点击a标签的话 .出现 界面不跳转,但是进度条加载完毕,点击多次页面无法跳转. 解决办法 在链接后边 ...