hooks
目录
useState
|
|
useEffect
|
|
-
useEffect如果第二个参数不写,相当于class中的componentDidMounted和componentDidUpdate
1 2 3useEffect(() => { document.title = `You clicked ${count} times`; }); -
返回一个函数,相当于componentWillUnMounted
1 2 3 4 5 6useEffect(() => { console.log(count) return ()=>{ console.log('离开') } }) -
第二个参数表示要根据哪些状态的改变而去重新渲染,如果为空数组,则无论什么状态改变都不会调用effect
1 2 3 4 5 6useEffect(() => { console.log(count) return ()=>{ console.log('离开') } },[]) -
数组中有哪些值,就会随着这些状态的改变而重新执行副作用
1 2 3 4 5 6useEffect(() => { console.log(count) return ()=>{ console.log('离开') } },[count])//只有count变化了才会调用effect中的函数
useContext
|
|
-
父组件创建context
-
在父组件中包裹子组件
1 2 3<CountContext.Provider value={count}> <Counter/> </CountContext.Provider> -
子组件中使用useContext获取父组件中传递的数据
memo
useMemo
useCallback
记忆函数
useReducer
和useContxt结合可以实现redux的效果,但是不建议使用,使用useDispatch和useSlelector来使用redux
useRef
- 相当于class中的createRef()
|
|
useDispatch
-
用于结合redux使用
-
首先创建redux的store,action,reducer。并在外层容器包裹provider传递store
-
在需要使用dispatch发布action时
1 2 3 4 5 6 7 8 9 10 11 12 13 14import React from 'react' import {useDispatch} from 'react-redux' import {createChangeColorAction} from "./redux/action"; function ChangeColor() { const dispatch = useDispatch() return ( <div> <button onClick={()=>{dispatch(createChangeColorAction('red'))}}>红色</button> <button onClick={()=>{dispatch(createChangeColorAction('blue'))}}>蓝色</button> </div> ) } export default ChangeColor
useSelector
-
需要使用store中的state时
1 2 3 4 5 6 7 8 9 10 11 12import React, {createContext} from 'react' import {useSelector} from "react-redux"; export const ColorContext = createContext({}) export const Color = (props) => { const color = useSelector(state=>state.color) return ( <ColorContext.Provider value={{color}}> {props.children} </ColorContext.Provider> ) }
自定义hooks
- 动态获取浏览器窗口大小的hooks
|
|
-
useDebounce:修改value的更新频率
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15export const useDebounce = (value, delay) => { const [newValue, setNewValue] = useState(value) useEffect(() => { //每次在value变化以后,设置一个定时器 const timer = setTimeout(() => { setNewValue(value) }, 2000) //每次在上一个useEffect处理完以后再运行,第一个effect的timer被第二个effect清理,最后一个无人清理 return () => { clearTimeout(timer) } }, [value, delay]) return newValue }使用
1 2 3 4 5 6 7 8 9const debounceParam= useDebounce(param,1000) //当用户输入关键词或选择select框,param变化 useEffect(() => { fetch(`http://localhost:3000/projects?${qs.stringify(cleanObject(debounceParam))}`).then(async response => { if (response.ok) { setList(await response.json()) } }) }, [debounceParam])