React18 Hooks【useState、useEffect等】
发布人:shili8
发布时间:2025-02-21 08:13
阅读次数:0
**React18 Hooks**
React18 是 React 的最新版本,它带来了许多新的特性和改进。其中最重要的就是 Hooks,这是一种让你在函数组件中使用状态和其他 React 特性的方式。
### useState Hook`useState` 是最常用的 Hooks之一,它允许你在函数组件中添加状态。
**示例代码**
jsximport { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>计数:{count}</p>
<button onClick={() => setCount(count +1)}>+</button>
</div>
);
}
**注释**
* `useState` 接收一个初始值作为参数,返回一个状态数组 `[state, setState]`。
* `state` 是当前状态的值。
* `setState` 是更新状态的函数。
### useEffect Hook`useEffect` 是另一个常用的 Hooks,它允许你在组件渲染后执行副作用代码,如网络请求或 DOM 操作。
**示例代码**
jsximport { useState, useEffect } from 'react';
function FetchData() {
const [data, setData] = useState(null);
useEffect(() => {
fetch(' /> .then(response => response.json())
.then(data => setData(data));
}, []);
return (
<div>
{data && <p>数据:{JSON.stringify(data)}</p>}
</div>
);
}
**注释**
* `useEffect` 接收一个回调函数作为参数,这个回调函数会在组件渲染后执行。
* 第二个参数是依赖数组,表示这个回调函数的执行依赖于哪些状态或 props 的变化。
### useContext Hook`useContext` 是用于访问 React 上下文的 Hooks。
**示例代码**
jsximport { createContext, useContext } from 'react';
const ThemeContext = createContext();
function App() {
const theme = useContext(ThemeContext);
return (
<div>
<p>主题:{theme}</p>
</div>
);
}
**注释**
* `createContext` 创建一个上下文对象。
* `useContext` 接收这个上下文对象作为参数,返回当前组件的上下文值。
### useReducer Hook`useReducer` 是用于管理状态的 Hooks,它比 `useState` 更灵活和高级。
**示例代码**
jsximport { useReducer } from 'react';
const initialState = {
count:0,
};
function reducer(state, action) {
switch (action.type) {
case 'INCREMENT':
return { ...state, count: state.count +1 };
case 'DECREMENT':
return { ...state, count: state.count -1 };
default:
throw new Error(`未知类型:${action.type}`);
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<div>
<p>计数:{state.count}</p>
<button onClick={() => dispatch({ type: 'INCREMENT' })}>+</button>
<button onClick={() => dispatch({ type: 'DECREMENT' })}>-</button>
</div>
);
}
**注释**
* `useReducer` 接收一个 reducer 函数和初始状态作为参数,返回当前状态和 dispatch 函数。
* `reducer` 函数用于更新状态。
### useCallback Hook`useCallback` 是用于缓存函数的 Hooks,它可以避免每次渲染时都创建新的函数实例。
**示例代码**
jsximport { useState, useCallback } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
setCount(count +1);
}, []);
return (
<div>
<p>计数:{count}</p>
<button onClick={increment}>+</button>
</div>
);
}
**注释**
* `useCallback` 接收一个函数作为参数和依赖数组,返回缓存的函数实例。
### useMemo Hook`useMemo` 是用于缓存计算结果的 Hooks,它可以避免每次渲染时都执行相同的计算。
**示例代码**
jsximport { useState, useMemo } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const doubleCount = useMemo(() => count *2, [count]);
return (
<div>
<p>计数:{count}</p>
<p>双倍计数:{doubleCount}</p>
</div>
);
}
**注释**
* `useMemo` 接收一个计算函数和依赖数组作为参数,返回缓存的计算结果。
### useLayoutEffect Hook`useLayoutEffect` 是用于在组件渲染后执行 DOM 操作或其他布局相关操作的 Hooks,它比 `useEffect` 更早执行。
**示例代码**
jsximport { useState, useLayoutEffect } from 'react';
function Counter() {
const [count, setCount] = useState(0);
useLayoutEffect(() => {
console.log('组件渲染后执行');
}, []);
return (
<div>
<p>计数:{count}</p>
</div>
);
}
**注释**
* `useLayoutEffect` 接收一个回调函数和依赖数组作为参数,返回当前组件的 DOM 节点。
### useImperativeHandle Hook`useImperativeHandle` 是用于暴露组件实例给父组件的 Hooks,它可以让父组件访问子组件的方法或属性。
**示例代码**
jsximport { useState, forwardRef } from 'react';
const MyInput = forwardRef((props, ref) => {
const [value, setValue] = useState('');
useImperativeHandle(ref, () => ({
getValue: () => value,
}));
return (
<input type="text" value={value} onChange={(e) => setValue(e.target.value)} />
);
});
function Parent() {
const inputRef = useRef(null);
return (
<div>
<MyInput ref={inputRef} />
<button onClick={() => console.log(inputRef.current.getValue())}>获取值</button>
</div>
);
}
**注释**
* `useImperativeHandle` 接收一个回调函数和依赖数组作为参数,返回当前组件的实例。
### useDebugValue Hook`useDebugValue` 是用于在 React DevTools 中显示 Hooks 的值的 Hooks,它可以让开发者更好地理解组件的行为。
**示例代码**
jsximport { useState, useDebugValue } from 'react';
function Counter() {
const [count, setCount] = useState(0);
useDebugValue({ count });
return (
<div>
<p>计数:{count}</p>
</div>
);
}
**注释**
* `useDebugValue` 接收一个值作为参数,返回当前组件的值。
以上就是 React18 Hooks 的使用方法和示例代码。通过这些 Hooks,你可以在函数组件中实现状态管理、副作用处理、上下文访问等功能。

