React组件规范

1 有状态组件只有render方法才能返回JSX,由于JSX中的虚拟DOM有一个_owner属性,这与它与组件实例进行绑定。若是其余方法里使用了JSX,_owner就没有与组件实例进行绑定。像vue,只有一个地方(template或render)是与视图渲染相关的,一目了然。vue

2 render方法里面应该以<开头,不该该存在if else分支,视状况返回不一样的JSX。相同的组件应该返回相同的顶级元素容器。react

// bad
render(){
   if(this.state.a){
      return <strong>222</strong>
   }else{
      return <div>222</div>
   }
}

3 ref应该尽快淘汰字符串形式,由于字符串形式的ref会自始至终将字符串放在refs对象中,会有泄露的问题。babel

// bad
<Foo
  ref="myRef"
/>

// ok
<Foo
  ref={(ref) => { this.myRef = ref; }}
/>

上面的方法之因此是ok,而不是good,是由于咱们在查看组件时,人家也很难察觉到你在JSX里偷偷为组件添加了一个新属性。组件全部用到的属性,应该都能在constructor或defaultProps中找到。性能

4 refs.xxx中的DOM节点,不该该再转存到组件实例上或其余地方中。每次访问refs.xxx必须断定其是否为空。this

5 不要在componentWillUpdate/componentDidUpdate/render中执行setState, 可能异致死循环。spa

6 不要在JSX中使用bind方法绑定组件实例(性能相关)code

// bad
class extends React.Component {
  onClickDiv() {
    // do stuff
  }

  render() {
    return <div onClick={this.onClickDiv.bind(this)} />;
  }
}

// good
class extends React.Component {
  constructor(props) {
    super(props);

    this.onClickDiv = this.onClickDiv.bind(this);
  }

  onClickDiv() {
    // do stuff
  }

  render() {
    return <div onClick={this.onClickDiv} />;
  }
}

7 不要使用cloneElement,createElement,让JSX与babel帮你建立它们。cloneElement可能会致使_owner丢失。_owner丢失就致使ref失效。component

8 不要使用createClass, mixin, PropTypes(它们已经被移出核心库,被逐渐边缘化,有关属性的描述改为文档注释吧)对象

9 尽可能不要在生命周期钩子外的方法中使用setState(包括setTimeout方法),由于react的高性能决窍就在于合并多个setState,从而减小对页面的反复渲染。React在生命周期钩子与事件回调里都对setState进行劫持,让它们进入列队,从而进行合并stateblog

10 不要unstable_renderSubtreeIntoContainer,会致使没法升级到react 16

clipboard.png

相关文章
相关标签/搜索