整理下react中常见的坑

其实有些也不能算是坑,有些是react的规定,或者是react的模式和日常的js处理的方式不一样罢了html

一、setState()是异步的
this.setState()会调用render方法,但并不会当即改变state的值,state是在render方法中赋值的。(这里我描述的不对,多谢评论区大神指点,setState只是将任务交给任务队列,自己没有执行任务)因此执行this.setState()后当即获取state的值是不变的。一样的直接赋值state并不会出发更新,由于没有调用render函数react


二、组件的生命周期
componentWillMount,componentDidMount 只有在初始化的时候才调用。
componentWillReceivePorps,shouldComponentUpdate,componentWillUpdata,componentDidUpdate 只有组件在更新的时候才被调用,初始化时不调用。es6


三、reducer必须返回一个新的对象才能出发组件的更新
由于在connect函数中会对新旧两个state进行浅对比,若是state只是值改变可是引用地址没有改变,connect会认为它们相同而不触发更新数组


四、不管reducer返回的state是否改变,subscribe中注册的全部回调函数都会被触发。app


五、组件命名的首字母必须是大写,这是类命名的规范。框架


六、组件卸载以前,加在dom元素上的监听事件,和定时器须要手动清除,由于这些并不在react的控制范围内,必须手动清除。(通常在componentwillunmount中作)dom


七、按需加载时若是组件是经过export default 暴露出去,那么require.ensure时必须加上default。异步

require.ensure([], require => {   cb(null, require('../Component/saleRecord').default) },'saleRecord')

八、react的路由有hashHistory和browserHistory,hashHistory由hash#控制跳转,通常用于正式线上部署,browserHistory就是普通的地址跳转,通常用于开发阶段。函数


九、标签里用到的,for 要写成htmlFor,由于for已经成了关键字。ui


十、componentWillUpdate中能够直接改变state的值,而不能用setState。


十一、若是使用es6class类继承react的component组件,constructor中必须调用super,由于子类须要用super继承component的this,不然实例化的时候会报错。

 

十二、说说“内联样式”:

场景:在JSX的render中写内联样式,如<div style={"marginTop:10px"}></div>

报错:warning:Style prop value must be an object react/style-prop-object

缘由:在React框架的JSX编码格式要求,style必须是一个对象

解决:style={{"marginTop:10px"}}


1三、遍历数组元素:

场景:

const address = ['北京', '杭州', '深圳', '上海']; address.map((item) => {   return (     <ul class="items">
    <li class="item">{item}</li>
    </ul>
  ) });

 

报错:Warning:Each child in an array or iterator should have a unique "key" prop. Check the render method of `NavBlock`

缘由:在React中数组遍历返回元素或组件时需加上key属性做为惟一标识(这也是react提升效率的途径)

解决:

address.map((item, index) => {   return (     <ul class="items">
    <li class="item" key={index}>{item}</li>
    </ul>
  ) });

 

1四、"根元素":

场景:

render(){   return (     <div></div>
    <div></div>
  ) }

报错:Adjacent JSX elements must be wrapped in an enclosing tag

缘由:render()函数中返回的全部元素须要包裹在一个"根"元素里面

解决:

return (   <div class="some">
  <div></div>
  <div></div>
  </div>
)


1五、 “return同行”问题:

场景:

return <div class="some">
      <p>some</p>
    /div>

缘由:return语句和返回元素不在同一行会被解析器视为返回null致使错误(注意:若是没有使用()的状况)

解决:

return (   <div class="some">
    p>some</p>
  </div>
)

 


1六、 table表格问题:

场景:

return (   <table>
    <tr>
      <td></td>
    </tr>
  </table>
)

报错:Warning: validateDOMNesting(...): <tr> cannot appear as a child of <table>

缘由:在React中<tr>元素不能够做为<table>元素的直接子元素

解决方法:加入thead/tbody便可。​

相关文章
相关标签/搜索