react hook学习记录
- 1.什么是hooks
- 2.State Hook
- 3.Effect Hook
- 4.Ref Hook
1.什么是hooks
(1). Hook是React 16.8.0版本增加的新特性/新语法
(2). 可以让你在函数组件中使用 state 以及其他的 React 特性
貌似现在更多的也是使用函数式组件的了,重要
2.State Hook
import React from 'react'
function Demo(){
//console.log('Demo');
const [count,setCount] = React.useState(0)
//加的回调
function add(){
//setCount(count+1) //第一种写法
setCount(count => count+1 )
}
return (
<div>
<h2>当前求和为:{count}</h2>
<button onClick={add}>点我+1</button>
</div>
)
}
export default Demo
React.useState()可以使得函数式组件也能类似于类式组件使用操作state了
(1). 语法: const [xxx, setXxx] = React.useState(initValue)
(2). useState()说明:
参数: 第一次初始化指定的值在内部作缓存
返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数
(3). setXxx()2种写法:
setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值
3.Effect Hook
(1). Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)
(2). React中的副作用操作:
发ajax请求数据获取
设置订阅 / 启动定时器
手动更改真实DOM
我理解的就是effect hook让函数式组件能在原本没有过的特定的生命周期中执行操作。
语法和说明:
useEffect(() => {
// 在此可以执行任何带副作用操作
return () => { // 在组件卸载前执行
// 在此做一些收尾工作, 比如清除定时器/取消订阅等
}
}, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行
第二个参数不传的话
import React from 'react'
function Demo(){
//console.log('Demo');
const [count,setCount] = React.useState(0)
React.useEffect(()=>{
console.log('###')
// let timer = setInterval(()=>{
// setCount(count => count+1 )
// },1000)
// return ()=>{
// clearInterval(timer)
// }
})
//加的回调
function add(){
//setCount(count+1) //第一种写法
setCount(count => count+1 )
}
return (
<div>
<h2>当前求和为:{count}</h2>
<button onClick={add}>点我+1</button>
</div>
)
}
export default Demo
React.useEffect相当于在第一次更新完成和数据更新的时候会被调用
如果传的是空数组,
相当于只有在第一次更新完成才会触发
如果数组中传了参数,例如例子中的count
React.useEffect相当于在第一次更新完成和数据count更新的时候才会被调用。
其实React.useEffect还有个时期也会执行,在第一个参数中,如果有return一个回调的话
import React from 'react'
import root from '../../index'
function Demo(){
//console.log('Demo');
const [count,setCount] = React.useState(0)
React.useEffect(()=>{
console.log('###')
let timer = setInterval(()=>{
setCount(count => count+1 )
},1000)
return ()=>{
console.log('bbb')
// clearInterval(timer)
}
},[])
//加的回调
function add(){
//setCount(count+1) //第一种写法
setCount(count => count+1 )
}
//卸载组件的回调
function unmount(){
//react17写法
//ReactDOM.unmountComponentAtNode(document.getElementById('root'))
//react18写法
root.unmount(document.getElementById('root'))
}
return (
<div>
<h2>当前求和为:{count}</h2>
<button onClick={add}>点我+1</button>
<button onClick={unmount}>卸载组件</button>
</div>
)
}
export default Demo
可以看到在组件卸载前React.useEffect又被调用了一次。所以,React.useEffect可以看成是componentDidMount(),componentDidUpdate(),componentWillUnmount() 三个函数的组合。有点妙
4.Ref Hook
(1). Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据
(2). 语法: const refContainer = useRef()
(3). 作用:保存标签对象,功能与React.createRef()一样
这个相对简单点
import React from 'react'
function Demo(){
const myRef = React.useRef()
//提示输入的回调
function show(){
alert(myRef.current.value)
}
return (
<div>
<input type="text" ref={myRef}/>
<button onClick={show}>点我提示数据</button>
</div>
)
}
export default Demo