本文主要是介绍吐槽出入react踩过的“坑”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、渲染篇:1. 第一个要说说“内联样式”:
场景:在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"}}
2.遍历数组元素:
场景:
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属性作为唯一标识
解决:
address.map((item, index) => {
return (
<ul class="items">
<li class="item" key={index}>{item}</li>
</ul>
)
});
3."根元素":
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>
)
4. “return同行”问题:
场景:
return <div class="some">
<p>some</p>
</div>
原因:return语句和返回元素不在同一行会被解析器视为返回null导致错误(注意:如果没有使用()的情况)
解决:
return (
<div class="some">
<p>some</p>
</div>
)
5. htmlFor问题:
原因:标签里用到的for要写成htmlFor,因为for已经成了关键字。
解决:for要写成htmlFor
6. table表格问题:
场景:
return (
<table>
<tr>
<td></td>
</tr>
</table>
)
报错:Warning: validateDOMNesting(...): <tr> cannot appear as a child of <table>
原因:在React中<tr>元素不可以作为<table>元素的直接子元素
解决方法:加入thead/tbody即可。
二、逻辑篇:
1、setState()是异步的
this.setState()会调用render方法,但并不会立即改变state的值,state是在render方法中赋值的。所以执行this.setState()后立即获取state的值是不变的。同样的直接赋值state并不会出发更新,因为没有调用render函数。
2、组件生命周期
1)在初始化的时候调用:
componentWillMount,componentDidMount
2)在更新的时候才被调用,初始化时不调用:
componentWillReceivePorps,shouldComponentUpdate,componentWillUpdata,componentDidUpdate
3)组件卸载之前,加在dom元素上的监听事件,和定时器需要手动清除,因为这些并不在react的控制范围内,必须手动清除。
指的是在this.refs.xxx这种真实dom上addEventListener这样添加的监听事件,在组件卸载的时候要手动清除(removeEventListener),react组件上的onClick这种不用管,react帮我们处理好了
4)componentWillUpdate中可以直接改变state的值,而不能用setState。
3、reducer必须返回一个新的对象才能出发组件的更新
因为在connect函数中会对新旧两个state进行浅对比,如果state只是值改变但是引用地址没有改变,connect会认为它们相同而不触发更新。
4、无论reducer返回的state是否改变,subscribe中注册的所有回调函数都会被触发。
5、按需加载时如果组件是通过export default 暴露出去,那么require.ensure时必须加上default。
6、react的路由:
hashHistory和browserHistory,hashHistory由hash#控制跳转,一般用于正式线上部署,browserHistory就是普通的地址跳转,一般用于开发阶段。7、React组件
1)React组件命名的首字母必须是大写,这是类命名的规范;2)class类继承react的component组件,constructor中必须调用super,因为子类必须用super继承component的this,否则实例化的时候会报错;
这篇关于吐槽出入react踩过的“坑”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!