Hooks的理解?解决了什么问题?
Hooks让我们的函数组件拥有了类组件的特性,例如组件内的状态、生命周期
- 难以重用和共享组件中的与状态相关的逻辑
- 逻辑复杂的组件难以开发与维护,当我们的组件需要处理多个互不相关的 local state 时,每个生命周期函数中可能会包含着各种互不相关的逻辑在里面
- 类组件中的this增加学习成本,类组件在基于现有工具的优化上存在些许问题
- 由于业务变动,函数组件不得不改为类组件等等
常用的Hooks
- useState:用于在函数组件中声明和使用状态。
- useEffect:用于在函数组件中执行副作用操作,例如:数据获取、订阅、事件监听等。
- useContext:用于在函数组件中使用上下文对象。
- useReducer:类似于 Redux 的 reducer,用于在函数组件中管理组件本地状态。
- useCallback:用于在函数组件中缓存回调函数。
- useMemo:用于在函数组件中缓存计算结果。
- useRef:用于在函数组件中创建可变的引用。通常用于获取子组件或者 DOM 节点的引用。
- useImperativeHandle:用于在函数组件中自定义暴露给父组件的实例值。
- useLayoutEffect:类似于 useEffect,但是会在所有的 DOM 变更之后同步调用 effect。
- useDebugValue:用于在开发者工具中显示自定义 Hook 的标签。
useState
jsx
import React, { useState } from 'react';
function Example() {
// 声明一个叫 "count" 的 state 变量
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
react函数组件中使用useState改变值后立刻获取最新值,我们可以使用useEffect来监听值的变化,或者
import React, { useState } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(prevCount => {
console.log(prevCount); // 这里打印的 prevCount 是旧的值
const newCount = prevCount + 1;
console.log(newCount); // 这里打印的 newCount 是新的值
return newCount;
});
};
return (
<button onClick={handleClick}>
Click me: {count}
</button>
);
}
export default MyComponent;
useEffect
jsx
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// 类似于 componentDidMount 和 componentDidUpdate:
useEffect(() => {
// 使用浏览器的 API 更新页面标题
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}