资讯专栏INFORMATION COLUMN

react开发教程(四)React数据流

CatalpaFlat / 2467人阅读

摘要:在中,数据是自顶向下流动的称为单项数据流,从父组件传递到子组件。任何数据类型您还可以指定自定义类型检查器。如果检查失败,它应该返回一个对象。不要或,因为这不会在内工作。检查器有两个参数,第一个参数是数组或对象本身,第二个是当前项的键。

在React中,数据是自顶向下流动的(称为单项数据流),从父组件传递到子组件。因此组件是简单且易于把握的,它们只需从父节点获取props渲染即可。如果顶层组件的某个prop改变了,React会递归向下遍历整个组件树,从新渲染所有使用这个属性的组件。
然而在React中出了props之外还有自己的状态,这些状态只能在组件内修改,那这个状态就是state

props:就是properties的缩写,你可以使用它把任意类型的数据传递给组件(通俗一点就是,可以当成方法传递的参数)
state:当前组件内部数据

props

可以在挂载组件的时候设置它的props


var data = {
    name : "刘宇",
    title : "标题"
};

在组件内部调用的话就是使用 this.props

//Comment.js
import React, { Component } from "react";、
import "./Comment.css";

class Comment extends Component {
  render() {
    return (
      
{/**接受参数**/} {this.props.name} {/**接受子节点**/} {this.props.children}
); } } export default Comment; //App.js class App extends Component { render() { return (
{/**调用组件**/} 组件插入内容{/**子节点**/}
); } } export default App; //index.js import React from "react"; import ReactDOM from "react-dom"; import App from "./App"; import "./index.css"; ReactDOM.render( , document.getElementById("root") );
propTypes

propTypes用于规范props的类型与必须的状态。如果组件定义了propTypes,那么在开发环境下,就会对组件的props值的类型作检查,如果传入的props不能与之匹配,React将实时在控制台里报warning(警告);

static propTypes = {
  // 你可以定义一个js原始类型的prop,默认请情况下,这是都是可选的
  optionalArray: React.PropTypes.array,
  optionalBool: React.PropTypes.bool,
  optionalFunc: React.PropTypes.func,
  optionalNumber: React.PropTypes.number,
  optionalObject: React.PropTypes.object,
  optionalString: React.PropTypes.string,
  optionalSymbol: React.PropTypes.symbol,

  // 任何可以渲染的东西:数字,字符串,元素或数组(或片段)。
  optionalNode: React.PropTypes.node,

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

  // 你也可以声明prop是某个类的实例。 内部使用的是JS的instanceof运算符。
  optionalMessage: React.PropTypes.instanceOf(Message),

  // 你可以通过将它作为枚举来确保你的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),

  // 采取特定样式的对象
  optionalObjectWithShape: React.PropTypes.shape({
    color: React.PropTypes.string,
    fontSize: React.PropTypes.number
  }),

  // 你可以用`isRequired`来连接到上面的任何一个类型,以确保如果没有提供props的话会显示一个警告。
  requiredFunc: React.PropTypes.func.isRequired,

  // 任何数据类型
  requiredAny: React.PropTypes.any.isRequired,

  // 您还可以指定自定义类型检查器。 如果检查失败,它应该返回一个Error对象。 不要`console.warn`或throw,因为这不会在`oneOfType`内工作。
  customProp: function(props, propName, componentName) {
    if (!/matchme/.test(props[propName])) {
      return new Error(
        "Invalid prop `" + propName + "` supplied to" +
        " `" + componentName + "`. Validation failed."
      );
    }
  },

  // 您还可以为`arrayOf`和`objectOf`提供自定义类型检查器。 如果检查失败,它应该返回一个Error对象。 
  // 检查器将为数组或对象中的每个键调用验证函数。 
  // 检查器有两个参数,第一个参数是数组或对象本身,第二个是当前项的键。
  customArrayProp: React.PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
    if (!/matchme/.test(propValue[key])) {
      return new Error(
        "Invalid prop `" + propFullName + "` supplied to" +
        " `" + componentName + "`. Validation failed."
      );
    }
  })
};
//以上是ES6的写法,如果使用的是createClass
MyComponent.propTypes = {
//同上
}
要求只能是单个子元素
class MyComponent extends React.Component {
    render() {
        // 只能包含一个子元素,否则会给出警告
        const children = this.props.children;
        return (
            
{children}
); } } MyComponent.propTypes = { children: React.PropTypes.element.isRequired }
getDefaultProps和defaultProps

可以为组件添加getDefaultProps来设置属性的默认值。

//es6写法

class Comment extends Component {
  //设置默认props值
  static defaultProps = {
    name:"默认值"
  }
  render() {
    return (
      
{/**接受参数**/} {this.props.name} {/**接受子节点**/} {this.props.children}
); } } var Comment = React.createClass( { //设置默认props值 getDefaultProps : { name:"默认值" }, render : function(){ return (
{/**接受参数**/} {this.props.name} {/**接受子节点**/} {this.props.children}
); } })

注意:props可以访问不可以修改,如果需要修改,请使用state

state

state是组件内部的属性。组件本身是一个状态机,他可以在constructor中通过this.state直接定义他的值,然后根据这些值来渲染不同的UI,当state的值发生改变时,可以通过this.setState方法让组件再次调用render方法,来渲染新的UI.

var Comment = React.createClass( {
  //设置state值
  getInitialState : {
    num:0
  },
  addNum : function(){
    var num = this.state.num++;
    this.setState({
        num:num
    })
  },
  render : function(){
    return (
      
); } }) //es6写法 class Comment extends Component { constructor(props) { super(props); this.state = { num : 0 }; this.addNum = this.addNum.bind(this) } addNum() { var num = this.state.num++; this.setState({ num:num }) } render() { return (
); } }

上一篇:react开发教程(三)组件的构建
下一篇:react开发教程(五)生命周期

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82610.html

相关文章

  • react开发教程(三)组件的构建

    摘要:在团队开发中,组件化带来的优势是便于协同开发,由于代码中的耦合度降低了,每个模块都可以分拆为一个组件,例如异步请求组件,路由组件,各个视图组件。 什么是组件 组件化就好像我们的电脑装机一样,一个电脑由显示器、主板、内存、显卡、硬盘,键盘,鼠标...。 组件化开发有如下的好处:降低整个系统的耦合度,在保持接口不变的情况下,我们可以替换不同的组件快速完成需求。例如输入框,可以替换为日历、时...

    gclove 评论0 收藏0
  • webpack4详细教程,从无到有搭建react脚手架(

    摘要:相关链接详细教程,从无到有搭建脚手架一详细教程,从无到有搭建脚手架二详细教程,从无到有搭建脚手架三管理打包后目录结构打包结构如下修改配置通过相对目录对资源命名前加上目录名,效果后面的步骤在这里需要安装一个大型的包,以为例安装为第三 相关链接 webpack4详细教程,从无到有搭建react脚手架(一) webpack4详细教程,从无到有搭建react脚手架(二) webpack4详细...

    chnmagnus 评论0 收藏0

发表评论

0条评论

CatalpaFlat

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<