技术胖博客
React Hooks
类与Hooks 写法对比
先来写一个最简单的有状体组件,点我们点击按钮时,点击数量不断增加。
原始写法:
import React, { Component } from 'react';
class Example extends Component {
constructor(props) {
super(props);
this.state = { count:0 }
}
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={this.addCount.bind(this)}>Chlick me</button>
</div>
);
}
addCount(){
this.setState({count:this.state.count+1})
}
}
export default Example;
React Hooks 写法:
import React, { useState } from 'react';
function Example(){
const [ count , setCount ] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={()=>{setCount(count+1)}}>click me</button>
</div>
)
}
export default Example;
React Hooks不能出现在条件判断语句中
因为它必须有完全一样的渲染顺序
错误示范:
import React, { useState } from 'react';
let showSex = true
function Example2(){
const [ age , setAge ] = useState(18)
if(showSex){
const [ sex , setSex ] = useState('男') // 不可在判断语句中使用useState
showSex=false
}
const [ work , setWork ] = useState('前端程序员')
return (
<div>
<p>JSPang 今年:{age}岁</p>
<p>性别:{sex}</p>
<p>工作是:{work}</p>
</div>
)
}
export default Example2;
useEffect
用useEffect
函数来代替生命周期函数
在使用React Hooks
的情况下,我们可以使用下面的代码来完成上边代码的生命周期效果,代码如下(修改了以前的diamond): 记得要先引入useEffect
后,才可以正常使用。
import React, { useState , useEffect } from 'react';
function Example(){
const [ count , setCount ] = useState(0);
//---关键代码---------start-------
useEffect(()=>{
console.log(`useEffect=>You clicked ${count} times`)
})
//---关键代码---------end-------
return (
<div>
<p>You clicked {count} times</p>
<button onClick={()=>{setCount(count+1)}}>click me</button>
</div>
)
}
export default Example;
useEffect两个注意点
-
React 首次渲染 和之后的 每次渲染 都会调用一遍
useEffect
函数,而之前我们要用两个生命周期函数分别表示首次渲染(componentDidMonut)和更新导致的重新渲染(componentDidUpdate)。 -
useEffect中定义的函数的执行不会阻碍浏览器更新视图,也就是说这些函数时 异步执行 的,而
componentDidMonut
和componentDidUpdate
中的代码都是同步执行的。个人认为这个有好处也有坏处吧,比如我们要根据页面的大小,然后绘制当前弹出窗口的大小,如果时异步的就不好操作了。
useEffect实现componentWillUnmount
useEffect的第二个参数,它是一个数组,数组中可以写入很多状态对应的变量,意思是当状态值发生变化时,我们才进行解绑。但是当传空数组[]时,就是当组件将被销毁时才进行解绑,这也就实现了componentWillUnmount
的生命周期函数。
function Index() {
useEffect(() => {
console.log('Index页面数据有变')
return () => {
console.log('组件解绑')
}
},[]) // 第二个参数为空数组,组件将被销毁时才进行解绑
return <h2>Index</h2>;
}
网友评论