记录一些不经常使用的 hooks
useReducer 过于复杂的更改状态,可以使用 useReducer
interface InitStateValue{
num: number,
hobby: object
}
const initialState : InitStateValue = {
num: 18,
hobby: {
ball: 'football',
eat: 'rice'
}
}
const reducer = (state:InitStateValue, action:{type: string, value?: string}) => {
switch(action.type){
case 'numAdd':
return {...state, num: state.num+1};
case 'changeHobby':
return {...state, hobby: {ball:'football', eat: action.value}}
default:
throw new Error();
}
}
const Index: React.FC = () => {
const[state, dispatch] = useReducer(reducer, initialState)
const onInputChange = (e: React.MouseEvent<HTMLSpanElement>) => {
e.persist()
dispatch({type: 'changeHobby', value: e.target.value})
}
return (
<>
<p>age:{state.num}</p>
{
Object.keys(state.hobby).map(key=>{
return <p>{`${key}:${state.hobby[key]}`}</p>
})
}
<button onClick={() => {dispatch({type: 'numAdd'})}}>add</button>
<input type="text" onChange={(e) => {onInputChange(e)}}/>
</>
);
};
useCallback 和 useMemo 这两个hook可以进行性能优化,使用方法和useEffect有些类似,但是不能处理副作用。
useMemo : 只有count发生改变时,才会重新计算count , num 的改变不会引发 count 的重新计算
const Index: React.FC = () => {
const[count, setCount] = useState(0)
const[num, setNum] = useState(0)
let data = useMemo(() => {
console.log('calculate执行')
return count * 3
},[count])
return (
<>
<p>{data}</p>
<p>num:{num}</p>
<p>count:{count}</p>
<button onClick={() => setNum(num+1)}>num add</button>
<button onClick={() => setCount(count+1)}>count add</button>
</>
);
};
useCallback useCallback的使用方法和useMemo类似,但是useCallback返回的是缓存的函数。
useCallback依赖count, 当count发生改变的时候,会返回一个新的函数,useCallback不依赖num,num发生改变的时候返回的是缓存的旧函数
const Index: React.FC = () => {
const[count, setCount] = useState(0)
const[num, setNum] = useState(0)
let data = useCallback(() => {
console.log('calculate执行')
return count * 3
},[count])
return (
<>
<p>{data}</p>
<p>num:{num}</p>
<p>count:{count}</p>
<button onClick={() => setNum(num+1)}>num add</button>
<button onClick={() => setCount(count+1)}>count add</button>
</>
);
};
useCallback & useMemo 的关系useCallback(fn, deps) === useMemo(() => fn, deps)
useRef 官方文档: https://zh-hans.reactjs.org/docs/hooks-reference.html#useref 可以存储任意javascript值而不仅仅是DOM引用