1.jsx就是React.createElement的语法糖,浏览器是不能直接识别的,需要通过babel,插件:babel-plugin-transfrom-react-jsx来进行转译,转换为react的内部方法。
使用jsx的三点注意:
(1)使用className,htmlFor来替代class,for关键字
(2)尽量使用三目运算符而不是这种:
0 && <div>ssdf</div> // 0
(3)createElement接受三个参数: html标签名字、属性、子元素
2.函数组件和类组件的区别
(1)props加载的方式不同,函数组件通过参数,类组件通过继承
(2)类组件里面可以定义更多的函数在实例上,直接通过this就可以调用,函数组件也可以通过定义内部函数变量使用或者定义在外面
function Test(props) {
const getValue() {
if () {
props.xxxx();
}
}
}
function getValue2() {}
(3)其实二者在性能上的差别不是很大,只需要考虑是否需要维护自己内部的状态,如果是纯粹的UI展示组件,则可考虑函数组件。
3.受控组件和非受控组件的最大区别: 当前组件的值是在state中还是自己维护。在项目中大多数情况下都是受控的。
4.生命周期
(1)挂载阶段:
constructor .
static getDerivedStateFromProps
(componentWillMount)
render
componentDidMount
(2)更新
static getDerivedStateFromProps
shoudcomponentUpdate
(componentWillReceiveProps)
(componentWillUpdate)
render
getSnapshotBeforeUpdate
componentDidUpdate
下面三个即将过时:
(3)卸载
componentWillUnmount
思考: 应该在哪个生命周期发送请求?
一般我们认为在生命周期约靠前越能更早获得加载结果,其实没有相差多少。
最好放在componentDidMount,因为在服务端没有Dom的概念,所以不会执行该生命周期,如果放在componentWillMount里面,且用到window等这种浏览器相关的变量则无法获取到
5.event事件
clickHandle(e) {
const text = e.currentTarget.innerText;
setTimeout(() => {
console.log(text);//normal
console.log(e.currentTarget.innerText)//undefined
}, 1000)
}
可以通过上面的例子发现,react自己封装来一套事件机制,当点击事件发生的时候,先代理到自己的内部函数逻辑,再执行真正的函数的。并且都用的一个event实例。所以在处理异步的时候,e可能已经被改变。做了一层代理的目的(共享event): 1.可以做优化 2.跨端 因为其他端没有浏览器的一套东西,自己实现可以有更好的兼容性
6.关于事件绑定的问题
在React基于VDOM,实现了一个合成事件层,所以并不会像DOM0级事件那样直接绑定到元素上,而是先绑定到合成事件层,this的指向就很难说是当下的这个组件了,所以采用显示绑定。
constructor() {
this.renderFuncs = this.renderText.bind(this)
}
renderText() {
// todo
}
renderText2 = () => {
// todo
}
render() {
return (
<RenderText text={a} renderFunc={this.renderFuncs}/>
<RenderText text={a} renderFunc={this.renderText.bind(this)}/>
<RenderText text={a} renderFunc={() => this.renderText()}/>
<RenderText text={a} renderFunc={this.renderText2)}/>
)
}
上面写了很多种写法,推荐使用第一种和最后一种。
当text没有发生变化的时候,子组件也会触发重新渲染,造成不必要的浪费,因为renderFunc是一个引用,使用bind后,每次返回一个新的函数(箭头函数也是同样)
const {fromJS} = require(‘immutable’)
可以通过引入这个库,达到引用不丢失的问题。互相干扰,
深拷贝的问题:不应该断掉的不断掉引用,这也是应该在react里面最小更新的一种方法。