学习目标: 理解 Hooks 的概念及解决的问题
hooks 的本质: 一套能够使函数组件更强大、更灵活的(钩子)
React 体系里组件分为类组件和函数组件
多年使用发现,函数组件是一个更加匹配 React 的设计理念UI = f(date),也更加有利于逻辑拆分与重用的组件表达形式,而先前组件是不可以有自己的状态的。为了让函数组件可以拥有自己的状态,所以从 react v16.8 开始,加入了 hooks
注意点:
useState函数useState函数,并传入状态初始值useState函数的返回值中,拿到状态和修改状态的方法import { useState } from 'react'
function App() {
const [count, setCount] = useState(0)
return (
<div>
<button onClick={() => setCount(count + 1)}>{count}</button>
</div>
)
}
export default App
const [count, setCount] = useState(0) // 解构赋值 useState 返回值是一个数组
学习目标: 能够理解使用 Hooks 之后组件的更新状态
函数组件使用 useState hook 后的执行过程,以及状态值的变化
useState(0)将传入参数作为状态初始值,即:0setCount(count +1)修改状态,因为状态发生改变,所以该组件会重新渲染 2. 组件重新渲染时,会再次执行组件中的代码逻辑 3. 再次调用setCount(0),此时 React 内部会拿到最新的状态值而非初始值 4. 再次渲染组件时获取到的状态 count 值为:1学习目标: 能够记住 useState 的使用规则
useState函数可以执行多次,每次执行互相独立,每调用一次为函数组件提供一个状态function List() {
// 字符串状态值
const [name, setName] = useState('cp')
// 数组状态值
const [list, setList] = useState([])
}
let num = 1
function List() {
num++
if (num / 2 === 0) {
const [name, setName] = useState('cp')
}
const [list, setList] = useState([])
}
// 两个hook的顺序不是固定的,这是不可以的
import { useState } from 'react'
function App() {
const [count, setCount] = useState(0)
const [show, setShow] = useState(false)
const [list, setList] = useState([])
function test() {
setShow(!show)
setList([1, 2, 3, 4])
console.log(show, list)
}
return (
<div>
<button onClick={() => setCount(count + 1)}>count:{count}</button>
<button onClick={test}>
show:{show ? 'true' : 'false'}---list:{list}
</button>
</div>
)
}
export default App
useEffect 函数的作用就是为 React 函数组件提供副作用处理
useEffect函数useEffect函数,并传入回调函数import { useState, useEffect } from 'react'
function App() {
const [count, setCount] = useState(0)
useEffect(() => {
document.title = count
})
return (
<div>
<button onClick={() => setCount(count + 1)}>count:{count}</button>
</div>
)
}
export default App
useEffect(() => {
console.log('副作用执行了')
})
useEffect(() => {
console.log('副作用执行了')
}, [])
import { useState, useEffect } from 'react'
function App() {
const [count, setCount] = useState(0)
const [name, setName] = useState('cp')
useEffect(() => {
console.log('副作用执行了')
document.title = count
}, [count, name])
return (
<div>
<button onClick={() => setCount(count + 1)}>count:{count}</button>
<button onClick={() => setName('hs')}>name:{name}</button>
</div>
)
}
export default App
注意事项: 只要在 useEffect 回调函数中用到的数据(比如,count)就是依赖数据,就应该出现在依赖项数组中,如果不添加依赖项就会有 bug 出现