React 定义组件的参数对象


原文地址:http://itbilu.com/JavaScript/React/4JIk-Q7Yl.html

使用React.createClass()方法创建组件时,需要传入一个参数对象,React会根据这个对象创建组件。这个参数对象中,除了包含必须要实现的render方法外,还有一些组件的设置属性。组件生命周期中的一些处理函数,也是在这个对象中定义的。


  1. 组件的定义
  2. 定义组件的参数
  3. 定义组件的参数-生命周期


1. 组件的定义

我们在之前介绍过,定义一个组件,语法结构如下:

ReactClass createClass(object specification)

定义组件时,传了一个表示参数说明(参数规格)的specification对象。

如,定义一个组件:

var App = React.createClass({
  displayName: 'App',render: function () {
    return (
      <h1>itbilu.com</h1>
    )
  }
});
返回值是一个包含单一了级的组件( ReactComponent

在上面的示例中,我们在specification对象中定义了一个render方法,该方法是必须实现的方法。除render方法外,还定义一个displayName属性

specification对象中还可以定义更多的属性,这其中包括组件的生命周期参数,参数详细说明如下。


2. 定义组件的参数

2.1 渲染组件:render

ReactComponent render()
  • 返回值:React组件(ReactComponent

render()方法会根据组件的this.propsthis.state属性的改,渲染或重新渲染一个组件。React会对比其返回的ReactComponent,并判断是否将其渲染到DOM中。

其返回值是一个单子级的组件,该组件可以是虚拟的本地DOM(如:<div/>React.DOM.div()),也可以是自定义的复合组件。当不需要返回任何东西时,可以返回nullfalse

render()应该是一个纯粹函数,即:不使用组件的state,每次调用都返回同样的结果,不读写DOM,不与浏览器交互,只做最单纯的渲染。当需要修改状态或有交互时,应该在componentDidMount等组件生命周期函数中进行。


2.2 调试输出displayName

string displayName

displayName属性用于组件调试时输出显示JSX自动设置该值,可以理解为调试时显示的组件名。


2.3 跨组件共享:mixins

array mixins
属性是一个数组,通过该数组可以共享一些复杂组件间的共用功能。mixin

如,一个组件需要定期更新,这时我们可以setInterval()方法很容易的做到,但当不需要它时,我们要取消定时器以节省内存。下面我们使用 React 提供的生命周期方法通知组件创建或销毁时间,并结合mixin,实现组件的定时清理(mixins.html):

var SetIntervalMixin = {
  componentWillMount: function() {
    this.intervals = [];
  },setInterval: function() {
    this.intervals.push(setInterval.apply(null,arguments));
  },componentWillUnmount: function() {
    this.intervals.map(clearInterval);
  }
};

var TickTock = React.createClass({
  mixins: [SetIntervalMixin],// 引用 mixin
  getInitialState: function() {
    return {seconds: 0};
  },componentDidMount: function() {
    this.setInterval(this.tick,1000); // 调用 mixin 的方法
  },tick: function() {
    this.setState({seconds: this.state.seconds + 1});
  },render: function() {
    return (
      <p>
        React 已经运行了 {this.state.seconds} 秒。
      </p>
    );
  }
});

React.render(
  <TickTock />,document.getElementById('example')
);


2.4 验证对象:propTypes

object propTypes

propTypes是React提供的一种验证机制,该对象中定义了一系列的验证方法,可对props进行验证。组件初始化时,如果传递的props属性propTypes不匹配,则会打印一个console.warn日志。

React.createClass({
  propTypes: {
  	// 验证布尔值
    optionalBool: React.PropTypes.bool,// 验证是一个函数
    optionalFunc: React.PropTypes.func,// 验证是数字
    optionalNumber: React.PropTypes.number,// 自定义验证器,验证失败需要返回一个 Error 对象。不要直接
    // 使用 `console.warn` 或抛异常,因为这样 `oneOfType` 会失效。
    customProp: function(props,propName,componentName) {
      //自定义的验证方法
      ……
    }
    // 其它验证
    ……
  },/* 其它specification... */
});

propTypes使用示例(propTypes.html):

var App = React.createClass({
  propTypes: {
    site: React.PropTypes.shape({
      domain: React.PropTypes.string.isrequired,name: React.PropTypes.string
    }).isrequired
  },render: function() {
    return (
      <p>
        站点信息-{this.props.site.name}:{this.props.site.domain}
      </p>
    );
  }
});

var site = {
  name: 4,// 不合法的类型
  domain: 'itbilu.com'
}
ReactDOM.render(
  <App site={site} />,document.getElementById('example')
);

// 运行后会抛出以下错误
// Warning: Failed propType: Invalid prop `site.name` of type `number` supplied to `App`,expected `string`.


2.5 静态方法对象:statics

object statics

statics对象使你可以定义一些静态方法,这些静态方法可以直接在组件上调用。如statics.html):

var MyComponent = React.createClass({
  statics: {
    customMethod: function(foo) {
      return foo === 'bar';
    }
  },render: function() {
  }
});

MyComponent.customMethod('bar');  // true

statics中定义的方法都是静态方法,所以你可以组件实例创建之前调用,这也意味着不能获取组件的 在这个块儿里面定义的方法都是静态的,意味着你可以在任何组件实例创建之前调用它们,这些方法不能获取组件的propsstate,如果需要在静态方法中使用state,则要在调用时做为参数传入。


3. 定义组件的参数-生命周期

生命周期相关参数,是React定义组件时提供的一系列处理函数(钓子函数),这些函数会在组件生命周期的某个阶段调用

3.1 创建期:getDefaultProps

object getDefaultProps()


3.2 创建期:getInitialState

object getInitialState()

在组件挂载前(即:创建期)调用一次,其返回值将做为this.state的初始值。

getInitialState()方法会组件类创建的时候调用一次,其返回值会被缓存下来。该方法用于设置props属性的默认值,但仅对于非必须属性。如果父组件没有指定props中的某个值,此返回对象中的相应属性将会合并到this.props

getInitialState()方法会在组件实例创建前调用,这时还不能使用this.props属性,且其返回对象是在所有实例间共享的。


3.3 创建期:componentWillMount

componentWillMount()

componentWillMount()服务器端和客户端都只调用一次,在初始化渲染执行之前被调用。如果在这个方法调用setState()方法render()方法将会收到更新后的state,也就是说这是我做在组件渲染前最后一个修改state的机会。


3.4 创建期:componentDidMount

componentDidMount()

componentDidMount()会在组件初始化(渲染完成)后立即调用一次,我们一般在这个方法中使用this.getDOMNode()方法访问原始DOM。


3.5 存在期:componentWillReceiveProps

componentWillReceiveProps(object nextProps)

componentWillReceiveProps()方法会在组件生命周期的存在期调用,当组件感知到props属性改变会,会调用方法render()方法将会在其后调用,这时我们可以通过this.setState()来阻止组件的再次渲染。


3.6 存在期:shouldComponentUpdate

boolean shouldComponentUpdate(object nextProps,object nextState)

shouldComponentUpdate()方法发生在组件生命周期的存在器,在组件收到新的propsstate。在这个方法中,我们可以访问组件的state属性,通过这两个属性可以确认组件是否需要更新,如果不需要更新,则返回false,则其后的方法将不会在执行。如:

shouldComponentUpdate: function(nextProps,nextState) {
  return nextProps.id !== this.props.id;
}


3.7 存在期:componentWillUpdate

componentWillUpdate(object nextProps,244)">componentWillUpdate()会在收到新的state调用,类似componentWillMount()


3.8 存在期:componentDidUpdate

componentDidUpdate(object prevProps,object prevState)

componentDidUpdate()会在组件重新渲染后立即被调用,当我们需要在组件重新渲染后操作DOM则需要使用这个方法


3.9 销毁&清理期:componentWillUnmount

componentWillUnmount()

componentWillUnmount()是组件销毁&清理期唯一调用方法,它会在组件从DOM中移除时被调用,这时我们可以清理一些状态或清理在componentDidMount中创建的DOM元素。

相关文章

导入moment 使用方式 年月日,时分秒 星期几 相对时间 7天后 2小时后 明天 将毫秒转换成年月日
@ 一、前言 为什么介绍redux-actions呢? 第一次见到主要是接手公司原有的项目,发现有之前的大佬在处理...
十大React Hook库 原文地址:https://dev.to/bornfightcompany/top-10-react-hook-libraries-4065 原文...
React生命周期 React的生命周期从广义上分为挂载、渲染、卸载三个阶段,在React的整个生命周期中提供很...
React虚拟DOM的理解 Virtual DOM是一棵以JavaScript对象作为基础的树,每一个节点可以将其称为VNode,用...
React中JSX的理解 JSX是快速生成react元素的一种语法,实际是React.createElement(component, props, ....