React 18 中监听数据变化通常涉及使用内置的 Hooks,如 useState
、useEffect
和 useReducer
。对于更复杂的状态管理,还可以结合第三方库如 Redux 或 MobX。下面是这些 Hooks 的具体使用方法示例:
1. useState
useState
是 React 中用于创建状态变量的 Hook。它允许你在函数组件中添加状态,并且每当状态更新时,组件会重新渲染。
import React, { useState } from 'react';
function Counter() {
// 创建一个名为 count 的状态变量,初始值为 0
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
export default Counter;
在这个例子中,每当用户点击按钮时,setCount
函数被调用来更新状态,导致组件重新渲染并显示更新后的计数。
2. useEffect
useEffect
Hook 允许你在函数组件中执行副作用操作(例如数据获取、订阅或手动 DOM 操作)。你可以将它看作是生命周期方法的组合体,比如 componentDidMount
、componentDidUpdate
和 componentWillUnmount
。
import React, { useState, useEffect } from 'react';
function DataFetcher() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(setData)
.finally(() => setLoading(false));
}, []); // 空数组意味着只在组件挂载时运行一次
if (loading) return <p>Loading...</p>;
if (!data) return <p>No data</p>;
return (
<div>
<h1>Data:</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}
export default DataFetcher;
这里,useEffect
被用来在组件挂载后进行一次数据获取,并在数据加载完成后停止加载指示器。
3. useReducer
useReducer
是另一种管理状态的方式,特别适合于处理复杂的状态逻辑。它接收一个 reducer 函数和一个初始状态,并返回当前状态和 dispatch 方法。
import React, { useReducer } from 'react';
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
</>
);
}
export default Counter;
这个例子展示了如何使用 useReducer
来管理一个简单的计数器状态。
4. useRef
虽然 useRef
主要用于直接访问 DOM 节点或保持可变值,但它也可以用于监听某些情况下的变化,特别是当需要跟踪上一次渲染的状态时。
import React, { useRef, useState, useEffect } from 'react';
function FocusInput() {
const inputEl = useRef(null);
const [value, setValue] = useState('');
useEffect(() => {
inputEl.current.focus();
}, []);
return (
<>
<input ref={inputEl} value={value} onChange={(e) => setValue(e.target.value)} />
<p>Current Value: {value}</p>
</>
);
}
export default FocusInput;
这里,useRef
用来引用输入框元素,并在组件挂载后自动聚焦到该输入框。
总结
useState
:用于创建和更新状态。useEffect
:用于处理副作用,如数据获取、订阅或手动 DOM 操作。useReducer
:提供了一种更为复杂的状态管理方式,适用于状态逻辑较为复杂的情况。useRef
:可以用于访问 DOM 节点或保持可变值。
通过这些 Hooks,React 提供了强大的工具来监听和响应数据的变化,使得开发者能够更加灵活地构建动态的 UI。请注意,上述代码中的 fetch
请求仅为演示目的,在实际应用中应该考虑错误处理和请求取消等场景。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~