博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
整理下react中常见的坑
阅读量:5305 次
发布时间:2019-06-14

本文共 2447 字,大约阅读时间需要 8 分钟。

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

1、setState()是异步的

this.setState()会调用render方法,但并不会立即改变state的值,state是在render方法中赋值的。(这里我描述的不对,多谢评论区大神指点,setState只是将任务交给任务队列,本身没有执行任务)所以执行this.setState()后立即获取state的值是不变的。同样的直接赋值state并不会出发更新,因为没有调用render函数

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

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

4、无论reducer返回的state是否改变,subscribe中注册的所有回调函数都会被触发。

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

6、组件卸载之前,加在dom元素上的监听事件,和定时器需要手动清除,因为这些并不在react的控制范围内,必须手动清除。(一般在componentwillunmount中做)

7、按需加载时如果组件是通过export default 暴露出去,那么require.ensure时必须加上default。

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

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

9、标签里用到的,for 要写成htmlFor,因为for已经成了关键字。

10、componentWillUpdate中可以直接改变state的值,而不能用setState。

11、如果使用es6class类继承react的component组件,constructor中必须调用super,因为子类需要用super继承component的this,否则实例化的时候会报错。

 

12、说说“内联样式”:

场景:在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"}}

13、遍历数组元素:

场景:

const address = ['北京', '杭州', '深圳', '上海'];address.map((item) => {  return (    
        
  • {item}
  •     
  )});

 

报错: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 (    
        
  • {item}
  •     
  )});

 

14、"根元素":

场景:

render(){  return (    
    
  )}

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

原因:render()函数中返回的所有元素需要包裹在一个"根"元素里面

解决:

return (  
  
  
  
)

15、 “return同行”问题:

场景:

return 
      

some

    /div>

原因:return语句和返回元素不在同一行会被解析器视为返回null导致错误(注意:如果没有使用()的情况)

解决:

return (  
    p>some

  
)

 

16、 table表格问题:

场景:

return (  
    
      
    
  
)

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

原因:在React中<tr>元素不可以作为<table>元素的直接子元素

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

转载于:https://www.cnblogs.com/jinzhou/p/9179340.html

你可能感兴趣的文章
程序员的“机械同感”
查看>>
在16aspx.com上下了一个简单商品房销售系统源码,怎么修改它的默认登录名和密码...
查看>>
c++回调函数
查看>>
linux下Rtree的安装
查看>>
【Java】 剑指offer(53-2) 0到n-1中缺失的数字
查看>>
Delphi中ListView类的用法
查看>>
多米诺骨牌
查看>>
Linq 学习(1) Group & Join--网摘
查看>>
asp.net 调用前台JS调用后台,后台掉前台JS
查看>>
Attribute(特性)与AOP
查看>>
苹果手表:大方向和谷歌一样,硬件分道扬镳
查看>>
Competing Consumers Pattern (竞争消费者模式)
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
ubuntu 安装后的配置
查看>>
web前端之路,js的一些好书(摘自聂微东 )
查看>>
【模板】对拍程序
查看>>
【转】redo与undo
查看>>
解决升级系统导致的 curl: (48) An unknown option was passed in to libcurl
查看>>
Java Session 介绍;
查看>>