React Hooks 是 React 16.8 版本中新增加的一種特性,它允許在函數組件中使用 state 和其他 React 特性,而無需編寫 class 組件。要實現組件復用,你可以使用以下幾種常見的 Hooks:
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
export default Counter;
在這個例子中,Counter
組件可以被復用,因為它使用了 useState
Hook 來管理狀態。
2. useEffect: 用于在函數組件中處理副作用,如數據獲取、訂閱或手動更改 DOM。
import React, { useState, useEffect } from 'react';
function Example() {
const [data, setData] = useState([]);
useEffect(() => {
fetch('/api/data')
.then(response => response.json())
.then(data => setData(data));
}, []); // 空數組作為依賴項,確保只在組件掛載時運行一次
return (
<ul>
{data.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
}
export default Example;
在這個例子中,Example
組件使用 useEffect
Hook 來獲取數據,并在數據獲取后更新狀態。由于 useEffect
的依賴項數組為空,它只會在組件掛載時運行一次,因此這個組件可以被復用。
3. useContext: 用于在函數組件中訪問 React 上下文。
import React, { createContext, useContext, useState } from 'react';
const ThemeContext = createContext('light');
function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme(theme === 'light' ? 'dark' : 'light');
};
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
}
function ThemedButton() {
const { theme, toggleTheme } = useContext(ThemeContext);
return (
<button style={{ backgroundColor: theme === 'light' ? 'blue' : 'white' }} onClick={toggleTheme}>
Toggle Theme
</button>
);
}
export default function App() {
return (
<ThemeProvider>
<ThemedButton />
</ThemeProvider>
);
}
在這個例子中,ThemeProvider
組件使用 useContext
Hook 來提供主題信息,而 ThemedButton
組件則使用 useContext
來獲取主題信息并切換主題。由于 ThemeProvider
可以包裹任何子組件,因此 ThemedButton
可以在任何地方被復用。
總的來說,React Hooks 提供了一種在函數組件中實現狀態管理、副作用處理和上下文訪問的方法,從而使得組件更易于復用和維護。